如何分发Python程序?

120 投票
8 回答
103846 浏览
提问于 2025-04-15 15:01

我的应用程序看起来是这样的:

main.py
windows/
    __init__.py
    mainwindow.py
    ...
model/
    __init__.py
    orders.py
    ...
resources/
    image1.png
    logo.jpg
    ...

这个程序是通过 main.py 启动的。有没有好的方法把它打包成一个“最终版”的应用程序?我在想类似 py2exe 或 py2app 的东西,但不想把 Python 解释器和模块都复制到应用程序里,只想要一个可执行文件。

我看了一下 distutils,但它似乎是把程序安装到 Python 目录下,这在非 Linux 平台上并不常见。

目前我只是把整个源代码文件夹复制到目标机器上,然后在 Windows 上创建一个指向 main.pyw 的别名。这样做有一些不方便的地方:

  • 图标是默认的 Python 图标。
  • 我必须手动创建别名。
  • 我的源代码目录里有很多额外的文件,比如源代码控制文件夹。
  • 我必须手动把 main.py 重命名为 main.pyw
  • 如果目标机器上只有 `.pyo*` 文件就好了。其实没有什么特别的理由,我就是不喜欢有多余的文件。

怎么才能创建一个好用的自动化分发包呢?

  • 针对 Windows 的?(这是我目前唯一需要支持的平台。)
  • 针对 Mac 的?
  • 针对 Linux 的?

8 个回答

16

我觉得值得提一下 PEX,因为这个问题引起了很多关注。根据它的 官方描述

PEX 文件是自包含的可执行 Python 虚拟环境。更具体来说,它们是经过精心构建的压缩文件,里面有一个 #!/usr/bin/env python 的开头和一个特殊的 __main__.py 文件,这样你就可以与 PEX 运行时进行交互。如果想了解更多关于压缩应用的信息,可以查看 PEP 441

我是在阅读 Python 打包概述 时偶然发现这个的。他们那儿还贴了一张很不错的图片: 这里输入图片描述

总结一下:如果你可以确保目标机器上已经安装了 Python,那么可以使用 PEX 来生成一个自包含的“可执行文件”,这个文件的大小可能会比用 PyInstaller 生成的可执行文件小。

76

我非常推荐Pyinstaller,它在所有主要平台上都能很好地运行。就像py2exe和py2app一样,它在Windows上可以生成标准的可执行文件,在OS X上可以生成应用程序包,而且它的一个优点是能够自动处理常见的依赖项,并且无需额外的配置就能把它们包含进去。

另外,如果你要在Windows上使用Python 2.6,记得要给Pyinstaller应用这个补丁

你提到不需要安装程序,但Inno Setup是一个简单易用、快速设置的选择,适合Windows平台。

41

分发Python应用程序的常见方法是使用distutils。这个工具既可以用来分发库类型的Python模块,也可以用来分发Python应用程序。不过,我不太清楚它在Windows上的具体使用情况。总之,如果你在Windows上使用distutils,你需要单独安装Python。

我建议在Linux上使用distutils来分发你的应用,而在Windows上可以用Py2exe或者类似的工具。至于OS X,我就不太清楚了。如果你的应用是给最终用户使用的,可能需要制作一个磁盘映像之类的东西,但我不知道怎么做。不过,你可以看看这篇文章,了解一下用户体验。如果你的应用是给程序员用的,在OS X上使用distutils的安装方式应该也没问题。

撰写回答