不带类型库的python IDispatch客户端
我正在尝试与Python一起使用一个COM服务器,它只公开IDispatch接口,没有IDL文件和类型库。我有不同方法的文档以及如何使用它们 尝试使用win32com包对我来说失败了,因为似乎当没有可用的类型信息时,win32com会回退到假定任何属性访问都是property get或set,而不是方法调用 也就是说,当我执行以下操作时:不带类型库的python IDispatch客户端,python,automation,win32com,idispatch,typelib,Python,Automation,Win32com,Idispatch,Typelib,我正在尝试与Python一起使用一个COM服务器,它只公开IDispatch接口,没有IDL文件和类型库。我有不同方法的文档以及如何使用它们 尝试使用win32com包对我来说失败了,因为似乎当没有可用的类型信息时,win32com会回退到假定任何属性访问都是property get或set,而不是方法调用 也就是说,当我执行以下操作时: import win32com.client c = win32com.client.GetActiveObject(server_progid)
import win32com.client
c = win32com.client.GetActiveObject(server_progid)
c.someServerMethod(arg1, arg2)
win32com尝试获取服务器上的someServerMethod属性,完全忽略arg1、arg2。深入研究代码似乎是因为python正在调用self.\uu getattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu没有arg1,arg2
我正在寻找解决这个问题的方法:
一些语法告诉win32com我实际上在调用一个方法;
实际实现此行为的其他python COM客户端;
其他建议,除了明显的“手动将文档转换为类型库”之外。
谢谢 您应该能够使用
c._make_method_("someServerMethod")
告诉win32com将其视为方法而不是属性。我目前正在实施的一个可能的解决方案是使用代理来包装win32com.client的用法,该代理使用某种逻辑为每次方法调用调用调用_make_method。使用代码配方,我将每个属性都改为方法,而不是以get_u或set_u开头。只是一个示例,任何允许从方法中区分属性的启发式方法都可以
import new
from types import MethodType
class Proxy(object):
def __init__(self, target):
self._target = target
def __getattr__(self, aname):
target = self._target
### Beginning of special logic ###
if aname[:4]!='set_' and aname[:4]!='get_':
### End of special logic ###
# Rebind the method to the target.
return new.instancemethod(f.im_func, self, target.__class__)
else:
return f
这是真的,但在使用任何方法之前,我都需要这样做;因此,我的python客户端代码看起来很糟糕,不是吗?它并没有那么难看。我通常做的是在创建对象后直接调用make_方法,并用注释解释为什么需要这样做。您的代码似乎缺少f的定义,在链接的配方中是f=getattrtarget,aname。