不带类型库的python IDispatch客户端

不带类型库的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)

我正在尝试与Python一起使用一个COM服务器,它只公开IDispatch接口,没有IDL文件和类型库。我有不同方法的文档以及如何使用它们

尝试使用win32com包对我来说失败了,因为似乎当没有可用的类型信息时,win32com会回退到假定任何属性访问都是property get或set,而不是方法调用

也就是说,当我执行以下操作时:

  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。