如何在IPython中完成win32com代码?

如何在IPython中完成win32com代码?,第1张

如何在IPython中完成win32com代码? 快速解决方案

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

from IPython.utils.generics import complete_objectimport 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:UsersusernameAppDataLocalContinuumAnaconda3pkgspywin32-221-py36h9c10281_0Libsite-packageswin32comclient>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 pre 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(位于周围

pkgspywin32Libsite-packagespythonwinPythonwin.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



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5617199.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存