Исполняемый файл Pyinstaller работает только на том же компьютере [python]

#python #pyinstaller

#python #pyinstaller

Вопрос:

Почему мой исполняемый файл работает только на том компьютере, который его создал? Я использую Python 3.7.1 и pyinstaller 3.4 на macOS Mojave 10.14.3. Моя простая программа импортирует только случайные и мои собственные модули, которые не имеют других зависимостей.

Вот команда, которую я использую для создания исполняемого файла:

 $ pyinstaller --onefile --windowed main.py
  

Вот результат:

 112 INFO: PyInstaller: 3.4
112 INFO: Python: 3.7.1
134 INFO: Platform: Darwin-18.2.0-x86_64-i386-64bit
135 INFO: wrote /Users/rahme/Desktop/Programming/Python/PokerHand/main.spec
139 INFO: UPX is not available.
141 INFO: Extending PYTHONPATH with paths
['/Users/rahme/Desktop/Programming/Python/PokerHand',
 '/Users/rahme/Desktop/Programming/Python/PokerHand']
141 INFO: checking Analysis
141 INFO: Building Analysis because Analysis-00.toc is non existent
141 INFO: Initializing module dependency graph...
143 INFO: Initializing module graph hooks...
145 INFO: Analyzing base_library.zip ...
2848 INFO: running Analysis Analysis-00.toc
2876 INFO: Caching module hooks...
2880 INFO: Analyzing /Users/rahme/Desktop/Programming/Python/PokerHand/main.py
2890 INFO: Loading module hooks...
2891 INFO: Loading module hook "hook-encodings.py"...
2942 INFO: Loading module hook "hook-xml.py"...
3131 INFO: Loading module hook "hook-pydoc.py"...
3144 INFO: Looking for ctypes DLLs
3144 INFO: Analyzing run-time hooks ...
3150 INFO: Looking for dynamic libraries
3219 INFO: Looking for eggs
3219 INFO: Using Python library 
/Users/rahme/Desktop/Programming/Python/PokerHand/env/bin/../.Python
3221 INFO: Warnings written to 
/Users/rahme/Desktop/Programming/Python/PokerHand/build/main/warn-main.txt
3241 INFO: Graph cross-reference written to 
/Users/rahme/Desktop/Programming/Python/PokerHand/build/main/xref-main.html
3248 INFO: checking PYZ
3248 INFO: Building PYZ because PYZ-00.toc is non existent
3248 INFO: Building PYZ (ZlibArchive) 
/Users/rahme/Desktop/Programming/Python/PokerHand/build/main/PYZ-00.pyz
3522 INFO: Building PYZ (ZlibArchive) 
/Users/rahme/Desktop/Programming/Python/PokerHand/build/main/PYZ-00.pyz completed successfully.
3527 INFO: checking PKG
3527 INFO: Building PKG because PKG-00.toc is non existent
3527 INFO: Building PKG (CArchive) PKG-00.pkg
5719 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.
5721 INFO: Bootloader 
/Users/rahme/Desktop/Programming/Python/PokerHand/env/lib/python3.7/site-packages/PyInstaller/bootloader/Darwin-64bit/runw
5721 INFO: checking EXE
5722 INFO: Building EXE because EXE-00.toc is non existent
5722 INFO: Building EXE from EXE-00.toc
5722 INFO: Appending archive to EXE /Users/rahme/Desktop/Programming/Python/PokerHand/dist/main
5754 INFO: Fixing EXE for code signing /Users/rahme/Desktop/Programming/Python/PokerHand/dist/main
5759 INFO: Building EXE from EXE-00.toc completed successfully.
5762 INFO: checking BUNDLE
5762 INFO: Building BUNDLE because BUNDLE-00.toc is non existent
5762 INFO: Building BUNDLE BUNDLE-00.toc
5779 INFO: moving BUNDLE data files to Resource directory
  

Вот что помещается в мою папку dist:

исполняемые файлы

Я могу перетащить тот, который выглядит как окно терминала, в терминал компьютера, который создал исполняемый файл, и он запустится. Однако, если я попытаюсь запустить его на любом другом компьютере, включая другой Mac, я ничего не получу. Я делаю что-то не так?

Комментарии:

1. Поскольку вы используете macOS, я бы порекомендовал вам использовать py2app . Вот очень полезное видео о том, как им пользоваться: youtube.com/watch?v=u4ykDbciXa8

2. Попробовал. Исполняемый файл сообщил об ошибке, когда я попытался открыть.

3. Смотрите документацию о том, как убедиться, что все упаковано: github.com/pyinstaller/pyinstaller/wiki /… . А также, в более общем плане: github.com/pyinstaller/pyinstaller/wiki/If-Things-Go-Wrong

4. @JJones нужно ли мне вручную упаковывать мои собственные модули? У меня есть 3 файла .py, которые импортированы в мой main.py . Один из них импортирует random. Нужно ли мне что-либо включать вручную? Если да, можете ли вы сказать мне, как это сделать?

5. Я просмотрел файл pyz-00.pyz, как упомянуто в руководстве, которое вы опубликовали, и там перечислены все три моих модуля. Я не получаю ошибку импорта. Так что, возможно, ошибка связана с тем, как я пытаюсь открыть приложение? Я отправляю исполняемый файл по электронной почте на другой компьютер и пытаюсь открыть, но он не похож на исполняемый файл.

Ответ №1:

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

Для Mac OS вы можете запустить свое приложение в командной строке, т.е. ./dist/my_gui в терминале, вместо того, чтобы нажимать на my_gui.app.

Итак, если у вас есть исполняемый файл на другом компьютере, вам нужно убедиться, что вы разархивировали файл, затем cd в каталог, где у вас есть исполняемый файл, затем запустите его как ./PokerHand .

Если вы можете получить сообщение об ошибке при запуске вашего исполняемого файла на другом компьютере, тогда у вас будет больше информации. Если вы получаете запутанный вывод, я бы посоветовал вам начать с создания супер минимальной программы «hello world» и тестирования с ней. Если минимальный скрипт работает без сообщения об ошибке, попробуйте постепенно добавлять зависимости / функциональность вашей программы, пока не получите простейший из возможных примеров, который по-прежнему дает сбой.

Несколько других моментов:

Если вы скомпилируете исполняемый файл с помощью Pyinstaller на Mac, он будет работать только на Mac (то же самое касается Windows и Linux).

В общем, Pyinstaller может позаботиться о включении всех модулей автоматически, но иногда это работает некорректно. Существует несколько способов решения этой проблемы, более подробно описанных в документации Pyinstaller. Иногда Pyinstaller сможет объединить модуль без всех его зависимостей. Например, в одном из моих проектов Pyinstaller правильно связался, scipy но пропустил scipy.optimize то, что требовалось моей программе для запуска. Я использовал файл .spec, добавил scipy.optimize в свой hidden_imports, и все работало нормально.