在 PyPI 上上传的 Python 个库的分发格式

Distribution format for Python libraries uploaded on PyPI

我完成了上传包到 https://test.pypi.org/ 的教程,我成功了。

但是,$python setup.py sdist bdist_wheel 会在 dist/ 目录中生成一个 .whl 文件和一个 tar.gz 文件。 twine 允许仅上传 .whltar.gz 文件或两者。我看到 https://pypi.org/ 上的许多存储库都上传了这两种格式。

我想了解什么是最佳实践。一种格式优于另一种格式吗?如果 .whl 文件足以分发我的代码,我是否也应该上传 tar.gz 文件?或者还有什么我在这里完全遗漏的。

您可以只上传 whl 文件并使用以下命令安装

最佳做法是同时提供两者。

为能够使用该发行版的用户提供的“内置发行版”(.whl)。这节省了安装时间,因为“内置分发”是预先构建的,可以直接放在用户机器上,无需任何编译步骤或不执行 setup.py。给定版本可能有多个内置发行版——一旦您开始将已编译的二进制文件包含在您的发行版中,它们就会成为特定于平台的(参见 https://pypi.org/project/tensorflow/#files 例如)

“源代码分发”(.tar.gz) 本质上是任何无法使用您构建的分发的用户的后备。源分发不是“构建”的,这意味着它们可能需要编译才能安装。至少,他们需要执行一个构建后端(对于大多数项目,这是调用 setup.pysetuptools 作为构建后端)。任何安装程序都应该能够从源代码安装。此外,源代码分发使想要审核您的源代码的用户更容易(尽管这对于构建的分发也是可能的)。

对于大多数 Python 项目,将“源代码分发”转变为“内置分发”会产生一个单一的纯 Python 轮子(由 none-any 在文件名中,如 projectname-1.2.3-py2.py3-none-any.whl)。这与源代码分发之间没有太大区别,但上传两者仍然是最佳做法。

A .tar.gz 是所谓的源分发。它包含您的包的源代码和如何构建它的说明,目标系统将在安装它之前执行构建。

A .wheelPEP 427中的规范详细信息)是一种构建的分发格式,这意味着目标系统不再需要构建它。安装轮子通常只是将其内容复制到右侧 site-packages.

车轮听起来非常出色,因为它确实如此。上传 、轮子和源分发仍然是 最佳实践,因为任何构建的分发格式仅适用于目标系统的子集。对于 package that contains only python code, that subset is "everything" - people still often upload source distributions though, maybe to be forward compatible in case a new standard turns up[1], maybe to anticipate system specific extensions 突然需要源代码分发以支持所有平台,也许可以让用户选择 运行 具有特定构建参数的自定义构建。

已安装 numpy, which uploads a whooping 25 wheels to cover the most popular platforms, plus a source distribution. If you install numpy from any of the supported platforms, you'll get a nice short install taking a couple of second where the contents of the wheel are copied over. If you are on an unsupported platform (such as alpine), a normal computer will probably take at least 20 minutes to build numpy from source before it can be installed, and you need to have all kinds of system level dev tools for building C-extensions 观察不同情况的一个很好的示例包。有点痛苦,但总比不能全部安装好。


[1] 毕竟,在 wheel 之前有 egg,如果包管理器决定采用 wheel 格式,那么采用 wheel 格式会比现在困难得多只上传 egg 发行版,没有来源。