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

Jua*_*ssa 8 python win32com

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

我以下面的方式使用了一个名为WEAP的程序

import win32com.client
win32com.client.Dispatch("WEAP.WEAPApplication")
Run Code Online (Sandbox Code Playgroud)

现在,我想在Excel中使用它并找到以前行的替代方法,其中之一如下(取自Python:使用Win32 COM Api打开Excel工作簿)

import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
Run Code Online (Sandbox Code Playgroud)

有谁知道使用之间的区别

win32.Dispatch 
Run Code Online (Sandbox Code Playgroud)

win32.gencache.EnsureDispatch
Run Code Online (Sandbox Code Playgroud)

和其他替代品?有谁知道每个人的利弊?关于何时应该使用一个或另一个的一些建议?

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

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之间差异的大局,以及可能的其他替代方案,这就是我想要的.

任何建议将不胜感激.

Ben*_*n.T 14

你需要阅读的一件事是这个链接.

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

当您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>
Run Code Online (Sandbox Code Playgroud)

然后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>
Run Code Online (Sandbox Code Playgroud)

首先,你可以看到输出上的差异然后如果我这样做,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()像往常一样,它总是返回MakePy支持COM对象的包装器.

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

总结一下这个.

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


svk*_*lev 11

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