从Python项目创build一个可执行文件

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

这是一些常见的。 除非明确指出,否则截至我上次编辑(2017年9月)为止,下列所有项目正在积极维护。

我还包括链接到他们各自的网站,回购和PyPi列表,以防您自己检查更新频率。

另外,除非另有说明,下面列出的所有程序将产生一个专门为它正在运行的操作系统的exe。所以,例如,在Windows中运行Pyinstaller将产生一个Windows EXE,但在Linux中运行Pyinstaller将产生一个Linux EXE。 如果你想为多个操作系统生成一个exe文件,你将不得不考虑使用虚拟机或者使用像Wine这样的东西。


以下程序的工作方式都是相似的 – 将Python和程序捆绑在一起,有效地将它们结合起来生成一个可执行文件。

  • PyInstaller:

    • 链接 : 网站 || Repo || 的PyPI
    • 支持 :Windows,Mac和Linux上的Python 2.7和Python 3.3 – 3.6。
  • cx_Freeze:

    • 链接: 网站 || Repo || 的PyPI
    • 支持: Windows,Mac和Linux上的Python 2.7和3.0(?) – 3.6。
    • 注意:支持Python 2.6的cx_Freeze的最新版本似乎是2016年12月发布的4.3.4版本。
  • pyapp:

    • 链接: 网站 || Repo || 的PyPI
    • 仅在Mac上支持: Python 2.7和3.3 – 3.4(?)。
    • 注意:从上次编辑开始,我一直无法确定pyapp是否支持Python 3.5 – 3.6。
  • py2exe

    • 链接: 网站 || Repo || 的PyPI
    • 支持:仅限Windows。 版本0.6.9支持Python 2.4 – 2.7, 版本0.9.2.2支持Python 3.3 – 3.4(?)。
    • 其他注意事项: Python 2的py2exe最近在2008年更新,但Python 3的py2exe最后更新于2014年10月。PyPi上的版本仅支持Python 3。
  • bbfreeze

    • 链接: 网站 || Repo || 的PyPI
    • 支持: Python 2.4 – 2.7,而不是Windows和Linux上的Python 3。
    • 其他说明:目前没有活跃的维护者,最近一次更新于2014年。

您可以在Python的“漫游者指南”中find一个稍微(?)更深入的比较:冻结您的代码 。


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

  • pynsist:

    • 链接: 网站 || Repo || 的PyPI
    • 支持:所有Python版本? 注意 – 只会创buildWindows安装程序
    • 其他说明: Pynsist似乎支持将任意Python版本与应用程序捆绑在一起。 但是,该工具本身需要运行Python 2.7或3.3+。

      Pynsist将为您的程序创build一个Windows安装程序,它将直接在用户的计算机上安装Python,而不是将其与您的代码捆绑在一起,并创build链接到您的Python脚本的快捷方式。 虽然这个程序只生成Windows安装程序,但似乎仍然可以在Mac和Linux计算机上运行Pynsist 。

  • Nuitka:

    • 链接: 网站 || 回购(Github镜子) || 的PyPI
    • 支持: Windows,Mac和Linux上的Python 2.6 – 2.7和Python 3.2 – 3.6。
    • 其他注意事项: Nuitka将会从字面上编译你的Python代码,并生成一个exe文件(而不是其他的Python项目),以便加速你的代码。 作为一个副作用,你也会得到一个方便的exe文件,你可以分发。 请注意,您需要在系统上提供C ++编译器 。
  • 用Cython:

    • 链接: 网站 || Repo || 的PyPI
    • 支持: Windows,Mac和Linux上的Python 2.6 – 2.7和Python 3.2 – 3.6(?)。
    • 其他说明: Cython和Nuitka类似,它是一个Python编译器。 然而,不是直接编译你的代码,而是将它编译为C.然后你可以把这个C 代码转换成一个exe文件 。 你需要在你的系统上有一个C编译器。

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

不过,我也用cx_Freeze和py2exe成功构build了各种exes,没有太多困难,所以你也应该考虑检查一下。

我还没有机会尝试pynist,Nuitka或Cython,但他们似乎是非常有趣和创新的解决scheme。 如果使用第一组程序遇到麻烦,可能值得尝试其中的一个。 由于它们与Pyinstaller / cx_freeze风格的程序有着根本的不同,它们可能会在第一组出现故障的奇怪边缘情况下成功。

特别是,我认为pynist是避免完全分配代码的整个问题的一种好方法:Mac和Linux已经具有对Python的本地支持,并且在Windows上安装Python可能确实是最干净的解决scheme。 (现在的缺点是你需要担心目标的多个版本的Python +安装库)。

Nuitka和Cython(以我有限的经验)似乎工作得很好。 再一次,我自己也没有对它们进行广泛的testing,所以我的主要观察是,他们似乎需要更长的时间才能制作出一个“冻结”式的程序。

最后一点,如果你只想支持Linux,你可能需要考虑为你的包创build一个distro包,而不是把它变成一个可执行文件。 列表工具可以帮助你做到这一点超出了这篇文章的范围,但如果你决定探索这条路线,这里有一些阅读材料 。

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