Как я могу преобразовать пакет в exe с помощью pyinstaller?

У меня есть программа командной строки Python с открытым исходным кодом, которая работает на Python 2.7, Python3+ и является кросс-платформенной.

Я пытаюсь проще упаковать его в исполняемый файл для пользователей Windows. Исходный код этого пакета находится на Github здесь: https://github.com/stormpath/stormpath-cli< /а>

Я пытаюсь упаковать свою программу Python с помощью pyinstaller, но у меня возникают проблемы.

Я запускаю следующие команды из окна Windows 8:

$ pyinstaller --onefile setup.py

Это успешно создает для меня файл EXE, но когда я запускаю его, я получаю следующие ошибки:

Traceback (most recent call last):
  File "setup.py", line 4, in <module>
  File "c:\python27\Lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module
    exec(bytecode, module.__dict__)
  File "site-packages\setuptools\__init__.py", line 160, in <module>
  File "site-packages\setuptools\monkey.py", line 93, in patch_all
  File "site-packages\setuptools\monkey.py", line 145, in patch_for_msvc_specialized_compiler
  File "importlib\__init__.py", line 37, in import_module
ImportError: No module named msvc
Failed to execute script setup

В целях тестирования, чтобы сузить круг проблем, я создал скрипт test.py, содержащий следующий код:

print('hello, world!')

А затем упаковал это в exe:

$ pyinstaller --onefile test.py

Когда я запускаю этот полученный exe, все работает отлично! Привет, мир выводится, как и ожидалось.

Я считаю, что происходит то, что я не говорю pyinstaller, как правильно «обнаружить», что мой проект является пакетом Python, а не отдельным файловым скриптом.

Я много читал документы и гуглил, но не нашел способа указать пакет для анализа pyinstaller.

Что мне не хватает?


person rdegges    schedule 19.01.2017    source источник
comment
Я не думаю, что вам следует указывать на сценарий setuptools. Вот только для его установки вы должны вместо этого указать на модуль stormpath-cli. main.py может потребоваться переименовать в __main__.py Я полагаю, что эта проблема возникает, потому что setuptools выполняет некоторые динамические системные действия, и когда он связан, он не может получить к нему должный доступ...   -  person GRAYgoose124    schedule 19.01.2017
comment
Я согласен. Я думаю, что это проблема. Просто не знаю, на что мне должен указать :o Как он узнает, как установить скрипт в нужное место без установочного скрипта? оо   -  person rdegges    schedule 19.01.2017
comment
Это не будет, созданный exe будет работающей программой. Когда вы запустите его, он не будет установлен, он просто запустит stormpath-cli. т.е. универсальное портативное приложение. Я думаю, что это намного проще сделать, чем связать этот exe-файл с установщиком. (Что на самом деле может быть просто пакетным файлом, добавляющим его в путь, перемещающим его в нужный каталог программы и т. д.) Я не думаю, что setuptools когда-либо предназначался для запуска из замороженной среды, и, не заходя в него, я могу представить, что существует там много проблем. Я думаю, что setuptools, среди прочего, проверяет, доступен ли путь python только для чтения.   -  person GRAYgoose124    schedule 19.01.2017
comment
PyInstaller предназначен для установки приложения Python и всех его зависимостей в один пакет, а не для установки пакета Python. Вам нужно использовать что-то еще, например пакет distutils, сделать это.   -  person martineau    schedule 19.01.2017
comment
@martineau Пакет Python может быть приложением — просто добавьте __main__.py, и теперь вы можете запустить пакет.   -  person Jonathon Reinhart    schedule 13.04.2017
comment
Я открыл проблему в PyInstaller.   -  person Jonathon Reinhart    schedule 13.04.2017
comment
@Jonathon: Спасибо, что указали мне на несколько неясный факт о пакетах Python. Предложите опубликовать обходной путь здесь в качестве ответа на вопрос OP (чтобы им не пришлось ждать исправления PyInstaller).   -  person martineau    schedule 13.04.2017


Ответы (3)


Хотя я думаю, что это вполне разумно, похоже, что PyInstaller просто не поддерживает сборку приложения из пакета (с __main__.py).

См. https://github.com/pyinstaller/pyinstaller/issues/2560.

В качестве обходного пути вы можете написать небольшую заглушку (вне пакета), которая делает то же самое, что и ваш файл __main__.py. Затем укажите на это PyInstaller.

person Jonathon Reinhart    schedule 13.04.2017
comment
Обратите внимание, что вместо добавления еще одного файла вы можете просто использовать __main__.py в качестве сценария для PyInstaller и убедиться, что все импорты являются абсолютными (а не относительными). Это упоминается в комментарии на GitHub. - person Peterino; 02.10.2018

Я думаю, вы забыли «pyinstaller -w --onefile test.py». Вы забыли '-w'.

person Bekbol Bolatov    schedule 20.04.2020
comment
Привет, Бекбол. Добро пожаловать в StackOverflow! Хотя ваше решение может решить проблему, всегда полезно описать, почему оно решает проблему. - person Nick; 20.04.2020
comment
Хорошо, в следующий раз отмечу. - person Bekbol Bolatov; 05.07.2020

Сначала установите pyinstaller

pip install pyinstaller 

Чтобы создать папку с исполняемым файлом, просто выполните следующую команду:

pyinstaller exam_browser.py

Если вам нужен один exe-файл с логотипом, выполните эту команду:

pyinstaller exam_browser.py --onefile -F --icon logo.ico
person Ravi Shankar Romesh    schedule 08.03.2021