【问题标题】:win32.Dispatch vs win32.gencache in Python. What are the pros and cons?Python 中的 win32.Dispatch 与 win32.gencache。优缺点都有什么?
【发布时间】:2023-03-15 18:17:02
【问题描述】:

我最近一直在使用来自 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 以及可能是我想要的其他替代方案之间差异的更大图景。

任何建议将不胜感激。

【问题讨论】:

    标签: python win32com


    【解决方案1】:

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

    我会尽快回答您的问题(最后不会这么短......),但我不是专家。

    当你用python创建COM对象时,python如何知道这个对象有哪些方法和参数可用?这与 earlylate 绑定的概念有关。

    如果您尝试使用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 中创建一个文件夹,其中包含带有与此COM 对象相关的一些方法和参数的python 脚本.

    现在,如果您在新控制台中使用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 对象。

    【讨论】:

    • 非常感谢您的回答和链接。我仍然需要学习很多东西,但这作为一个起点非常有用!
    【解决方案2】:

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

    【讨论】:

      最近更新 更多