【问题标题】:Distribution format for Python libraries uploaded on PyPI在 PyPI 上上传的 Python 库的分发格式
【发布时间】:2020-10-15 11:41:56
【问题描述】:

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

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

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

【问题讨论】:

  • Twine 应该允许您同时上传两者,如果您不能上传这可能是一个单独的问题。
  • @DustinIngram 是的,它允许上传两者。也许,我应该更清楚。谢谢!我已经在问题中更新了这一点。
  • 巧合的是,关于这个话题正在进行一个有趣的讨论:discuss.python.org/t/purpose-of-an-sdist/4639

标签: python pypi python-packaging twine


【解决方案1】:

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

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

车轮听起来非常出色,因为它确实如此。 最佳做法是同时上传轮子和源分发,因为任何构建的分发格式仅适用于目标系统的子集。对于package that contains only python code,该子集就是“一切”——尽管人们仍然经常上传源分布,也许是为了在出现新标准的情况下向前兼容[1],也许是为了期待system specific extensions这将突然需要源代码分发以支持所有平台,也许可以让用户选择运行具有特定构建参数的自定义构建。

观察不同情况的一个很好的示例包是numpy,它上传了 25 个轮子以覆盖最流行的平台,以及一个源代码分发。如果您从任何受支持的平台安装 numpy,您将获得一个不错的简短安装,只需几秒钟即可复制轮子的内容。如果你在一个不受支持的平台上(比如alpine),一台普通的电脑可能至少需要20分钟从源码编译numpy才能安装,而且你需要安装各种system level dev tools for building C-extensions。有点痛苦,但总比不能全部安装好。


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

【讨论】:

  • 很好的答案,除了这部分:“人们仍然经常上传源分布,可能是因为货物崇拜”。要求您更改这部分是否公平?我不认为这是“货物崇拜”。即使对于纯 Python 版本,对我来说总是发布 源代码分发 似乎很重要(除了可能将已编译扩展的源代码保密)。比如说,将来社区从 wheel 转向另一种 built 格式,我们仍然可以使用所有过去的 sdist 来重建所有以该较新格式发布的过去版本。
  • @sinoroc 是纯 python 包的有损格式吗?无论哪种方式,您可能都是对的,我将删除该部分并添加您对未来包装标准的更好支持的观点。
  • 感谢您考虑我的建议! -- 我会说 wheel 总是有损的(无论是否纯正),因为例如你丢失了setup.pypyproject.toml 等等。据我了解,有些人特别喜欢访问 sdist,因为它通常也包含测试。在 sdist 中分发测试是我最佳实践的一部分(显然不是在 wheel 中)。
  • 巧合的是,关于这个话题正在进行一个有趣的讨论:discuss.python.org/t/purpose-of-an-sdist/4639
【解决方案2】:

最佳做法是同时提供。

为能够使用该发行版的用户提供“内置发行版”(.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 的文件名中表示)。这与源代码分发没有太大区别,但最好同时上传两者。

【讨论】:

  • 好答案(赞成),除了一个细节:他们至少需要执行setup.py 文件不再准确。举个反例,我的一个项目已经发布了pytest-raisin-0.3.tar.gz,虽然没有 setup.py 文件,但它仍然可以从源代码分发中安装。
  • 当然,要点仍然大致相同,您仍在调用 some 构建后端,即使它不必通过setup.py 设置工具.我会更新答案以反映这一点,谢谢!
【解决方案3】:

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

【讨论】:

  • 我知道我们可以上传.whl文件,我想知道最佳实践。当您可以使用 .whl 文件上传两者时,背后的原因是什么
猜你喜欢
  • 2021-08-02
  • 2021-03-29
  • 1970-01-01
  • 2020-05-03
  • 2019-08-20
  • 1970-01-01
  • 2018-03-23
  • 2013-05-17
  • 1970-01-01
相关资源
最近更新 更多