Python 3.x 使用cx\U冻结生成exe时发生重新修补错误

Python 3.x 使用cx\U冻结生成exe时发生重新修补错误,python-3.x,exe,cx-freeze,win32com,Python 3.x,Exe,Cx Freeze,Win32com,我正在Windows7上使用Python 3.4。我的安装文件如下所示: from cx_Freeze import setup, Executable, sys exe=Executable( script="XYZ.py", base="Win32Gui", ) includefiles=[] includes=[] excludes=[] packages=[] setup( version = "1.0", description = "XYZ", author = "

我正在Windows7上使用Python 3.4。我的安装文件如下所示:

from cx_Freeze import setup, Executable, sys

exe=Executable(
 script="XYZ.py",
 base="Win32Gui",

 )
includefiles=[]
includes=[]
excludes=[]
packages=[]
setup(

 version = "1.0",
 description = "XYZ",
 author = "MAX",
 name = "AT",
 options = {'build_exe': {'excludes':excludes,'packages':packages,'include_files':includefiles}},
 executables = [exe]
 )


from distutils.core import setup
import py2exe, sys, os, difflib

sys.argv.append('py2exe')
setup(
    options = {'py2exe': {'bundle_files': 1}},
    console = [{'script': "XYZ.py"}],
    zipfile = None,
    )
运行获取的exe时,会弹出一个错误,提示:

...
File "C:\Python34\Lib\site-packages\win32com\client\CLSIDToClass.py", line 46, in GetClass
    return mapCLSIDToClass[clsid]
KeyError: '{00020970-0000-0000-C000-000000000046}'
我就是搞不懂这里的问题。请帮忙


谢谢。

您使用的是在磁盘上生成的静态代理,其中包含已编译的可执行文件故障查找。如果您不知道静态代理是什么,您可能正在使用自动生成静态代理的
win32com.client.gencache.EnsureDispatch

解决此问题的最简单方法是使用
win32com.client.dynamic.Dispatch
使用动态代理。静态代理有一些好处,但很可能您不需要它


您可以在此处找到有关COM对象的静态和动态代理的更多信息:

我刚刚发现,
EnsureDispatch
的问题在
gencache
模块中,当使用
cx\u freeze
构建可执行文件时,它假定处于只读模式

以下行允许在Windows 7 x64中的
AppData\Local\Temp\gen\u py\\.\
目录中构建缓存:

from win32com.client import gencache
if gencache.is_readonly:
    gencache.is_readonly = False
    gencache.Rebuild() #create gen_py folder if needed
参考资料:

  • 答复


另外,静态分派的性能要好得多

您是否对
win32com.client
代码使用静态代理?@Fenikso我不明白…什么是静态代理。。。。?我只是从word文档中读取一些内容,为此,我在脚本XYZ.py中使用import win32com.client…如果您不知道它是什么,您可能正在使用
EnsureDispatch
。它自动生成静态代理。它有一些好处,但可能会打破cx_的僵局。尝试改用
Dispatch
。请参阅。尝试调度也…引发错误…“模块”对象没有属性“调度”…我也使用了py2exe…但同样的错误再次出现…thnksDid您是否尝试
win32com.client.Dispatch
win32com.client.dynamic.Dispatch
?我希望静态代理也会在“冻结”的应用程序中生成。难道不可能吗?