2016-02-22 2 views
1

Приложение My Python 2.7 использует matplotlib, enthought (майави, черты), библиотеки wxpython. Мне нужно упаковать его в исполняемый файл в Windows, который после некоторых исследований и экспериментов кажется непростой задачей.Упаковка приложения python (с enthought, matplotlib, wxpython) в исполняемый файл

Я до сих пор экспериментировал с PyInstaller и bbfreeze. В обоих из них я указываю скрытый импорт/включает (который я мог бы собрать из случайной информации в Интернете) для импорта пакетов Enthought. Как удалось создать исполняемый файл (для bbfreeze я исключила Matplotlib часть моего приложения до сих пор), но когда я запускаю его, как вернуть ту же ошибку:

Traceback (most recent call last): 
File "<string>", line 6, in <module> 
File "__main__.py", line 128, in <module> 
File "__main__test__.py", line 23, in <module> 
File "traitsui/api.py", line 36, in <module> 
File "traitsui/editors/__init__.py", line 23, in <module> 
File "traitsui/editors/api.py", line 49, in <module> 
File "traitsui/editors/table_editor.py", line 37, in <module> 
File "traitsui/table_filter.py", line 35, in <module> 
File "traitsui/menu.py", line 128, in <module> 
File "pyface/toolkit.py", line 98, in __init__ 
NotImplementedError: the wx pyface backend doesn't implement MenuManager 

Любые идеи, что я должен делать? Или кто-нибудь имел опыт создания такого исполняемого файла и может рекомендовать инструмент или метод? До сих пор я видел только this tutorial, но он использует py2exe и, по-видимому, требует загрузки всей ETS - если ничего не даст попробовать ...

+0

Я в точно такой же точки (спросил подобный вопрос сам без ответа, также). Пожалуйста, держите меня в курсе, если вы когда-нибудь придумаете решение! – brettb

+0

привет, я сделал это в конце концов, см. Мой ответ ниже –

+0

Спасибо @Shifty Весы. Я попробую это. Я надеялся использовать PyInstaller, потому что это то, что мы используем для большинства наших проектов, но если cx_freeze работает, тогда это нужно будет сделать! – brettb

ответ

0

Вот решение, которое сработало для меня.

Я попытался использовать bbfreeze, PyInstaller, py2exe и cx_Freeze. В итоге я решил пойти с cx_Freeze, поскольку он, по-видимому, популярен среди людей, которые упаковывают приложения с классами enthought.

С cx_Freeze Я получил аналогичное сообщение об ошибке, как указано выше. Проблема в том, что он сохраняет необходимые модули в файле «library.zip», что связано с тем, с чем сталкиваются классы, в которых есть проблемы с Mayavi. К счастью, cx_Freeze позволяет указать параметр "create_shared_zip": False, который затем делает его так, чтобы исходные файлы были непосредственно скопированы в каталог сборки, как они есть, а не в zip-файле.

Кроме того, я обнаружил, что некоторые файлы и папки Enthought должны быть включены вручную в include_files (то же самое относится к scipy, source: here). После этого это сработало. Я добавляю свой код файла установки ниже, надеюсь, что это поможет.

import sys 
import os 
from cx_Freeze import setup, Executable 
import scipy 

scipy_path = os.path.dirname(scipy.__file__) #use this if you are also using scipy in your application 

build_exe_options = {"packages": ["pyface.ui.wx", "tvtk.vtk_module", "tvtk.pyface.ui.wx", "matplotlib.backends.backend_tkagg"], 
        "excludes": ['numarray', 'IPython'], 
        "include_files": [("C:\\Python27\\Lib\\site-packages\\tvtk\\pyface\\images\\", "tvtk\\pyface\\images"), 
             ("C:\\Python27\\Lib\\site-packages\\pyface\\images\\", "pyface\\images"), 
             ("C:\\Python27\\Lib\\site-packages\\tvtk\\plugins\\scene\\preferences.ini", "tvtk\\plugins\\scene\\preferences.ini"), 
             ("C:\\Python27\\Lib\\site-packages\\tvtk\\tvtk_classes.zip", "tvtk\\tvtk_classes.zip"), 
             ("C:\\Python27\\Lib\\site-packages\\mayavi\\core\\lut\\pylab_luts.pkl","mayavi\\core\\lut\\pylab_luts.pkl"), 
             ("C:\\Python27\\Lib\\site-packages\\mayavi\\preferences\\preferences.ini","mayavi\\preferences\\preferences.ini"), 
             ("C:\\Python27\\Lib\\site-packages\\numpy\\core\\libifcoremd.dll","numpy\\core\\libifcoremd.dll"), 
             ("C:\\Python27\\Lib\\site-packages\\numpy\\core\\libmmd.dll","numpy\\core\\libmmd.dll"), 
             (str(scipy_path), "scipy") #for scipy 
             ]      
        ,"create_shared_zip": False #to avoid creating library.zip 
        } 

executables = [ 
    Executable('myfile.py', targetName="myfile.exe", base=None) 
] 

setup(name='myfile', 
     version='1.0', 
     description='myfile', 
     options = {"build_exe": build_exe_options}, 
     executables=executables 
    ) 

Конфигурация:

python 2.7 
altgraph==0.9 
apptools==4.3.0 
bbfreeze==1.1.3 
bbfreeze-loader==1.1.0 
configobj==5.0.6 
cx-Freeze==4.3.3 
Cython==0.23.4 
matplotlib==1.4.3 
mayavi==4.4.3 
MySQL-python==1.2.5 
natgrid==0.2.1 
numpy==1.10.0b1 
opencv-python==2.4.12 
pandas==0.16.2 
pefile==1.2.10.post114 
Pillow==3.1.1 
plyfile==0.4 
psutil==4.1.0 
pyface==5.0.0 
Pygments==2.0.2 
pygobject==2.28.6 
pygtk==2.22.0 
PyInstaller==3.1 
pyparsing==2.0.3 
pypiwin32==219 
PySide==1.2.2 
python-dateutil==2.4.2 
pytz==2015.4 
scipy==0.16.0 
six==1.9.0 
subprocess32==3.2.7 
traits==4.5.0 
traitsui==5.0.0 
transforms3d==0.2.1 
VTK==6.2.0 
+0

Хммм, похоже, я получил ОЧЕНЬ близко, но не совсем там. Замороженный исполняемый файл, похоже, ищет tvtk_classes.zip в файле myfile.zip (или library.zip, если я делаю create_shared_zip = True). Файл tvtk_classes.zip * * становится упакованным, но он находится в \ build \ exe.win-amd64-2.7 \ tvtk. Вы не столкнулись с этой проблемой? – brettb

+0

Я попытался использовать «zip_includes», как указано здесь: http://stackoverflow.com/questions/10606932/cx-freeze-how-do-i-add-package-files-into-library-zip - похоже tvtk/tvtk_classes.zip делает его внутри library.zip сейчас, но он все еще не находит его во время исполнения из exe! – brettb

+0

В моем случае он смотрел в папке tvtk, поэтому я его копирую. Не могли бы вы отправить сообщение об ошибке? –

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