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年年中以来,
setuptools
和distribute
之间的裂痕已经得到治愈,开发活动也被合并为一个新的setuptools
项目 。 现在distribute
已被弃用,不再维护; 请改用新的setuptools
但不要将其easy_install
用作安装程序。 -
在虚拟环境(
virtualenv
或pyvenv
)之内或之外,pip
已经成为事实上和祝福的安装工具(对于Python平台的软件包pipe理器不提供的软件包)。 -
而不是旧的
setuptools
bdisteggs
,wheels
已经成为Python软件包的受祝福的二进制分发格式。 -
从Python 3.4开始 ,带有
wheel
支持的pip
版本现在已经与官方的python.org
二进制安装程序和源代码包一起提供了,预计下一个Python 2.7 (2.7.9)的维护版本中也将包含pip
。 -
Distutils2
和packaging
现在处于hibernate状态。
Python 3文档的新分发Python模块部分和新的Python打包用户指南中的更多细节。