我该如何分发 Python 程序?
- 2025-02-24 09:29:00
- admin 原创
- 59
问题描述:
我的应用程序如下所示:
主程序
视窗/
__init__.py
主窗口
...
模型/
__init__.py
订单.py
...
资源/
图片1.png
徽标.jpg
...
该程序以 main.py 启动。有没有好的方法可以用它创建一个“最终”应用程序?我正在考虑类似 py2exe/py2app 的东西,但不将 python 解释器/模块复制到只有一个可执行文件的应用程序中。
我看了一下 distutils,但它看起来像是将一个程序安装到了 Python 目录中,这在非 Linux 平台上并不常见。
目前我只是将整个源文件夹复制到目标机器上并在main.pyw
Windows 上创建一个别名。有些不便之处:
该图标是默认的python图标。
我必须手动创建别名。
在我的源目录中,有很多附加文件,例如源代码控制文件夹。
我必须手动重
main.py
命名main.pyw
。如果目标机器上只有 `.pyo* 文件就好了。这没什么特别的,我只是不喜欢有不必要的文件。
如何创建良好的自动分布?
适用于 Windows?(这是目前我唯一需要支持的平台。)
适用于 mac?
适用于 Linux?
解决方案 1:
我强烈推荐Pyinstaller,它几乎无缝支持所有主要平台。与 py2exe 和 py2app 一样,它在 Windows 上生成标准可执行文件,在 OS X 上生成应用程序包,但它的优点还在于它能够出色地自动解析常见依赖项并将它们包含在内,而无需进行额外的配置调整。
另请注意,如果您将 Python 2.6 部署到 Windows,则应将此补丁应用到 Pyinstaller 主干。
您表示不需要安装程序,但Inno Setup是 Windows 平台上易于使用且安装快捷的选择。
解决方案 2:
分发 Python 应用程序的常规方法是使用distutils。它既可用于分发库类型的 Python 模块,也可用于分发 Python 应用程序,不过我不知道它在 Windows 上是如何工作的。无论如何,如果使用 distutils,则必须在 Windows 上单独安装 Python。
我可能会建议你使用 disutils 来分发它(对于 Linux)和 Py2exe 或类似的东西(对于 Windows)。对于 OS XI 我不知道。如果它是一个最终用户应用程序,你可能需要磁盘映像类型的东西,我不知道该怎么做。但请阅读这篇文章以了解有关它的用户体验的更多信息。对于为程序员制作的应用程序,你可能也可以在 OS X 上安装 distutils 类型。
解决方案 3:
我认为还值得一提的是PEX(更多地考虑这个问题受到的关注而不是问题本身)。根据其自身的描述:
PEX 文件是自包含的可执行 Python 虚拟环境。更具体地说,它们是精心构建的 zip 文件,具有 和
#!/usr/bin/env python
特殊功能__main__.py
,可让您与 PEX 运行时进行交互。有关 zip 应用程序的更多信息,请参阅PEP 441。
我在阅读Python 打包概述时偶然发现了它。他们在那里贴了一张漂亮的图片:
总结一下:如果您可以依赖目标机器上安装的 python,那么使用 PEX 来生成一个自包含的»可执行文件«,其文件大小可能比 PyInstaller 生成的可执行文件要小。
解决方案 4:
Fredrik Lundhsqueeze.py
可以创建一个不包含 Python 解释器但包含字节码的单个文件。使用正确的参数,您可以在结果文件中包含其他文件、模块等。我在一个项目中成功使用了它。生成的程序在 OS X、Linux 和 Windows 上运行没有任何问题!
PS:每台机器都需要一个与 squeeze.py 生成的字节码兼容的 Python 解释器。如果需要,您可以为不同版本的 Python 生成不同的字节码版本(只需使用正确版本的 Python 运行 squeeze.py 即可)。
解决方案 5:
我认为IronPython有一个适用于 Windows 的内置编译器:
我尝试了Cx_Freeze,认为它是迄今为止我用过的最好的 .py 到 .exe(加上一些 .dll)编译器。
解决方案 6:
如果您在 Windows 上分发,请使用安装程序安装所有相关文件/解释器,无论需要什么。分发 setup.exe。这是在 Windows 上最好的方法。否则用户会抱怨。
解决方案 7:
对于 Windows,我发现 py2exe 非常容易使用。
pip install distutils
pip install py2exe
只需要在setup.py中添加几行代码:
from distutils.core import setup
import py2exe
setup(console=['hello.py'])
Py2exe 构建一个可执行文件并包含所有依赖项。您可能需要在构建 exe 之前手动添加 C++ 运行时:
from glob import glob
data_files = [("Microsoft.VC90.CRT", glob(r'C:Program FilesMicrosoft Visual Studio 9.0VC
edistx86Microsoft.VC90.CRT*.*'))]
setup(
data_files=data_files,
...
)
https://py2exe.org有一个简单易懂的教程,大约有 3 页长。
解决方案 8:
分发 Python 桌面应用程序最方便*的跨平台方式是依靠跨平台 conda 包管理器。有几种使用它的工具:
Miniconda-Install - powershell/bash 脚本,可自动下载 Miniconda 并为应用程序创建独立的 conda 环境。支持 pip,但似乎无人维护,并且存在 https 下载问题。
Anaconda Project和Continuum 的(conda) 构造函数。两者都使用 conda。(conda) 构造函数似乎能够在 Windows 上创建自包含安装程序,甚至 NSIS 安装程序,但不支持 pip。似乎表现得像 Anaconda/Miniconda 安装程序。
PyAppShare - 最终用户首先安装 Miniconda/Anaconda(类似于运行时环境)。然后,单个安装批处理/bash 脚本根据 yaml 规范创建独立的 conda 环境。该应用程序本身也是一个 conda/pip 包,安装到环境中并创建可执行入口点。自动创建跨平台桌面和程序快捷方式。它们激活环境并启动应用程序。支持 pip。
对开发者来说最方便。对最终用户来说足够方便。
扫码咨询,免费领取项目管理大礼包!