【问题标题】:How to get code-completion for COM programming in PyCharm?如何在 PyCharm 中完成 COM 编程的代码?
【发布时间】:2017-02-16 12:03:49
【问题描述】:
在使用app = win32com.client.Dispatch('Some.Application') 时,有没有可行的方法在 PyCharm 中完成代码?必须从 API 文档中重新输入(或复制粘贴)所有内容是相当乏味的,创建 skeletons 也是如此。有没有其他方法可以让 PyCharm 知道通过 COM 提供的接口,特别是如果我可以提供 .tlb 文件?或者至少有某种方法可以从 TypeLib 中自动生成这样的骨架(或包装模块?)?
【问题讨论】:
标签:
python
pycharm
win32com
code-completion
typelib
【解决方案1】:
由于 PyCharm 无法知道 app 的运行时类型,因此您不应期望直接在 app 上获得代码完成;至少在他们决定为从类型库生成代码添加内置支持之前不会。
但是,您可以利用 win32com 隐式生成基于 the first part of this answer 中描述的类型库的代码这一事实,以及 PyCharm 对类型提示的支持,以在 COM 方法上完成代码。
- 确保 Python 类型已经生成;它们的位置由 COM 对象的 GUID 确定。例如,我机器上的 Microsoft Word 2016 的类型可在
C:\Users\username\appdata\local\temp\gen_py\3.6\00020905-0000-0000-c000-000000000046x0x8x7\。
- 将此文件夹添加到 PyCharm Python 解释器的路径中;参见例如this answer.
- 导入要完成代码的模块。
在下面的屏幕截图中,我们将这种方法与 Word 的 Find 一起使用:
现在,除了感觉很脏之外,这种方法依赖于已经生成的相关类型,并且代码完成仅限于对象发布的方法,所以我想它在实践中的用处可能会受到一定的限制;特别是,任何处理代码的人都必须生成代码,否则注释将导致NameErrors。就个人而言,我可能更喜欢将 Jupyter 用于实施过程的探索性部分,并且通过 the answer mentioned above 中概述的最小调整,Jupyter 可以扩展为使用 win32com 完成完整的代码。