繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM