【问题标题】:EnsureDispatch error when using cx_freeze for making exe使用 cx_freeze 制作 exe 时出现 EnsureDispatch 错误
【发布时间】:2014-11-13 10:53:10
【问题描述】:

我在 Windows 7 上使用 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代码使用静态代理吗?
  • @Fenikso 我没明白....什么是静态代理....?我只是从 word 文档中读取一些内容,为此我在我的脚本 XYZ.py 中使用 import win32com.client ...
  • 如果您不知道它是什么,您可能正在使用EnsureDispatch。它自动生成静态代理。它有一些好处,但它可能会破坏 cx_freeze。尝试改用Dispatch。见timgolden.me.uk/python/win32_how_do_i/…
  • 也尝试了 Dispatch....抛出错误...'module'对象没有属性'Dispatch'...我也使用了 py2exe...但同样的错误再次... .thnks
  • 你试过win32com.client.Dispatchwin32com.client.dynamic.Dispatch吗?

标签: python-3.x exe cx-freeze win32com


【解决方案1】:

您正在使用在您的磁盘上生成的静态代理,并且该代理在编译后的可执行文件中存在问题。如果您不知道静态代理是什么,您可能正在使用自动生成静态代理的win32com.client.gencache.EnsureDispatch

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

您可以在此处找到有关 COM 对象的静态和动态代理的更多信息:http://timgolden.me.uk/python/win32_how_do_i/generate-a-static-com-proxy.html

【讨论】:

  • 我希望静态代理也会在“冻结”应用程序中生成。不可能吗?
【解决方案2】:

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

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

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

参考资料:

P。 S. 静态调度的性能要好得多

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多