我正在通过win32com开发OSISoft的PISDK接口。我正在尝试使用 IPICalculation 的一个函数,但由于 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:UsersMyUserAppDataLocalTempgen_py3.7 EE075CE-8C31-11D1-BD73-0060B0290178x0x1x1IPICalculation.py", line 49, in <module>
# win32com.client.CLSIDToClass.RegisterCLSID( "{F293A835-D998-11D3-853F-00C04F45D1DA}", IPICalculation )
# NameError: name 'IPICalculation' is not defined
快速浏览受影响的生成文件(%LOCALAPPDATA%Tempgen_py
(会发现,虽然IPIData2.py
文件声明了IPIData2
类,但IPICalculation.py
文件中没有等效文件。
对我来说,这似乎是win32com和makepy中的一个错误,但我不太确定。
我也在网上挖掘并找到了另一种方法来做到这一点,但同样失败了:
import pythoncom
iface = pi_server._oleobj_.QueryInterface(pythoncom.IID_IDispatch)
CastTo(iface, 'IPICalculation') # Fails
其他旁注:
- 我也尝试过在类型库中运行 makepy
- 我试过
EnsureDispatch
但没有成功 - 可以找到使用 IPIC 计算接口的 VBA 示例 这里
我正在Python 3.7.3,64位,Anaconda Distribution,Windows 10 64位,PISDK 1.3类型库,PISDK.dll 64位版本1.4.6.494上尝试这个。
警告:这不是一个真正的答案,因为它放弃了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)