从 Python 项目创建单个可执行文件

Posted

技术标签:

【中文标题】从 Python 项目创建单个可执行文件【英文标题】:Create a single executable from a Python project 【发布时间】:2012-08-17 01:45:04 【问题描述】:

我想从我的 Python 项目中创建一个可执行文件。用户应该能够在不需要安装 Python 的情况下下载和运行它。如果我只是分发一个包,我可以使用 pip、wheel 和 PyPI 来构建和分发它,但这需要用户拥有 Python 并且知道如何安装包。我可以使用什么来从 Python 项目构建自包含的可执行文件?

【问题讨论】:

我仍在编写 2.x(确切地说是 2.7.2),但可能需要转移到 3.x(如果模块等兼容),然后需要一个解决方案也是。 请注意,打包会使问题诊断变得非常复杂。不仅您(或pdb)无法轻松访问正在执行的文件,py2exe(不知道其他人)不包括.py 文件,因此您不会在堆栈跟踪中看到源代码行。 作为一个兴趣点,我已经开始使用 pyinstaller 【参考方案1】:

这里有一些常见的。我只包含了截至我上次编辑(2021 年 7 月)正在积极维护的项目。

除非另有说明,否则下面列出的所有程序都将生成专门针对其运行的操作系统的 exe。例如,在 Windows 中运行 Pyinstaller 将生成 Windows exe,但在 Linux 中运行 Pyinstaller 将生成 Linux exe。如果您想为多个操作系统生成 exe,则必须考虑使用虚拟机或类似 Wine 的东西。


以下程序的工作方式都类似——它们将 Python 和您的程序捆绑在一起,有效地将它们组合在一起以生成可执行文件。

PyInstaller:

Website || Repo || PyPi

在 Windows、Mac 和 Linux 上支持 Python 3.5 - 3.9。

cx_Freeze:

Website || Repo || PyPi

在 Windows、Mac 和 Linux 上支持 Python 3.6 - 3.9。

py2exe:

Website || Repo || PyPi

仅在 Windows 上支持 Python 3.6 - 3.9。

py2app:

Website || Repo || PyPi

仅在 Mac 上支持 Python 2.7 (?) 和 Python 3 (?)。支持的 Python 版本的确切范围目前没有记录。


当然,这不是唯一的做事方式:

pynsist:

Website || Repo || PyPi

Pynsist 将为您的程序创建一个 Windows 安装程序,它将直接在用户的计算机上安装 Python,而不是将其与您的代码捆绑在一起并创建链接到您的 Python 脚本的快捷方式。

pynsist 工具本身需要 Python 3.5+ 才能运行,但支持将任何版本的 Python 与您的程序捆绑在一起。

Pynsist 将仅创建 Windows 安装程序,但可以在 Windows、Mac 和 Linux 上运行。详情请见their FAQ。

努伊特卡:

Website || Repo (Github mirror) || PyPi

Nuitka 将真正编译您的 Python 代码并生成一个 exe(与其他项目相反,后者仅包含 Python)来尝试加速您的代码。作为副作用,您还将获得一个可以分发的方便的 exe。请注意,您的系统上需要有一个C++ compiler。

在 Windows、Mac 和 Linux 上支持 Python 2.6 - 2.7 和 Python 3.3 - 3.9。

cython:

Website || Repo || PyPi

Cython 类似于 Nuitka,因为它是一个 Python 编译器。但是,它不会直接编译您的代码,而是将其编译为 C。然后您可以获取该 C 代码和turn your code into an exe。您需要在系统上安装 C 编译器。

在 Windows、Mac 和 Linux 上支持 Python 2.6 - 2.7 和 Python 3.3 - 3.9。


我个人的偏好是使用 PyInstaller,因为它对我来说最容易启动和运行,旨在与各种流行的库(如 numpy 或 pygame)很好地配合使用,并且与各种操作系统和 Python 版本具有很好的兼容性。

不过,我也成功地使用 cx_Freeze 构建了各种 exe,没有太大的困难,所以你也应该考虑尝试一下这个程序。

我还没有机会广泛尝试 pynist、Nuitka 或 Cython,但它们似乎是非常有趣和创新的解决方案。如果您在使用第一组程序时遇到问题,可能值得尝试这三个程序中的一个。由于它们的工作原理与 Pyinstaller/cx_freeze 风格的程序根本不同,它们可能会在第一组失败的奇怪边缘情况下成功。

特别是,我认为 pynist 是一种很好的方式,可以完全回避整个分发代码的问题:Mac 和 Linux 已经对 Python 提供了原生支持,仅在 Windows 上安装 Python 可能确实是最干净的解决方案。 (缺点是您现在需要担心针对多个版本的 Python + 安装库)。

Nuitka 和 Cython(以我有限的经验)似乎工作得相当好。同样,我自己并没有对它们进行过广泛的测试,所以我的主要观察是,它们生成 exe 所需的时间似乎比“冻结”风格的程序要长得多。


话虽如此,将 Python 程序转换为可执行文件不一定是分发代码的唯一方式。要详细了解其他可用选项,请参阅以下链接:

https://packaging.python.org/overview/#packaging-python-applications https://docs.python-guide.org/shipping/packaging/#for-linux-distributions

【讨论】:

请注意,您还需要在捆绑包中包含Microsoft C++ Redistributables(又名msvcrxx.dll,其中xx 是版本号)以使.exe 运行(或要求用户安装它)通过他们自己)。这是必要的,因为 Python 是使用 Visual Studio 在 Windows 上构建的。 所以看起来没有一个 python IDE(pycharm 或 pydev - eclipse 插件)尚未将编译为单一可执行文件的功能合并到 IDE 本身中。那是对的吗? :-) 如果您关心保护源代码的安全,Cython 可能是最佳选择,因为它编译 C 代码。那些使用冻结技术的程序通常可以很容易地被反编译。 PyInstaller 在上面被列为支持 Python 3.7。根据我的经验和 pyinstaller.org 上的描述,这是不正确的,其中指出“PyInstaller 可与 Python 2.7 和 3.3-3.6 一起使用”。 @Tom -- 经过一番挖掘,看起来 pyinstaller 本身确实支持 Python 3.7,但他们还没有正式发布支持 3.7 的新版本。 (例如,他们的github repo 声明他们支持 Python 3.7 + 他们似乎没有与 3.7 相关的未解决问题,但 PyPi 上最新版本的 pyinstaller 来自 2017 年 12 月)。因此,如果您需要 3.7 支持,您可以尝试直接从源代码构建 + 安装 pyinstaller,或者等到下一个版本。 (当然也可以使用其他程序)【参考方案2】:

最好使用pip install auto-py-to-exe,它提供了一个漂亮的用户界面,其中包含创建可执行文件所需的所有选项。

安装后只需在终端或命令提示符中输入auto-py-to-exe

【讨论】:

【参考方案3】:

pyinstaller 仍在积极开发中。你可以在 GitHub 上看到the latest changes。

它支持所有三个主要平台:

Windows(32 位和 64 位) Linux(32 位和 64 位) Mac OS X(32 位和 64 位)

它支持 Python 2.6 和 2.7 版本。它不支持 Python 3,但有一个实验性的Python 3 branch。

更新

从 3.2.1 版开始,它支持 Python 2.7、3.3-3.5

【讨论】:

以上是关于从 Python 项目创建单个可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pyinstaller 或 Cython 从 Python 模块创建可执行文件

用PyInstaller把Python代码打包成单个独立的exe可执行文件

python3项目打包成exe可执行程序

如何在 Visual Studio 2008 中创建单个可执行文件?

从具有依赖项的python程序创建可执行文件

为啥我不能从我的 python 脚本创建可执行文件?