首页 > 解决方案 > Pyinstaller 可执行文件仅适用于同一台机器 [python]

问题描述

为什么我的可执行文件只能在生成它的机器上运行?我在pyinstallerMacOS Mojave 10.14.3 上使用 Python 3.7.1 和 3.4。我的简单程序只导入没有其他依赖项的随机模块和我自己的模块。

这是我用来创建可执行文件的命令:

$ 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,我什么也得不到。难道我做错了什么?

标签: pythonpyinstaller

解决方案


确保您正在终端中运行生成的可执行文件,以便您可以获得可能生成的任何错误消息(特别是参见文档的此部分):

对于 Mac OS,您可以在命令行上运行您的应用程序,即./dist/my_gui在终端中,而不是单击 my_gui.app。

因此,如果您的可执行文件在另一台机器上,您需要确保已解压缩文件,然后cd进入您拥有可执行文件的目录,然后以./PokerHand.

如果您在另一台机器上运行可执行文件时收到错误消息,那么您将获得更多信息。如果您对输出感到困惑,我建议您先制作一个超级最小的“hello world”程序并进行测试。如果一个最小的脚本可以在没有错误消息的情况下工作,那么尝试逐渐添加程序的依赖项/功能,直到你得到最简单但仍然失败的示例。

其他几点:

如果您在 Mac 上使用 Pyinstaller 编译可执行文件,它只能在 Mac 上运行(Windows 和 Linux 也是如此)。

一般来说,Pyinstaller 可以自动包含所有模块——但有时它不能正常工作。有几种方法可以处理这个问题,在 Pyinstaller文档中有更详细的解释。有时 Pyinstaller 将能够捆绑一个没有所有依赖项的模块。例如,在我的一个项目中,Pyinstaller 正确捆绑scipy但错过了scipy.optimize,这是我的程序需要运行的。我使用了一个 .spec 文件,添加scipy.optimize到我的 hidden_​​imports 中,一切正常。


推荐阅读