win32com和IPICalculation辅助接口

问题描述 投票:0回答:1

我正在通过win32com与OSISoft的PISDK建立接口。我正在尝试使用one of IPICalculation's functions,但是由于IPICalculation是辅助接口,因此在使其正常工作时遇到了问题。

到目前为止,我的是:

from win32com.client import Dispatch, CastTo
from win32com.client.gencache import EnsureModule

tagname = 'sometag'
pisdk = Dispatch('PISDK.PISDK')
pisdk2 = EnsureModule('{0EE075CE-8C31-11D1-BD73-0060B0290178}',
                      0, 1, 1, bForDemand=False)
pi_server = pisdk.Servers.DefaultServer
tag_pipoint = pi_server.PIPoints(tagname)
# Using secondary interface IPIData2 works:
data = CastTo(tag_pipoint.Data, 'IPIData2')
# However, trying to use IPICalculation doesn't work:
server = CastTo(pi_server, 'IPICalculation')
# Traceback (most recent call last):
# ...
#  File "C:\Users\MyUser\AppData\Local\Temp\gen_py\3.7\0EE075CE-8C31-11D1-BD73-0060B0290178x0x1x1\IPICalculation.py", line 49, in <module>
#    win32com.client.CLSIDToClass.RegisterCLSID( "{F293A835-D998-11D3-853F-00C04F45D1DA}", IPICalculation )
# NameError: name 'IPICalculation' is not defined

快速查看受影响的生成文件(在%LOCALAPPDATA%\Temp\gen_py中)显示,尽管IPIData2.py文件声明了IPIData2类,但IPICalculation.py文件中没有等效的文件。

对我来说,这似乎是win32com和makepy中的错误,但我不太确定。

我也通过网络进行了挖掘,找到了另一种方法来完成此任务,但也失败了:

import pythoncom
iface = pi_server._oleobj_.QueryInterface(pythoncom.IID_IDispatch)
CastTo(iface, 'IPICalculation')  # Fails

[其他说明:

  • 我也尝试过在类型库中运行makepy
  • 我尝试了EnsureDispatch,但没有成功
  • 可以找到使用IPICalculation接口的VBA示例here

我正在Python 3.7.3、64位,Anaconda发行版,Windows 10 64位,PIDSK 1.3类型库,PIDSK.dll 64位版本1.4.6.494上尝试此。

python com win32com osisoft
1个回答
0
投票

Caveat:这并不是一个真正的答案,因为它不愿将win32com换成comtypes,我不想这样做,因为我的代码已经完成了很多win32com的工作,而我却没有想要移植所有内容,也不想将两者都作为依赖项。

但是,它可以工作,我留给那些想要一个可行解决方案的人。

import comtypes
import comtypes.client

ctsdk = comtypes.client.CreateObject("PISDK.PISDK")
ctpisdk2 = comtypes.gen._0EE075CE_8C31_11D1_BD73_0060B0290178_0_1_1
ctserver = ctsdk.Servers.DefaultServer
ctipicalc = ctserver.QueryInterface(ctpisdk2.IPICalculation)  # This works, so I can proceed:
print(ctipicalc.TimedCalculate(['*'], "'%s'" % tagname)[1].Value)
© www.soinside.com 2019 - 2024. All rights reserved.