也许在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.IPCompleter
。IPython.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
。