Создать.exe для Windows из скрипта python 3, импортирующего theano с помощью pyinstaller
Редактировать 2 сентября 2017 года, 1 вечера
В конце концов мне удалось собрать.exe с pyinstaller после многих эпизодов.
К сожалению, мне не удалось разобраться с модулем 'theano' (который требуется в моем случае модулем 'pymc3'), и мне пришлось изменить файлы.py и отказаться от части приложения. Мое описание ниже имеет две цели: во-первых, это может помочь; во-вторых, кто-нибудь может помочь мне собрать.exe для Windows 7+ с модулем 'theano'?
Напоминание: Мой скрипт на python 3 открывает простой графический интерфейс, созданный с помощью Qt Designer, в файле '.ui' и импортирует pyqtgraph (с pyqt5), pymc3 (и, следовательно, theano, который требуется для pymc3), scipy, numpy, os, sys. Он будет распространяться на компьютерах с Windows 7+. Я попытался создать ".exe" с помощью py2exe, cx_freeze, pynsist и pyinstaller (я открыл и обновил несколько сообщений, этот вопрос все еще открыт: создайте.exe для Windows из сценария python 3, импортирующего pyqtgraph и открывающего графический интерфейс), но все не удалось. Мой лучший результат (с pyinstaller) описан ниже после того, как мне пришлось отказаться от theano.
- командная строка, с которой я закончил:
pyinstaller —noupx —onefile —add-data “toto.ui;.” toto.py
, Но странно
1 файл qt-конструктора 'toto.ui' не включен и должен распространяться вместе с.exe. В противном случае при запуске.exe появляется сообщение об ошибке: toto.ui not found;
2 каталог 'platform' из каталога 'Library/plugin' среды python также должен распространяться вместе с.exe. В противном случае появляется сообщение об ошибке при запуске.exe "не удалось запустить это приложение, поскольку оно не может найти окна плагина платформы qt" (но при сборке нет сообщения об ошибке от pyinstaller!)
3.exe имеет размер 220 МБ! Кажется, Pyinstaller включает в себя кучу бесполезных вещей во время строительства.
- проблема pyqtgraph:
На первый взгляд, модуль pyqtgraph кажется несовместимым с pyinstaller. Действительно, когда код python импортирует pyqtgraph, pyinstaller выдает SyntaxError: ‘yield’ inside async function
, Это кажется мне очень неловким (это ошибка в pyinstaller?), Потому что у меня сложилось впечатление, что на форумах это связано с асинхронными генераторами, которые совместимы только с python 3.6, в то время как pyinstaller работает только с python 3.5, который не совместим с асинхронными генераторы... так почему Pyinstaller использует это? Оказывается, эта функция, похожая на ошибку, отключена в новой версии pyinstaller, которая не выпущена (и поэтому не установлена по умолчанию): pip install git+https://github.com/pyinstaller/pyinstaller
Спасибо 9dogs (в комментариях). Я также обнаружил, что это может помочь явно написать os.environ['PYQTGRAPH_QT_LIB'] = 'PyQt5' или 'PyQt4' перед импортом pyqtgraph в py-файл (ы).
- Теологическая проблема:
Оказывается, theano делает несколько неявных импортов, которые не обнаруживаются pyinstaller. Таким образом, здание выглядит нормально, но при запуске.exe вы получаете сообщения об ошибках типа "no module theano.tensor.shared_randomstreams". К сожалению, мне не удалось использовать параметр --hidden-import в pyinstaller, поэтому я явно добавил импорт в файл (ы) py (в этом примере "import theano.tensor.shared_randomstreams").
Но это не конец: после этого файл '…\AppData\Local\Temp_MEI35682\theano\gpuarray\blockgemv.c' отсутствует, что приводит к [4128] Failed to execute script
, Я не знаю, что это за файл, и не нашел информации. Я сдался и удалил часть GUI, чтобы избежать theano. Может кто-нибудь помочь мне использовать theano с pyinstaller?