【问题标题】:List all methods in COMobject列出 COMobject 中的所有方法
【发布时间】:2023-04-09 23:14:01
【问题描述】:

有可能吗?

以下内容:

import win32com.client
ProgID = "someProgramID"
com_object = win32com.client.Dispatch(ProgID)

for methods in com_object:
    print methods

我收到了com_object.__dict__,其中列出了:

[_oleobj_, _lazydata_, _olerepr_, _unicode_to_string_, _enum_, _username_, _mapCachedItems_, _builtMethods_]

大部分都是空的,除了:

  • _oleobj_ (PyIDispatch)
  • _lazydata_ (PyITypeInfo)
  • _olerepr_(LazyDispatchItem 实例)
  • _username_ (<unknown>)

但我不知道如何访问这些类型的任何内容。

【问题讨论】:

    标签: python methods win32com


    【解决方案1】:

    对于那些发现the accepted answer 不起作用的人(查看here 的原因) - 仍然有一种方法可以获取具有_prop_map_get_ 属性的对象(一个将对象的字段作为键保存的字典)。您只需使用win32com.client.gencache.EnsureDispatch() 创建主应用程序对象。

    这是我编写的一个便利函数,它列出了以这种方式创建的传递的 COM 对象的字段和方法:

    from inspect import getmembers
    
    
    def print_members(obj, obj_name="placeholder_name"):
        """Print members of given COM object"""
        try:
            fields = list(obj._prop_map_get_.keys())
        except AttributeError:
            print("Object has no attribute '_prop_map_get_'")
            print("Check if the initial COM object was created with"
                  "'win32com.client.gencache.EnsureDispatch()'")
            raise
        methods = [m[0] for m in getmembers(obj) if (not m[0].startswith("_")
                                                     and "clsid" not in m[0].lower())]
    
        if len(fields) + len(methods) > 0:
            print("Members of '{}' ({}):".format(obj_name, obj))
        else:
            raise ValueError("Object has no members to print")
    
        print("\tFields:")
        if fields:
            for field in fields:
                print(f"\t\t{field}")
        else:
            print("\t\tObject has no fields to print")
    
        print("\tMethods:")
        if methods:
            for method in methods:
                print(f"\t\t{method}")
        else:
            print("\t\tObject has no methods to print")
    

    对于使用win32com.client.gencache.EnsureDispatch("Excel.Application") 创建的 Excel 对象,其输出为:

    Members of 'Excel.Application' (Microsoft Excel):
        Fields:
            ActiveCell
            ActiveChart
            ActiveDialog
            ActiveEncryptionSession
            ...
            Workbooks
            WorksheetFunction
            Worksheets
            _Default
        Methods:
            ActivateMicrosoftApp
            AddChartAutoFormat
            AddCustomList
            Calculate
            ...
            Union
            Volatile
            Wait
    

    【讨论】:

    • 这在 Python 2.7 上对我有用 - 我只需要更改 print 语句中的 {method} 语法以使其兼容。
    • 这是一个很好的答案,但请注意,这仅适用于应用程序对象。如果您想要更多对象并坚持使用win32com.client.Dispatch(ProgID) 方法,那么您必须运行在win32com\client\makepy.py 找到的makepy.py 文件,将打开一个对话框,选择适当的库。在pythonstudio.us/introduction-2/… 上查看更多信息。它以 In order to generate the Python files that support a specific COM object, 开头的段落。如果你这样做了,那么你现在可以使用dir() 并浏览所有道具和方法
    • 所有方法都将在dir() 下列出,然后r/w 属性在_prop_mat_put_ 下列出,只读属性在_prop_map_get_ 下列出。
    • 这个方法对我有用。有没有办法打印方法的签名(参数类型和数字,返回类型)?
    【解决方案2】:

    刚刚找到了大部分方法的获取方法:

    方法如下:

    import win32com.client
    import pythoncom
    
    ProgID = "someProgramID"
    com_object = win32com.client.Dispatch(ProgID)
    
    for key in dir(com_object):
        method = getattr(com_object,key)
        if str(type(method)) == "<type 'instance'>":
            print key
            for sub_method in dir(method):
                if not sub_method.startswith("_") and not "clsid" in sub_method.lower():
                    print "\t"+sub_method
        else:
            print "\t",method
    

    这是ProgID = "Foobar2000.Application.0.7"的示例输出

    输出:

    Playlists
        Add
        GetSortedTracks
        GetTracks
        Item
        Load
        Move
        Remove
        Save
    Name
        foobar2000 v1.1.13
    ApplicationPath
        C:\Program Files (x86)\foobar2000\foobar2000.exe
    MediaLibrary
        GetSortedTracks
        GetTracks
        Rescan
    Minimized
        True
    Playback
        FormatTitle
        FormatTitleEx
        Next
        Pause
        Previous
        Random
        Seek
        SeekRelative
        Start
        Stop
    ProfilePath
        file://C:\Users\user\AppData\Roaming\foobar2000
    

    【讨论】:

    • 我用Excel.Application 作为ProgId 尝试了这段代码,但它在Python 3.3 上似乎不起作用(没有属性_prop_map_get_)。
    • 您是否知道列出所有可用“程序 ID”的方法?我正在尝试用 python 运行一个微软程序,但我不知道它是否有一个 COM 对象
    • 有人在 Python3 中找到了这样做的方法吗?
    【解决方案3】:

    要列出对象的属性,您可以使用 dir() 函数。这是python的内置函数,不需要导入。试试类似:

    打印目录(对象)

    查看对象的属性。

    【讨论】:

    • 它不适用于 com 对象。它列出了一些东西,但我知道还有一些没有显示。