python-win32com excel com模型开始生成错误

Chr*_*ris 1 python excel win32com

在过去的几天里,我一直在为一些报告自动生成一些数据透视表。

归结为最低限度,以下代码可以正常工作:

import win32com.client    
objExcelApp = win32com.client.gencache.EnsureDispatch('Excel.Application')
objExcelApp.Visible = 1
Run Code Online (Sandbox Code Playgroud)

这将弹出一个excel实例,我可以继续使用Python工作。但是突然之间,今天我的脚本因以下原因而失败:

>>>import win32com.client
>>> objExcelApp = win32com.client.gencache.EnsureDispatch('Excel.Application')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 534, in EnsureDispatch
    mod = EnsureModule(tla[0], tla[1], tla[3], tla[4], bForDemand=bForDemand)
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 391, in EnsureModule
    module = GetModuleForTypelib(typelibCLSID, lcid, major, minor)
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 266, in GetModuleForTypelib
    AddModuleToCache(typelibCLSID, lcid, major, minor)
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 552, in AddModuleToCache
    dict = mod.CLSIDToClassMap
AttributeError: module 'win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x9' has no attribute 'CLSIDToClassMap'
Run Code Online (Sandbox Code Playgroud)

该代码从昨天到今天都没有改变。我不知道发生了什么!

另一个有趣的踢球者。如果我再次在同一会话中执行相同的代码,则会收到不同的错误:

>>> objExcelApp = win32com.client.gencache.EnsureDispatch('Excel.Application')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 534, in EnsureDispatch
    mod = EnsureModule(tla[0], tla[1], tla[3], tla[4], bForDemand=bForDemand)
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 447, in EnsureModule
    if module.MinorVersion != tlbAttributes[4] or genpy.makepy_version != module.makepy_version:
AttributeError: module 'win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x9' has no attribute 'MinorVersion'
>>>
Run Code Online (Sandbox Code Playgroud)

因此,我跳到安装了全新Windows的Windows机器上,安装python37和pip install pypiwin32。运行相同的行,并像昨天在我的原始计算机上一样打开excel。

我尝试卸载并重新安装时没有运气。知道这里发生了什么吗?

注意:动态调度仍然有效:

import win32com.client
objExcelApp = win32com.client.Dispatch("Excel.Application")
objExcelApp.Visible = 1
Run Code Online (Sandbox Code Playgroud)

但是我特别需要静态分配,因为数据透视表不能与动态分配的对象一起使用(在我的代码的后面):

objExcelPivotCache = objExcelWorkbook.PivotCaches().Create(SourceType=win32c.xlDatabase, SourceData=objExcelPivotSourceRange)
Run Code Online (Sandbox Code Playgroud)

Jul*_*enm 10

在 powershell 或 cmd 中执行此命令行(不在管理员模式 => 对我来说不起作用)

   python -m win32com.client.makepy "Excel.Application"
Run Code Online (Sandbox Code Playgroud)

它修复了所有错误,并且您不必更改 python 代码。并继续使用

win32com.client.gencache.EnsureDispatch("Excel.Application")
Run Code Online (Sandbox Code Playgroud)

使用 gencache.EnsureDispatch,您可以访问由 makepy 动态加载的应用程序的常量,该应用程序必须具有已注册的应用程序(在我们的例子中是 Excel.Application)。如果您在使用 Outlook 时遇到同样的问题,请使用上面的“Outlook.Application”。

如果仍然无法正常工作,请重新安装 python 发行版的 pywin32

<path to python root or venv>\pip.exe uninstall pywin32
<path to python root or venv>\pip.exe install pywin32
Run Code Online (Sandbox Code Playgroud)


小智 6

我遇到了同样的问题,并且按照以下说明进行了解决:https : //mail.python.org/pipermail/python-win32/2007-August/006147.html

删除gen_py输出目录并重新运行makepy SUCCEEDS,随后测试应用程序将再次运行OK。

因此,症状得以解决,但是有关此情况如何发生的任何线索。这是一个运行时间非常长的应用程序(多年来一直认为是24x7的应用程序),我担心无论是什么原因导致这种情况可能再次发生。

要找到输出目录,请在python控制台/ python会话中运行以下命令:

import win32com
print(win32com.__gen_path__)
Run Code Online (Sandbox Code Playgroud)

根据帖子中的异常消息,您需要删除的目录将被命名为“ 00020813-0000-0000-C000-000000000046x0x1x9”。因此,删除该目录并重新运行代码。如果您担心删除它(像我以前一样),只需剪切目录并将其粘贴到其他位置即可。

我不知道为什么会发生这种情况,也不知道如何防止这种情况再次发生,但是我提供的链接中的指示似乎对我有用。

  • 对于那些想知道删除 gen_py 目录后如何运行 makepy 的人,请导航到 C:\&lt;python 安装目录&gt;\Lib\site-packages\win32com\client,然后运行 ​​makepy.py。 (5认同)
  • fwiw,我的路径是“C:\Users\&lt;my username&gt;\AppData\Local\Temp\gen_py” (2认同)

Qin*_*ang 6

在使用 win32com 访问 Excel 文件的相关问题问题中发布了一个更直接的解决方案。

基本上,您只需要删除该文件夹C:\Users\<your username>\AppData\Local\Temp\gen_py并重新运行您的代码。