我通过《笨办法学Python》(第二版)自学Python。在第46练习中,它告诉我要了解Pip、Distribute和其他几个包。
Pip文档已经讲得很清楚了。它允许我安装/卸载和升级软件包。阅读Distribute的文档,它基本上似乎做着同样的事情:
轻松地下载、构建、安装、升级和卸载Python软件包
Pip和Distribute之间有什么区别,它们之间如何相互关联?
我通过《笨办法学Python》(第二版)自学Python。在第46练习中,它告诉我要了解Pip、Distribute和其他几个包。
Pip文档已经讲得很清楚了。它允许我安装/卸载和升级软件包。阅读Distribute的文档,它基本上似乎做着同样的事情:
轻松地下载、构建、安装、升级和卸载Python软件包
Pip和Distribute之间有什么区别,它们之间如何相互关联?
[2014-10 TL;DR:
distribute
已经过时,使用pip
、新的setuptools
以及二进制分发中的wheels
。详情见下文。]
[Translated answer]
分发 是曾经是setuptools的一个分支,因此几乎所有后续的评论同样适用于Distribute和setuptools。Setuptools旨在填补更古老的Python标准库包Distutils中的一些空白。Setuptools添加了一些函数,例如通过命令行界面 easy_install
实现自动下载软件包,以及一定程度的依赖关系管理。然而,Python社区的一部分人认为setuptools过于具有侵入性,并且某些功能的背后有过多的魔法。
pip
是在setuptools或Distribute之上的更高级接口。它使用它们执行许多功能,但避免了一些更具争议性的功能,例如zipped eggs。 pip
还提供了setuptools
中不可用的功能,例如卸载命令和定义固定要求集并可靠地复制一组软件包的能力。这里有一个更完整的功能比较here。
为什么会有这么多组件(还有更多,例如buildout
)?有很多原因:解决方案必须适用于Python支持的所有主要平台(即Unix-y、Windows、Mac OS X),因此构建和安装涉及到一套复杂的问题;与许多开源项目一样,Python基本上是全志愿者的,许多开发人员对打包和安装问题并不感兴趣;在标准库中添加新的未经验证的主要功能存在自然保守性;意见不同等等。
目前正在进行一个项目,旨在提供Distutils的替代方案,可能也适用于一些更高级别的附加组件。计划将其作为packaging
软件包发布在Python 3.3标准库中,并作为Distutils2
的附加组件发布给旧版本的Python用户。
总之,当前的关系是:
pip -> [ setuptools | Distribute ] -> Distutils -> Python core
|
3rd party packages | included in Python
|
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打包用户指南提供更多详细信息。