python-win32com excel com 模型开始生成错误
python-win32com excel com model started generating errors
在过去的几天里,我一直致力于为一些报告自动生成一些数据透视表。
归结为最低限度,以下代码可以正常工作:
import win32com.client
objExcelApp = win32com.client.gencache.EnsureDispatch('Excel.Application')
objExcelApp.Visible = 1
这将弹出 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'
代码从昨天到今天没有变化。我不知道发生了什么!!!
另一个有趣的问题。如果我再次在同一个会话中执行相同的代码,我会得到一个不同的错误:
>>> 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'
>>>
所以我跳到 windows 机器上进行了全新的 windows 安装,安装 python37 和 pip install pypiwin32。 运行 完全相同的行和 excel 打开就像昨天在我原来的机器上一样。
我尝试卸载并重新安装,但没有成功。知道这里发生了什么吗?
注意:
动态调度仍然有效:
import win32com.client
objExcelApp = win32com.client.Dispatch("Excel.Application")
objExcelApp.Visible = 1
但我特别需要静态分派,因为数据透视表不能与动态分派的对象一起使用(在我的代码中很晚):
objExcelPivotCache = objExcelWorkbook.PivotCaches().Create(SourceType=win32c.xlDatabase, SourceData=objExcelPivotSourceRange)
我遇到了同样的问题,我按照此处的说明解决了它:https://mail.python.org/pipermail/python-win32/2007-August/006147.html
Deleting the gen_py output directory and re-running makepy SUCCEEDS
and subsequently the test application runs OK again.
So the symptom is resolved, but any clues as to how this could have
happened. This is a VERY long running application (think 24x7 for
years) and I'm concerned that whatever caused this might occur again.
要找到输出目录,运行 在你的 python 控制台 / python session:
import win32com
print(win32com.__gen_path__)
根据您 post 中的异常消息,您需要删除的目录标题为“00020813-0000-0000-C000-000000000046x0x1x9”。所以删除这个目录和re-run代码。如果您担心删除它(就像我一样),只需剪切目录并将其粘贴到其他地方即可。
我不知道为什么会发生这种情况,也不知道如何防止它再次发生,但我提供的 link 中的说明似乎对我有用。
相关问题 中发布了更直接的解决方案。
基本上,您只需删除文件夹 C:\Users\<your username>\AppData\Local\Temp\gen_py
并重新运行您的代码。
在 powershell 或 cmd 中执行此命令行(不在管理员模式下 => 对我不起作用)
python -m win32com.client.makepy "Excel.Application"
它修复了所有错误,您无需更改 python 代码。
并继续使用
win32com.client.gencache.EnsureDispatch("Excel.Application")
使用 gencache.EnsureDispatch,您可以访问由 makepy 动态加载的应用程序的常量,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
对我来说,问题似乎是我有多个进程通过 win32com
与 Windows 应用交互。
由于 win32com
创建 "gen_py" directory in win32api.GetTempPath()
这可能会导致冲突和缓存损坏。
我的解决方案是为每个进程设置“gen_py”的自定义位置。一个简单的例子:
from pathlib import Path
import win32com
gen_py_path = '/some/custom/location/gen_py'
Path(gen_py_path).mkdir(parents=True, exist_ok=True)
win32com.__gen_path__ = gen_py_path
# Any other imports/code that uses win32com
这样您就不必删除默认的“gen_py”文件夹并想知道可能会出现什么问题。但是,如果您仍然发现需要删除,您可以只删除自定义文件夹,并且知道您正在删除该进程的缓存。
对我有用的是:
excel = win32.gencache.EnsureDispatch('Excel.Application')
#change to =>
excel = win32.Dispatch('Excel.Application')
在过去的几天里,我一直致力于为一些报告自动生成一些数据透视表。
归结为最低限度,以下代码可以正常工作:
import win32com.client
objExcelApp = win32com.client.gencache.EnsureDispatch('Excel.Application')
objExcelApp.Visible = 1
这将弹出 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'
代码从昨天到今天没有变化。我不知道发生了什么!!!
另一个有趣的问题。如果我再次在同一个会话中执行相同的代码,我会得到一个不同的错误:
>>> 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'
>>>
所以我跳到 windows 机器上进行了全新的 windows 安装,安装 python37 和 pip install pypiwin32。 运行 完全相同的行和 excel 打开就像昨天在我原来的机器上一样。
我尝试卸载并重新安装,但没有成功。知道这里发生了什么吗?
注意: 动态调度仍然有效:
import win32com.client
objExcelApp = win32com.client.Dispatch("Excel.Application")
objExcelApp.Visible = 1
但我特别需要静态分派,因为数据透视表不能与动态分派的对象一起使用(在我的代码中很晚):
objExcelPivotCache = objExcelWorkbook.PivotCaches().Create(SourceType=win32c.xlDatabase, SourceData=objExcelPivotSourceRange)
我遇到了同样的问题,我按照此处的说明解决了它:https://mail.python.org/pipermail/python-win32/2007-August/006147.html
Deleting the gen_py output directory and re-running makepy SUCCEEDS and subsequently the test application runs OK again.
So the symptom is resolved, but any clues as to how this could have happened. This is a VERY long running application (think 24x7 for years) and I'm concerned that whatever caused this might occur again.
要找到输出目录,运行 在你的 python 控制台 / python session:
import win32com
print(win32com.__gen_path__)
根据您 post 中的异常消息,您需要删除的目录标题为“00020813-0000-0000-C000-000000000046x0x1x9”。所以删除这个目录和re-run代码。如果您担心删除它(就像我一样),只需剪切目录并将其粘贴到其他地方即可。
我不知道为什么会发生这种情况,也不知道如何防止它再次发生,但我提供的 link 中的说明似乎对我有用。
相关问题
基本上,您只需删除文件夹 C:\Users\<your username>\AppData\Local\Temp\gen_py
并重新运行您的代码。
在 powershell 或 cmd 中执行此命令行(不在管理员模式下 => 对我不起作用)
python -m win32com.client.makepy "Excel.Application"
它修复了所有错误,您无需更改 python 代码。 并继续使用
win32com.client.gencache.EnsureDispatch("Excel.Application")
使用 gencache.EnsureDispatch,您可以访问由 makepy 动态加载的应用程序的常量,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
对我来说,问题似乎是我有多个进程通过 win32com
与 Windows 应用交互。
由于 win32com
创建 "gen_py" directory in win32api.GetTempPath()
这可能会导致冲突和缓存损坏。
我的解决方案是为每个进程设置“gen_py”的自定义位置。一个简单的例子:
from pathlib import Path
import win32com
gen_py_path = '/some/custom/location/gen_py'
Path(gen_py_path).mkdir(parents=True, exist_ok=True)
win32com.__gen_path__ = gen_py_path
# Any other imports/code that uses win32com
这样您就不必删除默认的“gen_py”文件夹并想知道可能会出现什么问题。但是,如果您仍然发现需要删除,您可以只删除自定义文件夹,并且知道您正在删除该进程的缓存。
对我有用的是:
excel = win32.gencache.EnsureDispatch('Excel.Application')
#change to =>
excel = win32.Dispatch('Excel.Application')