2015-01-22 4 views
2

Я пытаюсь заморозить с помощью cx_freeze или pyInstaller программу TraitsUI, которая использует Chaco, Traits, TraitsUI и в меньшей степени mayavi (фактически может быть выведена). Мне нужно это для запуска на mac, linux, ubuntu, поэтому избегайте py2exe. Я намеренно удалил pyqt и pyside, так что доступен только wx-сервер.Замораживание (.exe) a traitsUI программа, реально выполнимая?

Использование cx_freeze, я столкнулся с сообщением об ошибке, так что pyInstaller, кажется, получает меня самым дальним. Он сгенерировал файл .exe, но когда я запускаю файл, я получаю предупреждения и ошибку. Для создания EXE-файл, который я сделал:

pyinstaller --onefile --name=pameapp pamemain.py 
pyinstaller pameapp.exe 

После запуска, предупреждения являются:

Warning: Unable to import the wx backend for pyface due to traceback: Traceback (most recent call last): 
     File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/pyface.toolkit", line 45, in _init_toolkit 
     File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/pyface.toolkit", line 31, in import_toolkit 
    ImportError: No module named wx.init 

Warning: Unable to import the qt4 backend for pyface due to traceback: Traceback (most recent call last): 
     File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/pyface.toolkit", line 45, in _init_toolkit 
     File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/pyface.toolkit", line 31, in import_toolkit 
    ImportError: No module named init 

Warning: Unable to import the null backend for pyface due to traceback: Traceback (most recent call last): 
     File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/pyface.toolkit", line 45, in _init_toolkit 
     File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/pyface.toolkit", line 31, in import_toolkit 
    ImportError: No module named null.init 

Кроме того, я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "<string>", line 8, in <module> 
    File "/home/glue/anaconda/envs/fibersim/lib/python2.7/site-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module 
    exec(bytecode, module.__dict__) 
    File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traitsui.api", line 35, in <module> 
    File "/home/glue/anaconda/envs/fibersim/lib/python2.7/site-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module 
    exec(bytecode, module.__dict__) 
    File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traitsui.editors", line 22, in <module> 
    File "/home/glue/anaconda/envs/fibersim/lib/python2.7/site-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module 
    exec(bytecode, module.__dict__) 
    File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traitsui.editors.api", line 10, in <module> 
    File "/home/glue/anaconda/envs/fibersim/lib/python2.7/site-packages/PyInstaller/loader/pyi_importers.py", line 270, in load_module 
    exec(bytecode, module.__dict__) 
    File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traitsui.editors.code_editor", line 36, in <module> 
    File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traitsui.editors.code_editor", line 48, in ToolkitEditorFactory 
    File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traits.traits", line 487, in __call__ 
    File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traits.traits", line 1191, in Color 
    File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traitsui.toolkit_traits", line 7, in ColorTrait 
    File "/home/glue/Desktop/fibersim/pame/build/pameapp/out00-PYZ.pyz/traitsui.toolkit", line 137, in toolkit 
traits.trait_errors.TraitError: Could not find any UI toolkit called 'null' 

pyface вероятно имеет много динамических импорта, поэтому это должна быть проблема, с которой сталкивается любой, кто пытается заморозить ETS. Есть ли какое-то решение, чтобы заставить это работать?

Учитывая, что старые вещи, плавающие вокруг Интернета, на скорости успеха, чтобы заморозить программу ETS, стоит ли даже инвестировать? Для нас, если люди избегают настройки python для этого приложения, это будет большим плюсом.

Спасибо.

+0

Чтобы уменьшить этот вопрос, было бы полезно, если бы вы могли объяснить, почему я избегаю того, что проблема была в будущем. –

+0

С помощью cx_Freeze я бы попробовал добавить 'wx' в список пакетов, включенных, чтобы узнать, не изменилось ли это. Но я не пробовал замораживать приложение пользовательского интерфейса черт; это может быть непрактично. –

+0

Эй, Томас. Я действительно пытался cx_freeze, и я получаю ошибку в библиотеке коллекций, очень похожей на ошибку, о которой вы говорили ранее на битбакете. Это имеет какое-то значение для вас? https://bitbucket.org/anthony_tuininga/cx_freeze/issue/127/collectionssys-error#comment-15016355 Если это работает, то я думаю, что wx в пакетах будет в порядке. Подобно "collections.abc", я получаю ошибку "collections.sys" –

ответ

1

Pyface.toolkit вы используете использует динамический импорт:

def import_toolkit(tk): 
    try: 
     # Try and import the toolkit's pyface backend init module. 
     be = 'pyface.ui.%s.' % tk 
     __import__(be + 'init') 
    except: 
     raise 
    return be 

Так pyinstaller не в состоянии обнаружить это. Обратитесь к python -v b.py 2>&1 | grep imp, каков конкретный импорт и добавьте файл с крюком (hook-.py) с соответствующим списком hiddenimports.

Однако я провел несколько тестов на местном уровне, и я не могу выполнить схему тестирования работы с __import__. Странно, поскольку я сделал некоторую отладку, и я обнаружил, что hiddenimport добавлен, но все еще не используется.

+0

Другой способ - переопределить это как обычный статический импорт. – alkuzad

+0

Что конкретно делает строка 'grep' кода? Спасибо, что указали этот кусок кода –

+0

@AdamHughes Этот grep предназначен для фильтрации импорта только с вывода (с -v = verbose python даст много результатов). Вы можете быть более конкретным, чем я, и использовать «импорт» или grep -i «import * pyface», чтобы получить только импорт, связанный с pyface. – alkuzad

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

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