我使用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上运行它,我也遇到同样的问题。
答案 0 :(得分:1)
我确实认识到这是一个旧帖子,但只是遇到了同样的问题,并找到了一个可能的解决方案 - 以防其他人发现它有用。可能它不理想,我确定某些地方肯定会遗漏,但无论如何......
pyinstaller在dist目录中创建一个myscript目录和一个myscript.app文件。我设法通过手动将所有内容从dist / myscript复制到myscript.app/Contents/MacOS
来运行应用程序之后myscript.app文件为我成功启动了程序,也可以在没有myscript目录的情况下发布。
不知道为什么pyinstaller不会自动复制所有内容。
答案 1 :(得分:0)
正如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一样捆绑所有部分。如您所见,每个类都以某种方式嵌套到下一个类中,因此这只会将您的构建嵌套到您的包中。