2012-06-21 3 views
3

У меня есть программа Python 2.7, которая импортирует win32clipboard. Я попытался заморозить его с помощью cx_Freeze 4.2.3 в Windows XP SP3 32-bit, чтобы создать установку MSI. Я сделал setup.py согласно документации cx_Freeze, и использовал следующую команду:ImportError: Ошибка загрузки DLL при импорте win32clipboard в приложение, замороженное cx_Freeze

c:\python27\python.exe setup.py bdist_msi 

Когда я запускаю его на другой компьютер, который не имеет Python 2.7 установлен, я получаю исключение на линии, которая импортирует win32clipboard:

ImportError: DLL load failed: The specified module could not be found. 

Я могу видеть, что win32clipboard.pydявляется включения в сборку.

Какая зависимость отсутствует, и как я могу обеспечить ее включение?

ответ

4

В конце концов я понял, что win32clipboard.pydэто включаются, однако, зависит от того, win32clipboard.pydpywintypes27.dll, который cx_Freeze является не копирование с c:\windows\system32.

Краткосрочный взлом заключается в том, чтобы вручную скопировать c:\windows\system32\pywintypes27.dll в build\exe.win32-2.7, а затем запустить setup.py bdist_msi еще раз.

Усовершенствованный хак использовать следующий в setup.py:

import os 
import sys 
import win32api 
... 
pywintypes_dll = 'pywintypes{0}{1}.dll'.format(*sys.version_info[0:2])  # e.g. pywintypes27.dll 
build_exe_options = {..., "include_files": [ (os.path.join(win32api.GetSystemDirectory(), pywintypes_dll), pywintypes_dll)]} 
... 
setup( ..., 
     options = { 'build_exe': build_exe_options, 
        ..., 
        }, 
     ...) 

(Было бы предпочтительнее для cx_Freeze быть улучшено для автоматического обнаружения pywintype27.dll зависимости, но я предполагаю, что это всегда работы- незавершенный прогресс.)

2

cx_Freeze использует механизм зацепления, чтобы справиться с такой ситуацией. Крюки хранятся в модуле cx_Freeze.hooks. Каждый крюк назван в честь исследуемого, загруженного или отсутствующего действия и имени модуля. Сам модуль содержит множество примеров.

Вот как вы бы справиться с win32clipboard модуль:

from cx_Freeze import hooks 
def load_win32clipboard(finder, module): 
    finder.IncludeModule("pywintypes") 

hooks.load_win32clipboard = load_win32clipboard 
... 

Теперь, когда cx_Freeze встречает win32clipboard, он также будет включать в себя pywintypes. cx_Freeze уже имеет крючок pywintypes, который скопирует соответствующий файл.

+0

Спасибо за информацию. Я попробую это некоторое время. Последняя строка выглядит как странный API-интерфейс, обезьяна-исправление модуля 'cx_Freeze.hooks'. –

 Смежные вопросы

  • Нет связанных вопросов^_^