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

胡安·奥萨(Juan Ossa):

我最近一直在使用来自python的win32com.client作为Windows应用程序的API,但正在努力了解一些基本知识。

我一直通过以下方式将其用于名为WEAP的程序中

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

现在,我想将其与Excel一起使用,并找到了前几行的替代方法,其中的替代方法如下(摘自Python:使用Win32 COM Api打开Excel工作簿

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

有谁知道使用之间的区别

win32.Dispatch 

win32.gencache.EnsureDispatch

和其他选择?有谁知道每个人的利弊?或有关何时应使用一个或另一个的一些建议?

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

Python:使用Win32 COM Api打开Excel工作簿

win32com.client.Dispatch有效,但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以及其他替代方案(我想要的)之间更大的区别。

任何建议将不胜感激。

我想要一片T骨牛排 :

您需要阅读的一件事是此链接

我会尽力回答您的问题(最后一点不会这么短……),但我不是专家。

COM使用python 创建对象时,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(在您的folder中查看Lib\site-packages\win32com\client)以创建一个Lib\site-packages\win32com\gen_py包含python脚本的文件夹,其中包含与此COM对象相关的一些方法和参数

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

最后,两者之间的主要区别在于第一次创建COM对象时是否强制早期绑定,但是如果与COM对象相关的文件夹已经存在\win32com\gen_py,则差别不大。

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

要强制使用早期绑定来访问COM对象,必须在代码中强制执行MakePy进程。确保存在MakePy支持后,照常使用win32com.client.Dispatch()。它总是为您的COM对象返回MakePy支持的包装器。

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

总结一下。

另一种选择是使用dynamic诸如win32.dynamic.Dispatch("Excel.Application")这样,您将始终COM在后期绑定中获得对象。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章