win32.Dispatch与Python中的win32.gencache。有什么优点和缺点?

时间:2018-05-02 05:55:21

标签: python win32com

我最近使用python的win32com.client作为Windows应用程序的API,但我很难理解一些基本的东西。

我一直在使用一个名为WEAP的程序,以下列方式

import win32com.client
win32com.client.Dispatch("WEAP.WEAPApplication")

现在,我想在Excel中使用它并找到前面几行的替代品,其中一个如下(取自Python: Open Excel Workbook using Win32 COM Api

import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')

有没有人知道使用

之间的区别
win32.Dispatch 

win32.gencache.EnsureDispatch

和其他替代方案?有谁知道每个人的利弊?关于什么时候应该使用的一些建议?

我寻求建议,我找到了一些有用的答案,例如:

Python: Open Excel Workbook using Win32 COM Api

win32com.client.Dispatch works but not win32com.client.gencache.EnsureDispatch

http://pythonexcels.com/python-excel-mini-cookbook/

https://mail.python.org/pipermail/python-win32/2011-August/011738.html

然而,他们通常专注于回答特定问题,而不是描述Dispatch,gencache.EnsureDispatch之间差异的大局,以及可能还有其他选择,这就是我想要的。

非常感谢任何建议。

2 个答案:

答案 0 :(得分:10)

您需要阅读的一件事是this link

我会尽快回答(最后还没那么简短......)你的问题,但我不是专家。

使用python创建COM对象时,python如何知道此对象可用的方法和参数?这与早期晚期绑定的概念有关。

如果您尝试使用COM之前从未使用过的Dispatch对象,则无法知道对象的可用对象。如果我在Jupyter QtConsole中做:

import win32com.client as win32
xl_dis = win32.Dispatch("Excel.Application")
xl_dis
Out[3]: <COMObject Excel.Application>

然后考虑xl_dis.以了解我之后可以做什么,我将无法做出任何选择。我是在后期绑定的情况下,“python不知道对象可以做什么”。

如果我对EnsureDispatch做同样的事情:

import win32com.client as win32
xl_ens = win32.gencache.EnsureDispatch("Excel.Application")
xl_ens
Out[3]: <win32com.gen_py.Microsoft Excel 14.0 Object Library._Application instance at 0x35671240>

首先,您可以看到输出上的差异然后如果我xl_ens.我会得到一些方法和参数。我现在处于早期绑定并且“python知道对象可以做什么”。

EnsureDispatch强制首先运行makepy.py(查看您的文件夹Lib\site-packages\win32com\client)以在Lib\site-packages\win32com\gen_py中创建包含python脚本的文件夹,其中包含一些方法和与此COM对象相关的参数。

现在,如果您使用Dispatch在新控制台中再次尝试,您将获得完全相同的结果。实际上,在使用EnsureDispatch之后,在win32com\gen_py之前创建的文件夹仍然存在,而“python仍然知道对象可以做什么”。要自己试验一下,请转到您的文件夹\win32com\gen_py并删除包含Excel信息的文件夹(对我而言,名称为00020813-0000-0000-C000-000000000046x0x1x7,不确定它是否与您相同)。

最后,两者之间的一个区别主要是在第一次创建COM对象时强制或不强制早期绑定,但是如果与COM对象相关的文件夹已存在于{{1然后没什么区别。

我给出的链接的这两句话:

“要强制使用早期绑定来访问COM对象,必须在代码中强制使用MakePy进程。一旦确保存在MakePy支持,请像往常一样使用win32com.client.Dispatch()。始终返回COM对象的MakePy支持的包装器。

要强制MakePy进程,请使用win32com.client.gencache模块。此模块包含管理MakePy生成的源文件目录的代码:生成的缓存或gencache。此模块中有许多有用的功能,如果您需要对这些生成的文件进行高级管理,建议您浏览源文件。“

总结这个。

另一种方法是使用\win32com\gen_pydynamic,并且在后期绑定中始终会获得win32.dynamic.Dispatch("Excel.Application")个对象。

答案 1 :(得分:-1)

生成的缓存的位置可能在USER_PROFILE \ AppData \ Local \ Temp \ gen_py \ PYTHON_VERSION \中。如果要清除缓存,这可能很有用。