python:win32com和cx_Freeze - 错误

时间:2013-10-29 15:31:21

标签: python win32com cx-freeze

我正在尝试使用cx_Freeze编译Python 3.3脚本。 该脚本使用win32com.client来控制MediaMonkey。当我直接运行它时,这非常有效。但是当我编译它时,它会抛出这个异常。

Traceback (most recent call last):
  File "O:\Python\3\lib\site-packages\cx_Freeze\initscripts\Console3.py", line 27, in <module>
    exec(code, m.__dict__)
  File "test.py", line 6, in <module>
    sdb = win32com.client.DispatchWithEvents("SongsDB.SDBApplication", MMEventHandler)
  File "O:\Python\3\lib\site-packages\win32com\client\__init__.py", line 260, in
 DispatchWithEvents
    clsid = disp_class.CLSID
AttributeError: 'NoneType' object has no attribute 'CLSID'

当我尝试编译使用win32com.client的非常短的脚本时,它甚至不起作用:

import win32com.client

class MMEventHandler:
    pass

sdb = win32com.client.DispatchWithEvents("SongsDB.SDBApplication", MMEventHandler)

这是我的setup.py脚本:

from cx_Freeze import setup, Executable


includes = []
excludes = []
packages = ['win32com', 'shlex', 'os', 'pythoncom', 'base64', 'tornado']
filename = "test.py"
setup(
    name = 'Test',
    version = '0.1',
    description = 'test',
    author = 'no',
    author_email = 'someting@my.org',
    options = {'build_exe': {
        'excludes':excludes,
        'packages':packages,
        'includes':includes
        }},
    executables = [Executable(filename, base = None, icon = None)])

1 个答案:

答案 0 :(得分:2)

重新作为答案,总结:

对于cx_Freeze 4.3.2,我进行了更改,以便它只复制名称为有效Python标识符的模块(因此可以导入它们)。但是,win32com似乎依赖于以下模块:

win32com\gen_py\E602ED16-8EF9-4F08-B09F-6F6E8306C51Bx0x1x0.py

文件名中的连字符(-)使其不是有效的Python标识符,因此不会被复制。我为cx_Freeze opened an issue。与此同时,解决方法是降级到cx_Freeze 4.3.1,您可以下载from SourceForge

另外,我认为这些模块是在第一次包装COM对象时生成的。因此,请确保在冻结之前运行代码。