通过
import win32com.client
wordapp = win32com.client.gencache.EnsureDispatch('Word.Application')
我可以获得文档化的 Word Application
对象,例如here .然而,ipython
的自动补全并不知道该 API,有没有办法添加它?
最佳答案
快速解决方案
也许在 IPython 和 Jupyter 中实现代码完成的最简单方法(使用 6.2.1 进行测试,请参阅 the answer below 以获取适用于 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
长篇小说
this guide 中概述了更多详细信息, win32com
附带一个脚本,makepy.py
用于生成与给定 COM 对象的类型库相对应的 Python 类型。
如果是 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
将自动使用生成的类型,而不是原始的 IPyDispatch
,此时,自动完成可以在例如IPython 或 Jupyter,假设感兴趣的 COM 对象实际上发布了其可用的属性和方法(这不是必需的)。
现在,在您的情况下,通过调用 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
处理。 .用于添加自定义代码完成器的 API 由 IPython.utils.generics.complete_object
提供,如上面第一个解决方案所示。一个陷阱是 complete_object
基于 simplegeneric
, 只能为任何给定类型提供一个完成者。幸运的是,makepy
生成的所有类型将从 win32com.client.DispatchBaseClass
继承.
如果这最终成为一个问题,也可以规避 complete_object
通过将以下五行添加到 core.completer.Completion.attr_matches
来完全简单地手动修补 IPython :
try:
ole_props = set(obj._prop_map_get_).union(set(obj._prop_map_put_))
words += list(ole_props)
except AttributeError:
pass
相反,IPython bases its code-completion on __dir__
, 所以也可以修补 gencache
,这是代码生成最终发生的地方,包括喜欢的东西
def __dir__(self):
return list(set(self._prop_map_get_).union(set(self._prop_map_put_)))
到每个生成的DispatchBaseClass
.
关于python - 如何在 IPython 中完成 win32com 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26990655/