您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何在IPython中完成win32com代码?

如何在IPython中完成win32com代码?

也许在IPython中完成代码完成的最简单方法(已通过6.2.1测试,请参见下面的答案以获取与7.1兼容的代码段),而Jupyter则是运行以下代码段:

from IPython.utils.generics import complete_object
import win32com.client

@complete_object.when_type(win32com.client.DispatchBaseClass)
def complete_dispatch_base_class(obj, prev_completions):
    try:
        ole_props = set(obj._prop_map_get_).union(set(obj._prop_map_put_))
        return list(ole_props) + prev_completions
    except AttributeError:
        pass

随着被概述了一些更多的细节本指南win32com附带一个脚本,makepy.py用于产生Python类型对应于一个给定的COM对象的类型库。

对于Word 2016,我们将按以下步骤进行:

C:\Users\username\AppData\Local\Continuum\Anaconda3\pkgs\pywin32-221-py36h9c10281_0\Lib\site-packages\win32com\client>python makepy.py -i "Microsoft Word 16.0 Object Library"

Microsoft Word 16.0 Object Library
 {00020905-0000-0000-C000-000000000046}, lcid=0, major=8, minor=7
 >>> # Use these commands in Python code to auto generate .py support
 >>> from win32com.client import gencache
 >>> gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}', 0, 8, 7)

makepy.py当然,遗嘱的位置取决于您的Python发行版本。该脚本combrowse.py位于同一目录中,可用于查找可用类型库的名称

有了这个位置,win32com.client它将自动使用生成的类型,而不是raw类型,IPyDispatch并且,此时,如果感兴趣的COM对象实际上发布了其可用的属性方法,则可以在IPython或Jupyter中使用自动完成功能(这不是必需的)。

现在,在您的情况下,通过调用EnsureDispatch而不是Dispatch,该makepy过程的一部分将自动执行,因此您确实应该能够在IPython中获得已发布方法代码完成:

在此处输入图片说明

但是请注意,尽管这确实为方法提供了代码完成功能,但对于属性而言却并非如此。可以使用_prop_map_get_属性检查那些对象。例如,wordapp.Selection.Range.Font._prop_map_get_提供字体上所有可用的属性

如果对IPython的要求不高,还请注意PythonWin shell(位于周围\pkgs\pywin32\Lib\site- packages\pythonwin\Pythonwin.exe)具有对属性方法的内置代码完成支持

在此处输入图片说明

就其本身而言,这表明在IPython中也可以实现相同的目的。

具体而言,_prop_map_get_可以在中找到依赖于自动完成的逻辑scintilla.view.CScintillaView._AutoComplete。另一方面,IPython 6.2.1中的代码完成由处理core.completer.IPCompleterIPython.utils.generics.complete_object如上第一个解决方案所示,用于添加自定义代码完成程序的API由提供。一个陷阱是,complete_object基于simplegeneric,对于任何给定类型只能提供一个完成程序。幸运的是,由生成的所有类型makepy都将继承自win32com.client.DispatchBaseClass

如果事实证明这是一个问题,则还可以complete_object通过添加以下五行到core.completer.Completion.attr_matches

try:
    ole_props = set(obj._prop_map_get_).union(set(obj._prop_map_put_))
    words += list(ole_props)
except AttributeError:
    pass

相反,IPython将其代码__dir__补全基于,因此也可以修补gencache,这是代码生成最终发生的地方,其中包含了一些喜欢的内容

def __dir__(self):
    return list(set(self._prop_map_get_).union(set(self._prop_map_put_)))

到每个生成DispatchBaseClass

python 2022/1/1 18:32:24 有212人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶