Пакетное приложение PyInstaller не может загрузить библиотеку Python, dlopen - ›изображение не найдено

Я упаковал это простое приложение-флягу с помощью PyInstaller, но мой исполняемый файл OSX не запускается и показывает следующий исполняемый файл,

Error loading Python lib '/Users/ahmed/Code/play/py-install-tut/dist/myscript.app/Contents/MacOS/Python': dlopen(/Users/ahmed/Code/play/py-install-tut/dist/myscript.app/Contents/MacOS/Python, 10): image not found

Я предполагаю, что PyInstaller не упаковывает Python с моим приложением. Вот что я побежал,

$ pyinstaller hello_flask.spec --onedir
83 INFO: PyInstaller: 3.2
83 INFO: Python: 3.4.3
87 INFO: Platform: Darwin-13.4.0-x86_64-i386-64bit
89 INFO: UPX is not available.
90 INFO: Extending PYTHONPATH with paths
['/Users/ahmed/Code/play/py-install-tut',
 '/Users/ahmed/Code/play/py-install-tut']
90 INFO: checking Analysis
99 INFO: checking PYZ
104 INFO: checking PKG
105 INFO: Building because toc changed
105 INFO: Building PKG (CArchive) out00-PKG.pkg
144 INFO: Bootloader /opt/boxen/pyenv/versions/3.4.3/Python.framework/Versions/3.4/lib/python3.4/site-packages/PyInstaller/bootloader/Darwin-64bit/run_d
144 INFO: checking EXE
145 INFO: Building because toc changed
145 INFO: Building EXE from out00-EXE.toc
145 INFO: Appending archive to EXE /Users/ahmed/Code/play/py-install-tut/build/hello_flask/hello_flask
155 INFO: Fixing EXE for code signing /Users/ahmed/Code/play/py-install-tut/build/hello_flask/hello_flask
164 INFO: checking COLLECT
WARNING: The output directory "/Users/ahmed/Code/play/py-install-tut/dist/hello_flask" and ALL ITS CONTENTS will be REMOVED! Continue? (y/n)y
1591 INFO: Removing dir /Users/ahmed/Code/play/py-install-tut/dist/hello_flask
1597 INFO: Building COLLECT out00-COLLECT.toc
2203 INFO: checking BUNDLE
WARNING: The output directory "/Users/ahmed/Code/play/py-install-tut/dist/myscript.app" and ALL ITS CONTENTS will be REMOVED! Continue? (y/n)y
3947 INFO: Removing dir /Users/ahmed/Code/play/py-install-tut/dist/myscript.app
3948 INFO: Building BUNDLE out00-BUNDLE.toc
3972 INFO: moving BUNDLE data files to Resource directory

Когда я открываю содержимое упакованного приложения в OSX, я получаю следующие файлы:

myscript.app/Contents/MacOS/
  _struct.cpython-34m.so
  hello_flask
  zlib.cpython-34m.so

Когда я дважды щелкаю указанный выше исполняемый файл hello_flask, я получаю следующий вывод в моем терминале:

/Users/ahmed/Code/play/py-install-tut/dist/myscript.app/Contents/MacOS/hello_flask ; exit;                        
PyInstaller Bootloader 3.x
LOADER: executable is /Users/ahmed/Code/play/py-install-tut/dist/myscript.app/Contents/MacOS/hello_flask
LOADER: homepath is /Users/ahmed/Code/play/py-install-tut/dist/myscript.app/Contents/MacOS
LOADER: _MEIPASS2 is NULL
LOADER: archivename is /Users/ahmed/Code/play/py-install-tut/dist/myscript.app/Contents/MacOS/hello_flask
LOADER: Extracting binaries
LOADER: Executing self as child
LOADER: set _MEIPASS2 to /Users/ahmed/Code/play/py-install-tut/dist/myscript.app/Contents/MacOS
PyInstaller Bootloader 3.x
LOADER: executable is /Users/ahmed/Code/play/py-install-tut/dist/myscript.app/Contents/MacOS/hello_flask
LOADER: homepath is /Users/ahmed/Code/play/py-install-tut/dist/myscript.app/Contents/MacOS
LOADER: _MEIPASS2 is /Users/ahmed/Code/play/py-install-tut/dist/myscript.app/Contents/MacOS
LOADER: archivename is /Users/ahmed/Code/play/py-install-tut/dist/myscript.app/Contents/MacOS/hello_flask
LOADER: Already in the child - running user's code.
LOADER: Python library: /Users/ahmed/Code/play/py-install-tut/dist/myscript.app/Contents/MacOS/Python
Error loading Python lib '/Users/ahmed/Code/play/py-install-tut/dist/myscript.app/Contents/MacOS/Python': dlopen(/Users/ahmed/Code/play/py-install-tut/dist/myscript.app/Contents/MacOS/Python, 10): image not found
LOADER: Back to parent (RC: 255)
LOADER: Doing cleanup
LOADER: Freeing archive status for /Users/ahmed/Code/play/py-install-tut/dist/myscript.app/Contents/MacOS/hello_flask

[Process completed]

Я также пробовал запускать это на Mac OSX коллег, и у меня такая же проблема.


person user772401    schedule 14.06.2016    source источник
comment
Вы пробовали добавить изображение после упаковки приложения? Я не уверен, что упаковка добавляет изображения (не уверен на 100%), но у меня были аналогичные проблемы в прошлом, и я добавил img после упаковки   -  person glls    schedule 14.06.2016
comment
@glls Я не уверен, что это за изображение, которое мне не хватает. Мой код не использует ничего особенного ...   -  person user772401    schedule 14.06.2016
comment
myscript.app/Contents/MacOS/Python, 10): изображение не найдено --- вы пытаетесь загрузить какое-то изображение? может я что-то упускаю?   -  person glls    schedule 14.06.2016
comment
Я не пытаюсь загрузить какое-то специальное изображение или что-то в этом роде. Единственная зависимость этого проекта - это флакон. Я также попытался упаковать приложение, которое только что напечатало «привет, мир», и получаю ту же ошибку ..   -  person user772401    schedule 14.06.2016
comment
Я хочу сказать, что PyInstaller не упаковывает сам python.   -  person user772401    schedule 14.06.2016
comment
Можете ли вы поделиться примером того, что вы пытаетесь упаковать, что приводит к такой же ошибке?   -  person glls    schedule 14.06.2016
comment
github.com/SimplyAhmazing/pyinstaller-tut 'hello_flask.py'   -  person user772401    schedule 14.06.2016


Ответы (2)


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

Pyinstaller создает каталог myscript и файл myscript.app в каталоге dist. Мне удалось запустить приложение, вручную скопировав все из dist / myscript в myscript.app/Contents/MacOS

После этого файл myscript.app успешно запустил для меня программу, а также может распространяться без каталога myscript.

Понятия не имею, почему pyinstaller не копирует все автоматически.

person Ireneusz    schedule 11.09.2017

Как упоминалось в сообщении Ireneusz, вы можете скопировать пакет из папки hello_flask, и он будет работать, но при условии Для получения дополнительной информации о том, как заставить PyInstaller выполнять эту работу за вас, отредактируйте свой класс спецификации BUNDLE следующим образом:

a = Analysis(...
pyz = PYZ(a...
exe = EXE(pyz, a...
coll = COLLECT(exe, a...
app = BUNDLE(coll,...

Если вы укажете класс BUNDLE на объект COLLECT, а не на EXE, сборка объединит все части, как и в случае с dist. Как видите, каждый класс каким-то образом вложен в следующий, так что это просто вложит вашу сборку в ваш бандл.

person PrimalCurve    schedule 13.05.2019