python - 如何在 IPython 中完成 win32com 代码?

标签 python autocomplete ipython win32com

通过

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

enter image description here

enter image description here

长篇小说

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 中为已发布的方法获得代码完成:

enter image description here

但是请注意,虽然这确实为方法提供了代码补全,但对于属性却不是这样。可以使用 _prop_map_get_ 检查那些属性。例如,wordapp.Selection.Range.Font._prop_map_get_给出字体的所有可用属性。

如果使用 IPython 不是一个强烈的要求,另请注意 PythonWin shell(位于 \pkgs\pywin32\Lib\site-packages\pythonwin\Pythonwin.exe 附近)具有对属性和方法的内置代码完成支持。

enter image description here

这本身就表明在 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/

相关文章:

python - Django:icontains 大小写对 unicode 敏感

python - Pyqt5 - 网格布局行为不当

python - 跨多个站点共享表

html - 是否可以更改 HTML 5 Datalist 自动完成行为?

javascript - 如何在 jQuery UI 自动完成中的过滤结果中实现我自己的规则

python - iPython - Debug模式下的库函数帮助

python - 使用 nltk 从德语文本中提取单词

autocomplete - Intellij IDEA自动显示javadoc

python - 如何检查 IPython 中的一个特定对象

python - IPython Notebook 中的 SQLAlchemy + SQLite 锁定