2013-10-29 90 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。 –