PyInstaller 包烧瓶应用程序无法加载 Python 库,dlopen -> 找不到图像

Posted

技术标签:

【中文标题】PyInstaller 包烧瓶应用程序无法加载 Python 库,dlopen -> 找不到图像【英文标题】:PyInstaller packaged flask app failes to load Python Library, dlopen -> image not found 【发布时间】:2016-06-14 16:32:08 【问题描述】:

我使用 PyInstaller 打包了一个 this simple flask app,但我的 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 上运行它,我遇到了同样的问题。

【问题讨论】:

有没有试过打包后添加图片?我不确定包装是否添加了图像(不是 100% 确定),但我过去也遇到过类似的问题,并且在包装后添加了 img @glls 我不确定这是我丢失的图像。我的代码没有使用任何特殊的东西...... myscript.app/Contents/MacOS/Python, 10): image not found --- 你想加载一些图像吗?也许我错过了什么? 我不想加载任何特殊图像或任何东西。这个项目唯一的依赖是烧瓶。我还尝试打包一个刚刚打印“hello world”的应用程序,我得到了同样的错误.. 我想说 PyInstaller 本身并没有打包 python.. 【参考方案1】:

我确实意识到这是一篇旧帖子,但只是遇到了同样的问题,并找到了可能的解决方案 - 以防万一其他人发现它有用。可能不太理想,我敢肯定哪里少了点什么,但无论如何……

pyinstaller 在 dist 目录中创建一个 myscript 目录和一个 myscript.app 文件。我设法通过手动将 dist/myscript 中的所有内容复制到 myscript.app/Contents/MacOS 中来运行应用程序

之后myscript.app文件为我成功启动了程序,也可以在没有myscript目录的情况下分发。

不知道为什么 pyinstaller 不会自动复制所有内容。

【讨论】:

【参考方案2】:

正如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 一样。如您所见,每个类都以某种方式嵌套到下一个类中,因此这只会将您的构建嵌套到您的包中。

【讨论】:

以上是关于PyInstaller 包烧瓶应用程序无法加载 Python 库,dlopen -> 找不到图像的主要内容,如果未能解决你的问题,请参考以下文章

Pyinstaller“无法执行脚本pyi_rth_pkgres”和缺少包

SDL2 错误:使用 pyinstaller 冻结 kivy 应用程序时“无法加载图像 <default.png>”

Pyinstaller安装以及参数使用

Kivy,Python:我无法减小 PyInstaller 生成的包的大小

生成的 windows exe (pyinstaller) 无法加载 _cffi_backend

当我触摸 wsgi 脚本时,带有 mod_wsgi 的烧瓶应用程序不会重新加载