55

我一直在通过“Learn Python The Hard Way”(第 2 版)一书自学 Python。在练习 46 中,它告诉我阅读 Pip、Distribute 和其他一些包。

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

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

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

4

1 回答 1

84

[ 2014-10 TL;DR: distribute已死,使用pip,新的setuptools,并且,对于二进制发行版,wheels. 更多下文。]


[原答案]

分发 是较旧的setuptools的一个分支,因此几乎所有随后的评论都同样适用于 Distribute 和 setuptools。Setuptools 试图填补更老的 Python 标准库包Distutils中的许多漏洞。Setuptools 添加了一些功能,例如通过命令行界面自动下载软件包easy_install,以及某种程度的依赖管理。然而,Python 社区的一部分人认为 setuptools 过于侵入性,并且它的某些功能具有太多的幕后魔力。

pip是 setuptools 或 Distribute 之上的更高级别的接口。它使用它们来执行其许多功能,但避免了它们的一些更具争议性的功能,例如带拉链的鸡蛋。 pip还提供了 中不可用的功能setuptools,例如卸载命令以及定义固定需求集和可靠地复制一组包的能力。这里有更完整的功能比较。

为什么有这么多组件(还有更多,比如buildout)?很多原因:解决方案必须适用于所有支持 Python 的主要平台(即 Unix-y、Windows、Mac OS X),因此构建和安装会带来一系列复杂的问题;像许多开源项目一样,Python 本质上是全自愿的,许多开发人员对打包和安装问题并不那么感兴趣;在标准库中添加未经证实的主要新特性是一种自然的保守主义;意见分歧等

目前,有一个项目正在进行中,以提供 Distutils 的替代品,并可能替代一些更高级别的附加组件。它计划作为packaging包在 Python 3.3 标准库中发布,并作为旧版本 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用作安装程序。

  • pipvirtualenv已成为虚拟环境 (或)内部或外部事实上且受祝福的安装工具(适用于平台的包管理器未提供的 Python 包pyvenv)。

  • 代替旧的setuptoolsbdist eggswheels已成为 Python 包的受祝福的二进制分发格式。

  • 从 Python 3.4开始,官方二进制安装程序和源包中附带了一个带有支持的版本,pip预计它也将包含在Python 2.7 (2.7.9)的下一个维护版本中。wheelpython.orgpip

  • Distutils2现在packaging处于休眠状态。

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

于 2011-12-18T08:04:28.257 回答