如何使 Python 脚本独立可执行以在没有任何依赖项的情况下运行? [复制]
Posted
技术标签:
【中文标题】如何使 Python 脚本独立可执行以在没有任何依赖项的情况下运行? [复制]【英文标题】:How can I make a Python script standalone executable to run without ANY dependency? [duplicate] 【发布时间】:2011-07-24 09:40:53 【问题描述】:我正在构建一个 Python 应用程序,不想强迫我的客户安装 Python 和模块。
那么,有没有办法将 Python 脚本编译为独立的可执行文件?
【问题讨论】:
问题中“我不想强迫我的客户安装 Python 和模块”的部分。这并不是说客户不能这样做,而是说开发人员不想要求他们这样做。在这里辩论这一点没有意义,因为客户不是在阅读 SO 来为自己说话。我不想安装 Flash 开发环境来观看 youtube,或者安装 C 开发环境来玩数独,或者安装 Python 开发环境来运行用 Python 编写的愤怒的小鸟版本。这就是可再发行运行时的用途。 包含许多文件但只有一个用于运行应用程序的答案是否可以接受?我正在考虑使用可移植的 Python 分发包对应用程序 + 需求进行某种自动化打包,并制作一个安装脚本来自动化它。 【参考方案1】:您可以使用PyInstaller 将 Python 程序打包为独立的可执行文件。它适用于 Windows、Linux 和 Mac。
PyInstaller 快速入门
从 PyPI 安装 PyInstaller:
pip install pyinstaller
进入你的程序目录并运行:
pyinstaller yourprogram.py
这将在名为
dist
的子目录中生成捆绑包。pyinstaller -F yourprogram.py
添加 -F(或 --onefile)参数会将所有内容打包到单个“exe”中。
pyinstaller -F --paths=<your_path>\Lib\site-packages yourprogram.py
遇到“ImportError”,您可能会考虑使用附加包。
pip install pynput==1.6.8
仍在 Import-Erorr 中运行 - 尝试降级 pyinstaller - 请参阅 Getting error when using pynput with pyinstaller
如需更详细的演练,请参阅manual。
【讨论】:
值得注意的是,pyinstaller 可以编译成单个 .exe 文件。同样在哪个操作系统上运行,使 that 可执行,即在 Windows 上运行时的 .exe 正如@GeenHenk 所说,如果你在 Windows 上“编译”它会生成一个 exe,请记住,你不能在 Linux 上为 Windows 编译(制作一个 exe),或者在视窗。您只能制作您正在运行的平台的可执行文件。 (在 Linux 中你可以使用 wine 来欺骗) 使用“pyinstaller”比“py2exe”容易得多。它负责处理所有依赖项,包括 numpy、pandas 等,并为您提供工作平台上的单个可执行文件! 看起来正是我想要的。现在支持 Python 3!谢谢:) 我都试过了,PyInstaller 和其他的(py2exe、freeze、cython、python 的嵌入式版本等)至少在 Windows 中仍然无法处理 python 动态库本身的依赖关系(python *.dll)。 dll 依赖于必须单独安装的运行时。在此过程之后,您将获得将链接到 dll 的可执行文件,因此具有相同的可导入性。因此,您的“独立”可执行文件并不是独立的,而更像是可嵌入的。要解决运行时依赖项,您必须使用cpython
项目从源代码重建 python。【参考方案2】:
您可以使用已回答的py2exe 并使用Cython 转换.pyc
中的密钥.py
文件,C 编译文件,如Windows 中的.dll
和Linux 中的.so
。
还原比普通的.pyo
和.pyc
文件要困难得多(而且性能也会提高!)。
【讨论】:
感谢您的回答。我考虑过 Cython,但它似乎仍然需要 Python 来运行已编译的可执行文件。您的意思是使用 Cython 将脚本编译为 .pyc 吗? (不知道Cython有没有这个功能) 我的意思是你有两个问题:闭源和无依赖。对于封闭源代码,使用 Cython 在 C 库中编译您的 重要 代码。对于 no-deps,使用 py2exe 并在其中制作一个包含 .pyd(cython 编译)文件的可执行文件。 你会如何处理库(numpy、scipy、matplotlib)?例如,客户端如何能够从可执行文件中使用 matplotlib 中的 ginput() 函数,而无需在他们的计算机上安装它。 @chimpsarehungry 静态链接怎么样? 最后一个版本似乎是在 2008 年,这仍然保持吗?【参考方案3】:您可能希望调查Nuitka。它获取 Python 源代码并将其转换为 C++ API 调用。然后它编译成可执行二进制文件(Linux 上的 ELF)。它已经存在了几年,并且支持多种 Python 版本。
如果您使用它,您可能还会获得性能提升。推荐。
【讨论】:
Nuitka 是一个很棒的工具。没有必要不用它。我只想指出一件事——它不仅限于 Linux——它是跨平台——另一个使用它的原因。 Nuitka 适用于 Python 2.6、2.7、3.2、3.3 和 3.4,并且是跨平台的:(Linux、FreeBSD、NetBSD、MacOS X 和 Windows(32/64 位)。其他可能也可以工作。架构:x86、x86_64 (amd64) 和 arm。其他架构也可以工作,开箱即用。) 最新的 3.6.. 不支持它,在 windows 上设置是一场噩梦 在 macOS High Sierra + Python 3.5.2 上像魅力一样工作。谢谢! 这会创建一个独立的可执行文件吗?【参考方案4】:是的,可以将 Python 脚本编译成独立的可执行文件。
PyInstaller 可用于将 Python 程序转换为独立的可执行文件,在 Windows、Linux、Mac OS X、FreeBSD、Solaris 和 AIX。它是推荐的转换器之一。
py2exe 将 Python 脚本转换为只能在 Windows 平台上执行的脚本。
Cython 是 Python 编程语言和扩展 Cython 编程语言的静态编译器。
【讨论】:
谢谢。我使用的是py2exe,根本无法使用它的图标。 PyInstaller 第一次工作,看起来很棒! 我可以从 Windows 为 Linux 和 macOS 创建独立的可执行文件吗?或者我应该在 VirtualBox 上安装 Linux 和 macOS?我的笔记本电脑上没有足够的可用空间。 我在这里的文档中找到了我的问题的答案:pyinstaller.readthedocs.io/en/stable/…【参考方案5】:我想整理一些关于使用 Python 2.7 在 Windows 上创建独立文件的有用信息。
我使用过 py2exe 并且可以正常工作,但是我遇到了一些问题。
在 Windows 64 位中创建单个文件时出现了一些问题:Using bundle_files = 1 with py2exe is not working;
需要创建一个 setup.py 文件才能使其工作。 http://www.py2exe.org/index.cgi/Tutorial#Step2;
我遇到了依赖项问题,您必须通过在安装文件中导入包来解决这些问题;
我无法让它与PyQt一起工作。
最后一个原因让我尝试 PyInstaller http://www.pyinstaller.org/。
在我看来,这要好得多,因为:
它更易于使用。我建议使用以下行创建一个 .bat 文件,例如(pyinstaller.exe 必须在 Windows 路径中):
pyinstaller.exe --onefile MyCode.py
您可以创建单个文件以及其他选项 (https://pyinstaller.readthedocs.io/en/stable/usage.html#options)。
我在使用 PyInstaller 和 multiprocessing 包时只有一个问题,通过使用这个配方解决了这个问题:https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessing。
所以,我认为,至少对于 python 2.7,一个更好、更简单的选择是 PyInstaller。
【讨论】:
--onefile
标志不会帮助您使其在 Windows 上可移植,因为可执行文件仍希望与必须通过安装的 api-ms-win-crt-runtime-l1-1-0.dll
库(或/和其他)链接vcredist
包。所以依赖仍然存在,必须在运行之前安装。【参考方案6】:
第三个选项是cx_Freeze
,它是跨平台的。
【讨论】:
这里是 2019 年 2 月,自 2017 年底以来,pypi 上没有列出cx_Freeze
版本。这个项目被放弃了吗?
抱歉,我知道我来晚了(2020 年),但不,cx_Freeze 没有被放弃!维护者仍在推送更新,尽管速度要慢得多。【参考方案7】:
pyinstaller yourfile.py -F --onefile
这会在 Windows 上创建一个独立的 EXE 文件。
重要提示 1:EXE 文件将在名为“dist”的文件夹中生成。
重要提示 2:不要忘记 --onefile 标志
您可以使用pip install PyInstaller
安装 PyInstaller
注意:在极少数情况下,存在隐藏的依赖项...因此,如果您运行 EXE 文件并出现缺少库错误(以下示例中为 win32timezone),请使用以下内容:
pyinstaller --hiddenimport win32timezone -F "Backup Program.py"
【讨论】:
【参考方案8】:我喜欢PyInstaller——尤其是“窗口”变体:
pyinstaller --onefile --windowed myscript.py
它将在一个目录/文件夹中创建一个单独的 *.exe 文件。
【讨论】:
你是否已经在没有 python 的目标机器上尝试过这个?这是如何获得投票的? 你是什么意思,@AbdullahSaid?为什么有人会在没有 Python 的机器上使用 pyinstaller? 我没这么说。我的意思是,如果可执行文件将在没有安装 python 的机器上运行。或者我应该说“客户 PC”,我已经在没有 python 的虚拟机上尝试过它,但它不起作用,你为什么要为自己创建一个安装程序?您的意思是编写它以便其他PC可以在没有任何依赖关系的情况下安装它吗?阅读上面的标题 @AbdullahSaid 目标系统不需要单独安装 Python,它被打包在生成的 exe 文件中。否则这没有多大意义。执行时,exe 文件会将自身解压到它自己的临时文件夹中并从那里获取所有内容!【参考方案9】:您可能会喜欢py2exe。您还可以在其中找到有关在 Linux 上执行此操作的信息。
【讨论】:
但是你需要给它打包所有选项。 这是如何获得投票的?你是已经尝试过了还是只是根据你的意见说了什么【参考方案10】:使用 py2exe.... 使用以下设置文件:
from distutils.core import setup
import py2exe
from distutils.filelist import findall
import matplotlib
setup(
console = ['PlotMemInfo.py'],
options =
'py2exe':
'packages': ['matplotlib'],
'dll_excludes': ['libgdk-win32-2.0-0.dll',
'libgobject-2.0-0.dll',
'libgdk_pixbuf-2.0-0.dll']
,
data_files = matplotlib.get_py2exe_datafiles()
)
【讨论】:
我这样做了,它创建了一个 python27.dll 文件,它仍然是必需的。我将 .exe 文件移出保存 python27.dll 文件的文件夹,并且 .exe 文件不再运行。 你可以为 Linux 和 macOS 展示这样的脚本吗?我想从 Windows 为 Linux 和 macOS 创建独立的可执行文件。【参考方案11】:我还推荐 PyInstaller 以获得更好的向后兼容性,例如 Python 2.3 - 2.7。
对于 py2exe,您必须拥有 Python 2.6。
【讨论】:
pyinstaller 有导入问题。例如:在我的情况下,我在这个目录中 ~/Documents/python101/ 和 ex50_pycomp.py & ex50.py 在这个目录中。 ex50_pycomp.py 导入 ex50.py。我运行 pyinstaller ex50_pycomp.py,我看到所有已编译、生成的 dist。没事吧?我 cd 进入 dist/ex50_pycomp/ 并运行 ex50_pycomp 它可以工作。一旦我将这个 ex50_pycom 放入虚拟机中,就会出现导入错误,在另一个 linux 框中显示“-bash: ./ex_50_pycom: cannot execute binary file: Exec format error” prob1:我使用的是 python2.7,但 pyinstaller 正在与 python3 python3 setup.py build python3 setup.py install 你的 python3 将获得所有 pkg_resources 问题 3:如果使用 sys_path 成为问题,所以给你像这样的路径 pyinstaller --hidden-import=pkg_resources --onefile file.py --path=my_path rw-rw-r-- my_path:python3 的 dist 文件夹 pyinstaller --hidden-import=pkg_resources --onefile file.py -- path=/usr/local/lib/python3.5/dist-packages/my_code_lib-0+untagged.8.gd264bd5.dirty-py3.5.egg/my_folder -rw-rw-r--【参考方案12】:对于 Python 3.2 脚本,唯一的选择是 cx_Freeze。从源头构建它;否则将无法正常工作。
对于 Python 2.x,我建议使用 PyInstaller,因为它可以将 Python 程序打包到单个可执行文件中,这与 cx_Freeze 不同,它还输出库。
【讨论】:
【参考方案13】:py2exe 会生成您想要的 EXE 文件,但您需要在要使用新 EXE 文件的机器上安装相同版本的 MSVCR90.dll。
请参阅 Tutorial 了解更多信息。
【讨论】:
【参考方案14】:您可以在 Distribution Utilities 找到列出的分发实用程序列表。
我使用bbfreeze,它运行良好(但还支持 Python 3)。
【讨论】:
***.com/questions/33683133/… 我用的是 bbfreeze 非常不错的包。 它会处理依赖关系并安装相关的py模块吗? @Volatil3 是的,所有的依赖关系都得到了处理。 WRT 在主机系统上安装模块 - 有不同类型的编译。 bbfreeze 会将所有内容编译成多个.so
文件,或直接复制 .egg 文件,它们都应存在于单个目录中(或作为单个文件)。无需安装。【参考方案15】:
由于当前的答案列表中似乎缺少它,我认为值得一提的是标准库包含一个可用于此目的的zipapp
模块。它的基本用法只是将一堆 Python 文件压缩成一个扩展名为 .pyz
的 zip 文件,而不是可以直接以 python myapp.pyz
执行,但你也可以从 requirements.txt
文件中制作一个独立的包:
$ python -m pip install -r requirements.txt --target myapp
$ python -m zipapp -p "interpreter" myapp
其中interpreter
可以是/usr/bin/env python
之类的东西(请参阅Specifying the Interpreter)。
通常,生成的.pyz
/ .pyzw
文件在 Unix 中应该是可执行的,因为它会被标记为可执行文件,而在 Windows 中,因为 Python 安装通常会注册这些扩展名。但是,make a Windows executable 相对容易,只要用户在路径中有python3.dll
,它就应该可以工作。
如果您不想要求最终用户安装 Python,您可以将应用程序与 the embeddable Python package 一起分发。
【讨论】:
【参考方案16】:不完全是 Python 代码的打包,但现在还有来自 Google 的 Grumpy,它将代码转换为 Go。
它不支持 Python C API,因此它可能不适用于所有项目。
【讨论】:
今天看来它已经死了。【参考方案17】:使用PyInstaller,我找到了一个更好的方法,使用.exe 的快捷方式而不是使用--onefile
。无论如何,周围可能有一些数据文件,如果您正在运行基于站点的应用程序,那么您的程序也依赖于 HTML、javascript 和 CSS 文件。将所有这些文件移动到某个地方没有任何意义......相反,如果我们将工作路径向上移动会怎样?
创建 EXE 文件的快捷方式,将其移至顶部并按指定设置目标和起始路径,以使相对路径转到 dist\folder:
Target: %windir%\system32\cmd.exe /c start dist\web_wrapper\web_wrapper.exe
Start in: "%windir%\system32\cmd.exe /c start dist\web_wrapper\"
我们可以将快捷方式重命名为任何东西,因此重命名为“GTFS-Manager”。
现在当我双击快捷方式时,就好像我python
-运行文件一样!我发现这种方法比--onefile
更好:
-
在 onefile 的情况下,Windows 7 操作系统缺少 .dll 存在问题,需要事先安装,等等。打哈欠。使用包含多个文件的通常构建,没有此类问题。
我的 Python 脚本使用的所有文件(它正在部署一个 tornado Web 服务器,并且需要一个完整的网站文件价值!)不需要移动到任何地方:我只需在顶部创建快捷方式。
我实际上可以在Ubuntu(运行
python3 myfile.py
)和Windows(双击快捷方式)上使用这个完全相同的文件夹。
我不需要为过于复杂的 .spec 文件破解来包含数据文件等而烦恼。
哦,记得在构建后删除构建文件夹。它会节省大小。
【讨论】:
嗨,刚刚更新.. 我决定放弃 UPX 压缩并最终采用 --onefile 方式。必须选择一个,因为 UPX 目前在压缩特定 DLL 时存在错误。【参考方案18】:使用Cython 转换为C,编译并与GCC 链接。
另一种可能是,在 C 中制作核心函数(您希望难以反转的那些),编译它们并使用 Boost.Python 导入编译后的代码(另外,您可以获得更快的代码执行速度)。然后使用提到的任何工具进行分发。
【讨论】:
【参考方案19】:我听说PyRun 也是一个选项。目前支持 Linux、FreeBSD 和 Mac OS X。
【讨论】:
欢迎提供解决方案链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted.以上是关于如何使 Python 脚本独立可执行以在没有任何依赖项的情况下运行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章