python: win32com и cx_Freeze - ошибка
Я пытаюсь скомпилировать скрипт Python 3.3, используя cx_Freeze. Скрипт использует 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 ответ
Перепостим в качестве ответа, чтобы подвести итог:
Для cx_Freeze 4.3.2 я внес изменения, чтобы он копировал только модули с именами, которые являются действительными идентификаторами Python (чтобы их можно было импортировать). Однако win32com полагается на такие модули, как:
win32com\gen_py\E602ED16-8EF9-4F08-B09F-6F6E8306C51Bx0x1x0.py
Дефисы (-
) в имени файла сделать его недопустимым идентификатором Python, чтобы он не копировался. Я открыл проблему для cx_Freeze. В то же время, обходной путь заключается в снижении до cx_Freeze 4.3.1, который вы можете загрузить с SourceForge.
Кроме того, я думаю, что эти модули генерируются, когда вы впервые оборачиваете COM-объект. Поэтому убедитесь, что вы выполняете свой код, прежде чем заморозить его.