当前位置: 首页 > 面试题库 >

如何在IPython中完成win32com代码?

吕向荣
2023-03-14
问题内容

通过

import win32com.client
wordapp = win32com.client.gencache.EnsureDispatch('Word.Application')

我可以在此处找到记录的WordApplication对象。但是,的自动补全功能不知道该API,是否可以添加它?ipython


问题答案:

也许在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.IPCompleterIPython.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



 类似资料:
  • 许多python IDE都标榜提供代码完整性(代码洞察力),PyCharm就是其中之一。然而,在我看来,提供的代码完成是极其有限的。让我举一个例子来说明: 在“m.”之后按 CTRL 空格不会给我任何代码完成,无论我;)用力敲它。我想这是因为 IDE 必须进行类型推断才能知道变量“m”的类型,这在动态编程语言领域并非易事。 现在,PyCharm附带了一个名为“收集运行时类型信息以进行代码洞察”的设

  • 问题内容: 我想在Eclipse上完成Opencv 2.3的源代码完成工作。我怎样才能做到这一点?程序可以正常运行,但是显示完成[ctrl + space]:“无默认建议”。 问题答案: 对于C / C ++: 在Eclipse中使用CDT 在项目的根目录中,创建项目的Makefile: cmake -G’Eclipse CDT4-Unix Makefiles’ 使用 Eclipse- > Fil

  • 问题内容: 我已经弄清楚了如何抑制大型代码块出现在最终的NB转换(PDF)输出中。 通过将LaTex命令放在“我不想在最终输出中包含的代码之前的原始单元格中 最后在原始单元格中跟随此操作 但是,当我需要显示图形之类的东西时,这仍然给我留下一些难看的代码,而笔记本的基本目的是显示带有结果的代码,有时对于非技术人员来说,我们只需要输出即可。任何想法吗? 如果有人受到启发,这有点相关..以任何方式在ma

  • 问题内容: 我想分享一些Python代码示例,如果在终端Python / IPython或IPython笔记本中执行,则应该做一些不同的事情。 如何检查我的Python代码是否在IPython笔记本中运行? 问题答案: 问题是您想以不同的方式执行什么。 我们在IPython中尽力防止内核知道连接到哪种前端,实际上,您甚至可以同时将内核连接到许多不同的前端。即使您可以窥视一下是否知道您是否在ZMQ内

  • 问题内容: 我在函数中创建一个图形,例如 稍后我要放大该图: 如何以程序方式放大bokeh? 问题答案: 一种方法是在创建图形时可以使用简单的元组进行操作: 但您也可以直接设置已创建图形的和属性。(我一直在寻找类似的东西或从matplotlib寻找东西。)

  • 问题内容: 在Linux终端中,当一个命令的输出太长而无法在一页中读取时,我可以这样做: 这样我就可以读取cat文件的输出并上下滚动。 如何在IPython中执行此操作? 例如,我尝试了一下,但没有成功: 我最初的问题是通过Shift + Page Up不能看到来自的输出,并且我不想更改滚动缓冲区。 问题答案: 在IPython中,您可以使用标准的寻呼机(通常是)来显示对象。另外,您可以增加终端的