一次发布有多个发行版,为什么Python发行包会这么难?

  • 日期:07-09
  • 点击:(896)

巴黎人真人

单个版本中有多个发行版。为什么Python发行包如此困难?

来自pydist

作者:Alex Becker

参与:贾王子,想想

虽然你经常使用pip,但你知道它如何选择不同的发行版吗?在本文中,作者介绍了Python中发行版的一些基本概念,并讨论了发布Python包的难度。

大多数编程语言包的生态系统有两个级别:每个包都有一个或多个版本,每个版本都可以通过版本区分。 Python有第三级:每个版本都有一个或多个发行版,下载安装包时下载的实际文件是这些发行版。在大多数语言中,这些文件与发行版同义,但在Python中,“具有多个发行版的一个发行版”非常重要,因为大多数发行版使用分布最广的包。版。

为什么会这样?因为Python很特殊,所以它将C扩展视为该语言的顶级特性,并尝试隔离包的使用并编译C扩展。这意味着分发需要包含使用C扩展编译的结果二进制代码,并且此分布(在其现代迭代中)称为二进制轮。

但是,通常需要针对特定的Python版本和操作系统编译C扩展,因此需要多个轮子才能实现通用性。此外,由于程序包的作者无法预测所有Python版本和操作系统,因此包含由程序包用户编译的源代码分发非常重要。

尽管如此,用户和大多数工具仍在考虑发布而不是特定的发行版。这可能导致很大的不和谐。例如,在一台计算机上安装软件包可能需要几秒钟(因为存在匹配的二进制分发版),并且在另一台计算机上可能需要几分钟甚至几小时。

即使两台计算机都能找到正确的二进制发行版进行安装,它们的哈希值也不匹配,并且检测到MitM攻击可能会变得更加困难。因为像pip这样的工具会在发布时自动找到“最适合”的分布,当分布与给定系统兼容时,它会更喜欢二进制轮。如果多个分布与此系统兼容,则选择最合适的二进制轮,如果不兼容,则返回到源分发。

如果您已经在该版本下安装了一个版本,并且该版本有一个新版本,那么将会出现一个大问题。这个问题几乎是不可避免的,因为PyPI只允许一次上传一个版本,并将创建一个包含此版本的新版本,所以在上传最后一个版本之前,有人已经下载了第一个版本。发布。

使用buildbot并行构建不同的发行版后,此问题变得更加常见,这通常需要比源发行版更长的时间。当程序包的作者在发布后的几个月或几年内添加对新平台(或新版本的Python)的支持时,这种情况会变得更糟。发生这种情况时,有一些问题低于:

构建一个期望为给定数据包中断生成特定哈希值的系统。

像PyDist这样的PyPI图像不知道找到新版本而无法同步。

如果您之前安装了版本的发行版,则您的系统(例如开发机器)将不可用。

新版本,可能与安装它的系统(例如生产服务器)的行为不同。

尽管PyPI维护者已经意识到这些问题并讨论了工具改进,但很难找到解决这些问题而不会严重破坏生态系统的方法。与此同时,Python重度用户和系统管理员也负责了解Python包的分发方式以及pip如何选择分发。

原始链接:https://pydist.com/blog/distributions-vs-releases

看看更多