我想从我的 Python 项目中创建一个可执行文件。用户应该能够下载并运行它而无需安装 Python。如果我只是分发一个包,我可以使用 pip、wheel 和 PyPI 来构建和分发它,但这需要用户有 Python 并且知道如何安装包。我可以使用什么来从 Python 项目构建自包含的可执行文件?
3 回答
这里有一些常见的。我只包含了截至我上次编辑(2021 年 7 月)正在积极维护的项目。
除非另有说明,否则下面列出的所有程序都将生成专门针对其运行的操作系统的 exe。例如,在 Windows 中运行 Pyinstaller 将生成 Windows exe,但在 Linux 中运行 Pyinstaller 将生成 Linux exe。如果你想为多个操作系统生成一个 exe,你将不得不考虑使用虚拟机或类似Wine的东西。
以下程序的工作方式都相似——它们将 Python 和您的程序捆绑在一起,有效地将它们组合在一起以生成可执行文件。
PyInstaller:
在 Windows、Mac 和 Linux 上支持 Python 3.5 - 3.9。
cx_冻结:
在 Windows、Mac 和 Linux 上支持 Python 3.6 - 3.9。
py2exe:
仅在 Windows 上支持 Python 3.6 - 3.9。
py2app:
仅在 Mac 上支持 Python 2.7 (?) 和 Python 3 (?)。目前没有记录支持的 Python 版本的确切范围。
当然,这不是唯一的做事方式:
pynsist:
Pynsist 将为您的程序创建一个 Windows 安装程序,它将直接在用户的计算机上安装 Python,而不是将其与您的代码捆绑在一起,并创建链接到您的 Python 脚本的快捷方式。
pynsist 工具本身需要 Python 3.5+ 才能运行,但支持将任何版本的 Python 与您的程序捆绑在一起。
Pynsist 将仅创建 Windows 安装程序,但可以在 Windows、Mac 和 Linux 上运行。有关更多详细信息,请参阅他们的常见问题解答。
努伊特卡:
网站|| 回购(Github 镜像) || 派皮
Nuitka 将从字面上编译您的 Python 代码并生成一个 exe(与其他项目相反,它仅包含 Python)来尝试和加速您的代码。作为副作用,您还将获得一个可以分发的方便的 exe。请注意,您的系统上需要有可用的C++ 编译器。
在 Windows、Mac 和 Linux 上支持 Python 2.6 - 2.7 和 Python 3.3 - 3.9。
赛通:
Cython 类似于 Nuitka,因为它是一个 Python 编译器。但是,它不会直接编译您的代码,而是将其编译为 C。然后您可以获取该 C 代码并将您的代码转换为 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 程序转换为可执行文件不一定是分发代码的唯一方法。要了解有关其他可用选项的更多信息,请参阅以下链接:
pyinstaller仍在积极开发中。您可以在 GitHub 上查看最新更改。
它支持所有三个主要平台:
- Windows(32 位和 64 位)
- Linux(32 位和 64 位)
- Mac OS X(32 位和 64 位)
它支持 Python 2.6 和 2.7 版本。它不支持 Python 3,但有一个实验性的Python 3 分支。
更新
从 3.2.1 版开始,它支持 Python 2.7、3.3-3.5