![](/img/trans.png)
[英]What is stopping win32.Dispatch() from opening Microsoft Office programs?
[英]win32.Dispatch vs win32.gencache in Python. What are the pros and cons?
我最近一直在使用 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 和其他替代方案之间差异的更大图景,这正是我想要的。
任何建议将不胜感激。
你需要阅读的一件事是这个链接。
我会尽快回答(最后不会那么短......)你的问题,但我不是专家。
用python创建COM
对象时,python怎么知道这个对象有哪些方法和参数? 这与早期和晚期绑定的概念有关。
如果您尝试使用Dispatch
创建一个您以前从未使用过的COM
对象,您将不知道您的对象可以使用什么。 如果我在 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
对象相关的文件夹已经存在于\\win32com\\gen_py
,则没有太大区别。
我给的链接的这两句话:
要强制使用早期绑定来访问 COM 对象,您必须在代码中强制使用 MakePy 过程。 确保存在 MakePy 支持后,照常使用 win32com.client.Dispatch()。 它始终为您的 COM 对象返回 MakePy 支持的包装器。
为了强制 MakePy 进程,使用了 win32com.client.gencache 模块。 该模块包含管理 MakePy 生成的源文件目录的代码:生成的缓存或 gencache。 该模块中有许多有用的功能,如果您需要对这些生成的文件进行高级管理,建议您浏览源文件。
有点总结这个。
另一种选择是使用dynamic
例如win32.dynamic.Dispatch("Excel.Application")
并且您将始终在后期绑定中获得COM
对象。
生成的缓存的位置可能在 USER_PROFILE\\AppData\\Local\\Temp\\gen_py\\PYTHON_VERSION\\ 中。 如果想要清除缓存,这会很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.