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

person ninov    schedule 29.10.2013    source источник
comment
Это та же ошибка, что и в вашем коротком примере сценария?   -  person Thomas K    schedule 29.10.2013
comment
Это сообщение предполагает, что вам нужно включить пакет win32com.gen_py при его заморозке. Дайте мне знать, если это поможет.   -  person Thomas K    schedule 29.10.2013
comment
Да, это та же ошибка.   -  person ninov    schedule 29.10.2013
comment
Я включил весь пакет win32com, но он не работает   -  person ninov    schedule 29.10.2013
comment
Я собираюсь изучить это - не могли бы вы куда-нибудь поместить результат заморозки в pastebin?   -  person Thomas K    schedule 29.10.2013
comment
pastebin.com/mKyNJRCv, и я добавил к вопросу сценарий setup.py.   -  person ninov    schedule 29.10.2013
comment
Думаю, я знаю, что происходит. Я «исправил» cx_Freeze, чтобы он игнорировал модули, у которых нет допустимого имени Python, но похоже, что win32com полагается на некоторые из них. У вас есть файлы .py с тире в имени в `O:\Python\3\lib\site-packages\win32com\gen_py`? Если это так, попробуйте использовать предыдущий выпуск отсюда и посмотрите, это работает лучше.   -  person Thomas K    schedule 29.10.2013
comment
Да, есть E602ED16-8EF9-4F08-B09F-6F6E8306C51Bx0x1x0.py. Я понизил версию cx_Freeze, но она все равно не работает. Та же ошибка, что и раньше.   -  person ninov    schedule 29.10.2013
comment
Можешь выложить лог от зависания с cx_Freeze 4.3.1?   -  person Thomas K    schedule 30.10.2013
comment
Не знаю почему, но после того, как я перезагрузил свой компьютер сегодня утром, он работал с 4.3.1. Спасибо!   -  person ninov    schedule 30.10.2013


Ответы (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-объекта. Поэтому убедитесь, что вы запустили свой код, прежде чем заморозить его.

person Thomas K    schedule 30.10.2013
comment
Было ли это когда-нибудь решено? cx_Freeze сейчас на 4.3.4. Нужно ли мне все еще возвращаться к 4.3.1, если у меня такая же проблема? Я обнаружил, что могу решить проблему, если сначала запущу скрипт python на локальном компьютере, а затем зависну, а затем скопирую файлы .py с тире в правильную папку library.zip и повторно заархивирую его. - person user1464473; 20.09.2016
comment
Это исправлено, но с тех пор релиза cx_Freeze не было. Вы можете установить cx_Freeze из разрабатываемой версии. - person Thomas K; 20.09.2016