setuptools,distribution和pip如何相互关联?

我一直在通过“Learn Python The Hard Way”(第二版)一书来教授自己的Python。 在练习46中,它告诉我阅读Pip,Distribute和其他一些软件包。

pip的文档足够清晰。 它允许我安装/卸载和升级软件包。 阅读分发的文档,它基本上似乎做同样的事情:

轻松下载,构build,安装,升级和卸载Python软件包

点子和分布之间有什么区别,它们是如何相互关联的?

[ 2014-10 TL; DR: distribute已经死了,使用pip ,新的setuptools ,二进制发行版, wheels 。 更多下面。]


[原文解答]

分发 是旧的setuptools的一个分支,所以几乎所有的注释同样适用于Distribute和setuptools。 Setuptools试图在甚至是更老的Python标准库软件包Distutils中填补一些漏洞。 Setuptools增加了一些function,比如通过命令行界面自动下载软件包, easy_install和一些依赖pipe理级别。 然而,Python社区的一部分人认为,setuptools过于侵入性,并且对其某些特性有着太多幕后的魔力。

pip是setuptools或Distribute之上的更高级别的接口。 它使用它们来执行其许多function,但避免了一些更有争议的function,如压缩的鸡蛋。 pip还提供了在setuptools不可用的setuptools ,如卸载命令,以及定义固定需求集合并可靠地复制一组软件包的function。 这里有一个更完整的function比较。

为什么有这么多的组件(还有更多,比如buildout )? 原因很多:解决scheme必须在支持Python的所有主要平台(即Unix-y,Windows,Mac OS X)上工作,因此构build和安装会带来一系列复杂的问题。 像许多开源项目一样,Python本质上是全部的志愿者,许多开发人员对打包和安装问题并不都感兴趣; 对标准图书馆增加重要的新的未经证实的特征是自然保守的; 意见分歧等

目前,有一个项目正在为Distutils提供一个替代品,可能还会提供一些更高级别的附加组件。 计划在Python 3.3标准库中作为打包包发布,并作为Distutils2老版本Python的附件。

总而言之,目前的关系是:

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

更新(2012-07) :在Python 3.3特性代码截断之前,已经决定packaging在标准库中还没有准备好发布,所以它已经从3.3版本中移除了。 继续使用可通过PyPI获得的Distutils2以及Python 3.4的标准库中包含的内容。


更新(2014-10):自从上次更新这个答案以来,Python包装领域发生了进一步的变化。

  • 最重要的是,自2013年年中以来, setuptoolsdistribute之间的裂痕已经得到治愈,开发活动也被合并为一个新的setuptools项目 。 现在distribute已被弃用,不再维护; 请改用新的setuptools但不要将其easy_install用作安装程序。

  • 在虚拟环境( virtualenvpyvenv )之内或之外, pip已经成为事实上和祝福的安装工具(对于Python平台的软件包pipe理器不提供的软件包)。

  • 而不是旧的setuptools bdist eggswheels已经成为Python软件包的受祝福的二进制分发格式。

  • 从Python 3.4开始 ,带有wheel支持的pip版本现在已经与官方的python.org二进制安装程序和源代码包一起提供了,预计下一个Python 2.7 (2.7.9)的维护版本中也将包含pip

  • Distutils2packaging现在处于hibernate状态。

Python 3文档的新分发Python模块部分和新的Python打包用户指南中的更多细节。