【问题标题】:What is the point of built distributions for pure Python packages?为纯 Python 包构建发行版有什么意义?
【发布时间】:2026-01-18 06:40:01
【问题描述】:

可以将 Python 作为源分发版.tar.gz 格式)或内置分发版(wheels 格式)共享。

据我了解,构建发行版的重点是:

  • 节省时间:编译可能非常耗时。我们可以在服务器上执行一次,然后将其共享给许多用户。
  • 减少要求:用户不必安装编译器

但是,bdist 文件的这两个参数似乎不适用于纯 python 包。不过,我看到natsort 出现在 sdist 和 bdist 中。共享 bdist 格式的纯 python 包有什么好处吗?

【问题讨论】:

  • 在您的示例中,natsort 的 bdist 大小比源 tarball 小 3 倍。
  • 为什么纯python包的节省时间参数不成立?

标签: python python-wheel python-packaging


【解决方案1】:

来自pythonwheels.com

车轮的优点

  1. 更快地安装纯 Python 和原生 C 扩展包。
  2. 避免安装时执行任意代码。 (避免 setup.py)
  3. 在 Linux、Windows 或 macOS 上安装 C 扩展不需要编译器。
  4. 为测试和持续集成提供更好的缓存。
  5. 在安装过程中创建 .pyc 文件,以确保它们与使用的 Python 解释器匹配。
  6. 跨平台和机器的安装更加一致。

所以对我来说,我认为第一点和第二点对于纯 Python 包最有意义。它更小、更快、更安全。

【讨论】:

  • 我真的不明白 (2) 的意义:最后,你想运行包。所以你在那里运行任意代码。如果您在安装时不这样做,为什么要添加任何安全性,而只是在运行时?
  • (1) 很有趣。我不知道*的尺寸可能更小,因此下载速度更快。
  • @MartinThoma,在构建时和运行时不一定具有相同的权限。构建系统通常具有私钥,允许访问公司 SCM 中的其他源代码,f/e。无论如何,如果一个人可以锁定一种妥协而不阻止另一种妥协,那么没有理由让完美成为善的敌人。 (类似地,生产运行时可能比构建系统更好地监控出站连接等;并且已安装库中的代码比仅在构建时临时调用但未安装因此未打包的代码更难隐藏)。
  • @MartinThoma, ...当然,还有其他针对构建时攻击的对策(我是 Nix 的忠实粉丝,它在没有网络连接的沙箱中运行所有构建,需要下载到提前完成,散列并记录在只读不可变存储中);但这仍然是一个没有被广泛采用的利基工具。
  • @MartinThoma 换句话说,对于 1) 您可以避免安装时间要求(例如,如果软件包使用 pbr,则需要安装 sdist,而不是 bdist),对于 2) 您排除软件包维护者恶意或不擅长编写setup.py 的可能性。使用 bdist 并利用标准工具及其配置来安装软件包,如果您只关心正在安装的软件包,那么绝对比通过 sdist 安装更好。
最近更新 更多