#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=u4ykDbciXa82. Попробовал. Исполняемый файл сообщил об ошибке, когда я попытался открыть.
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, и все работало нормально.