2016-05-16 3 views
0

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

Это мой setup.py сценарий:

from cx_Freeze import setup, Executable 

includefiles = ['Leaderboard.txt'] 
includes = ['PyQt4.QtGui', 'PyQt4.QtCore', 'functools.partial', 'multiprocessing.Process', 'sys'] 


setup(
    name = 'App', 
    version = '1.0', 
    description = 'Description', 
    author = 'ShellRox', 
    options = {'build_exe': {'include_files':includefiles}}, 
    executables = [Executable('Project.py', copyDependentFiles=True)] 
) 

Полный код here.


По какой-то причине, я получаю эту ошибку:

error: [Errno 2] No such file or directory: 'QtDesigner.framework/Versions/4/QtDesigner' 

Полный журнал here.

Однако я не совсем уверен, что может быть проблемой. После некоторого исследования я нашел только один результат, соответствующий моей проблеме, и это не помогло бы вообще (я удалил пакеты, хотя).

Я также добавил только подмодули в includes, но это все равно не помогло, думаю, он не искал модулей.

Одна вещь, которая заставляет меня задаться вопросом, есть ли что-то, связанное с моим файлом reseources.py.

Я также попытался добавить файл местоположения QtDesigner в Path, который ничего не обновлял.

Вопрос:

В чем проблема? Как можно занести его в черный список cx_Freeze, чтобы он не искал фреймворк QtDesigner (если это не полезно), или мне нужно добавить местоположение в путь, чтобы он мог искать Qt Designer (если да, то где будет путь?).

ответ

0

cx_Freeze имеет возможность исключить двоичные файлы. Используйте этот параметр для блокировки поиска нежелательных двоичных файлов. из документации

bin_excludes - list of names of files to exclude when determining dependencies of binary files that would normally be included; note that version numbers that normally follow the shared object extension are stripped prior to performing the comparison

Добавить эту опцию в файл setup.py внутри build_exe вариантов, как этот

build_exe_options = { 
    "icon": iconPath, 
    "packages": packages, 
    "includes": includes, 
    "include_files": include_files, 
    "excludes": excludes, 
    "optimize": True, 
    "bin_excludes": ["QtDesigner"], 
    } 

Но что, если ваш код на самом деле нужно, что исполняемый файл? Если вы посмотрите на зависимость с помощью «otool», вы можете обнаружить, что qtdesigner требуется модулю PySide.QtUiTools.

$ otool -L ~/lib/python2.7/site-packages/PySide/QtUiTools.so 
/lib/python2.7/site-packages/PySide/QtUiTools.so: 
    @rpath/libpyside-python2.7.1.2.dylib (compatibility version 1.2.0, current version 1.2.2) 
    /usr/local/lib/QtDesigner.framework/Versions/4/QtDesigner (compatibility version 4.8.0, current version 4.8.6) 
    /usr/local/lib/QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.6) 
    /usr/local/lib/QtGui.framework/Versions/4/QtGui (compatibility version 4.8.0, current version 4.8.6) 
    @rpath/libshiboken-python2.7.1.2.dylib (compatibility version 1.2.0, current version 1.2.2) 
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) 

Так что лучше найти, где QtDesigner находится и использовать «install_name_tool», чтобы изменить путь поиска правильного места для модуля QtUiTools.so.