如何分发Python程序?
我的应用程序看起来是这样的:
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 个回答
我觉得值得提一下 PEX,因为这个问题引起了很多关注。根据它的 官方描述:
PEX 文件是自包含的可执行 Python 虚拟环境。更具体来说,它们是经过精心构建的压缩文件,里面有一个
#!/usr/bin/env python
的开头和一个特殊的__main__.py
文件,这样你就可以与 PEX 运行时进行交互。如果想了解更多关于压缩应用的信息,可以查看 PEP 441。
我是在阅读 Python 打包概述 时偶然发现这个的。他们那儿还贴了一张很不错的图片:
总结一下:如果你可以确保目标机器上已经安装了 Python,那么可以使用 PEX 来生成一个自包含的“可执行文件”,这个文件的大小可能会比用 PyInstaller 生成的可执行文件小。
我非常推荐Pyinstaller,它在所有主要平台上都能很好地运行。就像py2exe和py2app一样,它在Windows上可以生成标准的可执行文件,在OS X上可以生成应用程序包,而且它的一个优点是能够自动处理常见的依赖项,并且无需额外的配置就能把它们包含进去。
另外,如果你要在Windows上使用Python 2.6,记得要给Pyinstaller应用这个补丁。
你提到不需要安装程序,但Inno Setup是一个简单易用、快速设置的选择,适合Windows平台。
分发Python应用程序的常见方法是使用distutils。这个工具既可以用来分发库类型的Python模块,也可以用来分发Python应用程序。不过,我不太清楚它在Windows上的具体使用情况。总之,如果你在Windows上使用distutils,你需要单独安装Python。
我建议在Linux上使用distutils来分发你的应用,而在Windows上可以用Py2exe或者类似的工具。至于OS X,我就不太清楚了。如果你的应用是给最终用户使用的,可能需要制作一个磁盘映像之类的东西,但我不知道怎么做。不过,你可以看看这篇文章,了解一下用户体验。如果你的应用是给程序员用的,在OS X上使用distutils的安装方式应该也没问题。