2013-10-29 75 views
1

我想使用cx_Freeze编译Python 3.3脚本。 该脚本使用win32com.client来控制MediaMonkey。当我直接运行它时,这是完美的。但是当我编译它时,它会抛出这个异常。python:win32com和cx_Freeze - 错误

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 = '[email protected]', 
    options = {'build_exe': { 
     'excludes':excludes, 
     'packages':packages, 
     'includes':includes 
     }}, 
    executables = [Executable(filename, base = None, icon = None)]) 
+1

它是从你的简短示例脚本中得到的错误吗? –

+1

[此消息](https://sourceforge.net/mailarchive/message.php?msg_id=25457945)建议您在冻结时需要包含'win32com.gen_py'包。让我知道这是否有帮助。 –

+0

是的,这是一样的错误。 – ninov

回答

2

转贴作为回答,总结如下:

对于cx_Freeze 4.3.2,我做了一个修改,以便它只会复制mo dules的名称是有效的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对象时生成的。所以确保你在冻结之前运行你的代码。

+0

这个问题解决了吗? cx_Freeze现在在4.3.4上。如果遇到同样的问题,我还需要回到4.3.1吗?我发现我可以修复这个问题,如果我先在本地机器上运行python脚本,然后冻结,然后将.py文件用破折号复制到正确的library.zip文件夹并重新压缩。 – user1464473

+0

它[已修复](https://bitbucket.org/anthony_tuininga/cx_freeze/pull-requests/79/re-allow-including-modules-with-non/diff),但尚未发布cx_Freeze自那以后。你可以从开发版本安装cx_Freeze。 –