如何分发 python 程序?

Posted

技术标签:

【中文标题】如何分发 python 程序?【英文标题】:How can I distribute python programs? 【发布时间】:2009-10-13 05:48:20 【问题描述】:

我的应用程序如下所示:

主文件 视窗/ __init__.py 主窗口.py ... 模型/ __init__.py 订单.py ... 资源/ image1.png 标志.jpg ...

程序以 main.py 启动。有没有一种好方法可以从中创建“最终”应用程序?我正在考虑类似 py2exe/py2app 之类的东西,但没有将 python 解释器/模块复制到只有一个可执行文件的应用程序中。

我查看了 distutils,但这看起来像是将程序安装到 Python 目录中,这在非 Linux 平台上并不常见。

目前我只是将整个源文件夹复制到目标机器上,并在 Windows 上为 main.pyw 创建一个别名。一些不便之处:

图标是默认的python图标。 我必须手动创建别名。 在我的源代码目录中有很多附加文件,例如源代码管理文件夹。 我必须手动将main.py 重命名为main.pyw。 如果目标机器上只有 `.pyo* 文件就好了。没有真正的原因,我只是不喜欢有不必要的文件。

如何创建良好的自动化分发?

对于窗户? (这是我目前必须支持的唯一平台。) Mac 版? 对于 linux?

【问题讨论】:

"我看过 distutils,但这看起来像是在 Python 目录中安装了一个程序,这在非 Linux 平台上并不常见。" 你为什么这么说?你读过什么文字是这样说的?这肯定不是真的,你从哪里得到的印象? Distributing Programs Written in Python的可能重复 相关:Create a single executable from a Python project 【参考方案1】:

我强烈推荐Pyinstaller,它非常无缝地支持所有主要平台。与 py2exe 和 py2app 一样,它在 Windows 上生成标准可执行文件,在 OS X 上生成应用程序包,但它还具有出色的自动解析常见依赖项的优势,并且无需额外的配置调整即可包含它们。

另请注意,如果您将 Python 2.6 部署到 Windows,则应将 this patch 应用于 Pyinstaller 主干。

您表示您不需要安装程序,但Inno Setup 是 Windows 平台的一个易于使用和快速设置的选择。

【讨论】:

我不确定这是否矫枉过正。使用 Pyinstaller 捆绑应用程序实际上比其他方法更容易,尤其是那些依赖于 c 扩展的方法......在大多数情况下就像单行命令行调用一样简单。安装 Python + 依赖项 + 应用程序本身(无论是通过 distutils 等,还是只是一个 zip 文件)涉及更多,特别是如果开发人员无法自己手动配置目标机器并且需要向客户端提供说明。至少在 Windows 上,我认为这种分发方式是有意义的。 用pyinstaller有点不方便,当你使用用pyinstaller创建的可执行文件时,开始执行需要几秒钟。 正是我想要的。我有时需要让我的脚本在无法安装任何东西的计算机上运行。我需要一个没有外部依赖的单一可执行文件。我可以腾出几秒钟的时间来启动。谢谢! 不推荐用于小型应用程序,因为一个简单的Hello world 程序会占用 500MB 空间和 3-5 秒的初始化时间。 您可以通过使用单独的环境来分发您的应用程序(例如使用 venv 或 pyenv)来避免这种空间量【参考方案2】:

分发 Python 应用程序的正常方式是使用distutils。它既用于分发库类型的 Python 模块,也用于分发 Python 应用程序,尽管我不知道它在 Windows 上是如何工作的。无论如何,如果您使用 distutils,您必须在 Windows 上单独安装 Python。

我可能会建议您使用 disutils for Linux 和 Py2exe 或类似的 Windows 分发它。对于 OS X,我不知道。如果它是最终用户应用程序,您可能需要磁盘映像类型的东西,我不知道该怎么做。但请阅读this post 了解有关它的用户体验的更多信息。对于为程序员制作的应用程序,您可能也可以在 OS X 上使用 distutils 类型安装。

【讨论】:

Mac 和 linux 目前并不重要。 Py2app 制作 .app 包。而且我认为以 .dmg 格式发布 mac 应用程序已经过时,应该使用 .zip。是否可以使用 distutils 创建一个目录 dist 并将所有相关文件复制到该目录中? @gs: sdist 命令将创建一个包含所有源文件的 tar 文件。 @gs:以 .dmg 格式发布 Mac 应用程序实际上非常普遍。 .dmg 是磁盘映像,而不是应用程序的格式(即 .app)。因此,您经常会在 .dmg 中找到一个 .app 以及一些 README 文件。 @gs 我不知道为什么你想让 distutils 只创建一个目录 dist 并将文件复制到那里,你可以自己做。 Distutils 做了很多事情,包括制作 Windows 安装程序,并且从 Python 2.6 开始还在开始菜单中创建链接。不过,它需要您单独安装 Python,因此对于最终用户应用程序,我认为 py2exe 是一个更好的解决方案,因为它包含它自己的 Python。 Alexander Limi 在他的博文中详细讨论了 OS X 的运输/安装程序,所以我听从他的意见。 docs.python.org/3/distutils/…【参考方案3】:

我认为PEX 也值得一提(考虑到这个问题受到的关注更多,而不是问题本身)。根据其own description:

PEX 文件是独立的可执行 Python 虚拟环境。更具体地说,它们是精心构建的带有#!/usr/bin/env python 和特殊__main__.py 的zip 文件,允许您与PEX 运行时进行交互。有关 zip 应用程序的更多信息,请参阅PEP 441。

我在阅读an overview of packaging for python 时偶然发现了它。他们在那里张贴了这张漂亮的照片:

总结一下:如果您能够负担得起在目标机器上安装 python 的费用,请使用 PEX 生成一个自包含的“可执行文件”,它可能比 PyInstaller 生成的可执行文件具有更小的文件大小。

【讨论】:

【参考方案4】:

Fredrik Lundh 的squeeze.py 可以创建一个不包含 Python 解释器但包含字节码的文件。使用正确的参数,您可以在结果文件中包含其他文件、模块等。我在一个项目中成功使用了它。生成的程序在 OS X、Linux 和 Windows 上运行没有任何问题!

PS:每台机器都需要有一个与squeeze.py生成的字节码兼容的Python解释器。如果需要,您可以为不同版本的 Python 生成不同的字节码版本(只需使用正确版本的 Python 运行挤压.py)。

【讨论】:

【参考方案5】:

我认为IronPython 有一个内置的 windows 编译器:

我试用了Cx_Freeze,认为它是迄今为止我用过的最好的 .py 到 .exe(加上一些 .dll)编译器。

【讨论】:

【参考方案6】:

如果您在 Windows 上分发,请使用installer 安装所有相关文件/interpeter 所需的任何内容。分发 setup.exe。这是windows上最好的方法。否则用户会抱怨。

【讨论】:

我不需要安装程序,因为只有一个用户会使用该程序。当然,在为更多用户编写程序时,这是 Windows 上的必备功能。 @gs:哦,只有一个用户。好的,那么我建议制作一个基本的 distutils 包,无论是源代码分发还是 Windows 二进制安装程序。这绝对是分发 Python 模块的一种简单而好方法。【参考方案7】:

最方便*的跨平台分发 python 桌面应用程序的方式是依赖跨平台的 conda 包管理器。有几个工具可以使用它:

Miniconda-Install - 自动下载 Miniconda 并为应用程序创建隔离 conda 环境的 powershell/bash 脚本。支持 pip,但似乎没有维护,并且存在 https 下载问题。 Anaconda Project 和 (conda) constructor 由 Continuum 提供。两者都使用康达。 (conda) 构造函数似乎能够在 Windows 上创建自包含安装程序甚至 NSIS 安装程序,但不支持 pip。似乎表现得像 Anaconda/Miniconda 安装程序。 PyAppShare - 最终用户首先安装 Miniconda/Anaconda(类似于运行时环境)。然后单个安装批处理/bash 脚本从 yaml 规范创建隔离的 conda 环境。该应用程序本身也是一个 conda/pip 包,它安装到环境中并创建了一个可执行入口点。自动创建跨平台桌面和程序快捷方式。他们激活环境并启动应用程序。支持点子。

* 对开发者最方便。对最终用户来说足够方便。

【讨论】:

【参考方案8】:

对于 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 Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\*.*'))]
setup(
    data_files=data_files,
    ...
)

https://py2exe.org 有一个漂亮而简单的教程,大约 3 页长。

【讨论】:

以上是关于如何分发 python 程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何打包和分发 python 程序(.py 源代码),以便其他开发人员可以轻松安装所有需要的依赖项?

如何打包 PySide2 应用程序以进行分发?

在可分发的 Python 模块中包含 pdftk

有没有一种标准的方法来创建用于分发 Python 程序的 Debian 包?

第 8 章: 模块, 包与分发---Word

如何构建和分发依赖于第三方 libFoo.so 的 Python/Cython 包