我正在通过 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:\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 示例
我正在 Python 3.7.3、64 位、Anaconda Distribution、Windows 10 64 位、PISDK 1.3 类型库、PISDK.dll 64 位版本 1.4.6.494 上尝试此操作。