setuptools、distribute 和 pip 之间有什么关系?

61 投票
1 回答
11941 浏览
提问于 2025-04-17 08:34

我一直在通过《Learn Python The Hard Way》(第二版)这本书自学Python。在第46个练习中,它让我了解一下Pip、Distribute和其他一些包。

Pip的说明文档写得很清楚。它可以让我安装、卸载和升级各种包。然后我看了Distribute的说明,发现它基本上也能做同样的事情:

轻松下载、构建、安装、升级和卸载Python包

那么,pip和distribute有什么区别呢?它们之间又是怎样的关系呢?

1 个回答

87

[2014年10月总结: distribute 已经不再使用,建议使用 pip、新的 setuptools,以及用于二进制分发的 wheels。更多内容见下文。]


[原始回答]

Distribute 是较老的 setuptools 的一个分支,所以接下来的评论几乎同样适用于 Distribute 和 setuptools。setuptools 是为了弥补更早的 Python 标准库包 Distutils 中的一些不足而创建的。setuptools 增加了一些功能,比如通过命令行接口自动下载包的 easy_install,以及一定程度的依赖管理。不过,Python 社区中有一部分人认为 setuptools 太过复杂,某些功能背后有太多“魔法”操作。

pip 是在 setuptools 或 Distribute 之上的一个更高级的接口。它利用这些工具来执行许多功能,但避免了一些有争议的特性,比如压缩包(zipped eggs)。pip 还提供了一些 setuptools 没有的功能,比如卸载命令,以及定义固定的需求集合并可靠地重现一组包的能力。这里有一个更完整的功能比较 在这里

为什么会有这么多组件(还有更多,比如 buildout)?原因有很多:解决方案必须在所有主要支持 Python 的平台上工作(即 Unix、Windows、Mac OS X),所以构建和安装会面临一系列复杂的问题;像许多开源项目一样,Python 基本上是全由志愿者维护,很多开发者对打包和安装问题并不太感兴趣;对于向标准库添加新的未经验证的重大特性有一种自然的保守态度;还有意见分歧等等。

目前,有一个项目正在进行中,旨在为 Distutils 提供替代方案,并可能为一些更高级的附加功能提供替代。计划在 Python 3.3 的标准库中发布为 packaging 包,并作为旧版本 Python 的附加功能发布为 Distutils2

总结一下,目前的关系是:

pip -> [ setuptools | Distribute ] -> Distutils -> Python core
                                    |
    3rd party packages              |      included in Python
                                    |

更新(2012年07月):在 Python 3.3 的功能代码截止之前,决定 packaging 还没有准备好发布到标准库中,因此它被从 3.3 版本中移除。将继续对 Distutils2 进行开发,该项目可以通过 PyPI 获取,并将考虑在 Python 3.4 的标准库中包含的内容。


更新(2014年10月): 自上次更新以来,Python 打包的世界发生了进一步的变化。

  • 最重要的是,自2013年中以来,setuptoolsdistribute 之间的裂痕已经修复,开发活动 已合并到新的 setuptools 项目中。distribute 现在已被弃用,不再维护;请使用新的 setuptools,但不要使用它的 easy_install 作为安装工具。

  • pip 已成为事实上的官方安装工具(用于平台的包管理器未提供的 Python 包),无论是在虚拟环境内还是外(virtualenvpyvenv)。

  • 取代旧的 setuptools bdist eggswheels 已成为 Python 包的官方二进制分发格式。

  • 从 Python 3.4 开始带有 wheel 支持的 pip 版本 现在随官方 python.org 的二进制安装程序和源包一起发布,并预计 pip 也将包含在 下一个 Python 2.7 的维护版本(2.7.9)中。

  • Distutils2packaging 现在处于休眠状态。

更多细节请查看 Python 3 文档中新增加的 分发 Python 模块 部分,以及新的 Python 打包用户指南

撰写回答