setuptools、distribute和pip之间有什么关系?
setuptools、distribute和pip之间有什么关系?
我一直通过《笨办法学Python》(第二版)这本书自学Python。在第46个练习中,它告诉我阅读Pip、Distribute和一些其他包的文档。
pip的文档足够清晰,它允许我安装/卸载和升级包。阅读Distribute的文档后,它基本上似乎做着同样的事情:
轻松下载、构建、安装、升级和卸载Python包。
Pip和Distribute有什么区别,它们之间如何关联?
[2014-10 TL;DR: distribute
已经被废弃,应该使用新的pip
、setuptools
和,用于二进制分发的wheels
。更多详细请见下。]
[原始回答]
Distribute是曾经是老版本setuptools 的分支,所以下面许多评论同样适用于这两个包。Setuptools是想要填补早期Python标准库包Distutils的很多不足之处而推出的。Setuptools 添加了很多如自动下载包的命令行界面等特殊功能,例如easy_install
,还有一定的依赖项管理功能。然而,Python社区中的一部分人认为Setuptools过于侵入性,某些功能的幕后魔法太多了。
pip
是一个基于setuptools
或者Distribute
的高级接口。它使用它们来完成很多功能,但避开了一些更有争议的特性,例如zip文件的安装。pip
也提供了setuptools
中不可用的功能,例如卸载命令和定义一系列固定要求并可靠地再现包集的能力。 有一个更完整的功能比较在这里。
为什么有这么多组件(实际上还有更多,例如buildout
)?很多原因:解决方法必须跨越Python支持的所有主要平台工作(即Unix-y、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年中期以来,
setuptools
和distribute
之间的裂隙已经得到弥合,开发活动已经合并到一个新的setuptools
项目中。现在,distribute
已经过时,不再维护了。请使用新的setuptools
,但不要使用它的easy_install
作为安装程序。 -
pip
已经成为事实上的和被赞成的安装程序工具(用于Python包,否则就要由平台的软件包管理器提供),不管是在虚拟环境内还是外部(virtualenv
或pyvenv
)。 -
不再使用旧版的
setuptools
bdist eggs
,而是使用wheels作为Python软件包的赞成的二进制分发格式。 -
从Python 3.4开始,附带
wheel
支持的版本的pip
现在随着官方的python.org
二进制安装程序和源码包一起发布,并且预计pip
也将包含在Python 2.7的下一个维护版本中(2.7.9)。 -
Distutils2
和packaging
现在都处于休眠状态。
更多详细信息,请参阅Python 3文档中的新分发Python模块部分和新的Python软件包用户指南。