621

情况

我正在尝试将开源库移植到 Python 3。(SymPy,如果有人想知道的话。)

因此,在为 Python 3 构建时,我需要2to3自动运行。为此,我需要使用distribute. 因此,我需要移植当前系统,(根据 doctest)是distutils.


问题

不幸的是,我不确定这些模块之间有什么区别——<code>distutils, distribute, setuptools. 文档最好是粗略的,因为它们似乎都是彼此的一个分支,旨在在大多数情况下兼容(但实际上,并非全部)......等等,等等。


问题

有人可以解释这些差异吗?我应该用什么?什么是最现代的解决方案?(顺便说一句,我也很欣赏一些关于移植到Distribute的指南,但这有点超出了问题的范围......)

4

5 回答 5

881

截至 2020 年 3 月,这个问题的大多数其他答案都已经过时了好几年。当您遇到有关 Python 打包问题的建议时,请记住查看发布日期,不要相信过时的信息。

Python 打包用户指南值得一读。每个页面都有显示的“最后更新”日期,因此您可以查看手册的新近度,并且非常全面。它托管在 Python 软件基金会的 python.org 子域上的事实只是增加了对它的信任。项目摘要页面在这里特别重要。

工具总结:

以下是 Python 打包环境的总结:

支持的工具:

已弃用/废弃的工具:

  • distribute是一个叉子setuptools。它共享相同的命名空间,因此如果您安装了 Distribute,import setuptools实际上会导入使用 Distribute 分发的包。Distribute 已合并回 Setuptools 0.7,因此您不再需要使用 Distribute。实际上,Pypi 上的版本只是安装了 Setuptools 的兼容层。

  • distutils2是一次尝试充分利用distutilssetuptoolsdistribute成为 Python 标准库中包含的标准工具。这个想法是distutils2为旧的 Python 版本分发,然后distutils2将其重命名packaging为 Python 3.3,将其包含在其标准库中。然而,这些计划并没有按预期进行,目前distutils2是一个废弃的项目。最新版本是在 2012 年 3 月,它的 Pypi 主页终于更新以反映它的死亡。

其他:

还有其他工具,如果您有兴趣,请阅读Python 打包用户指南中的项目摘要。我不会将它们全部列出,也不会重复该页面,并保持答案与问题相匹配,该问题只是关于distribute,distutils和.setuptoolsdistutils2

推荐:

如果所有这些对您来说都是新的,并且您不知道从哪里开始,我建议您学习setuptools,以及pipvirtualenv,它们可以很好地协同工作。

如果您正在研究virtualenv,您可能会对这个问题感兴趣:, , , ,等之间有什么区别?venvpyvenvpyenvvirtualenvvirtualenvwrapper. (是的,我知道,我和你一起呻吟。)

于 2013-02-07T14:37:50.217 回答
253

我是 distutils 维护者和 distutils2/packaging 贡献者。我在 ConFoo 2011 上做了一个关于 Python 打包的演讲,这些天我正在编写它的扩展版本。它还没有发布,所以这里有一些可以帮助定义事物的摘录。

  • Distutils是用于打包的标准工具。它适用于简单的需求,但它是有限的,而且扩展起来并不简单。

  • Setuptools是一个出于填补 distutils 缺失功能和探索新方向的愿望而诞生的项目。在某些子社区中,这是事实上的标准。它使用了 Python 核心开发人员不喜欢的猴子补丁和魔法。

  • Distribute是 Setuptools 的一个分支,由开发人员开始,他们觉得它的开发速度太慢并且无法发展它。当 distutils2 由同一组启动时,它的开发速度大大减慢。2013 年 8 月更新:distribute 被合并回 setuptools 并停止。

  • Distutils2是一个新的 distutils 库,作为 distutils 代码库的一个分支开始,它的好想法来自设置工具(其中一些在 PEP 中进行了全面讨论),以及受 pip 启发的基本安装程序。 您用于导入 Distutils2 的实际名称packaging在 Python 3.3+ 标准库中,或者distutils2在 2.4+ 和 3.1–3.2 中。(很快就会有一个反向移植。) Distutils2 没有发布 Python 3.3 版本,因此被搁置了。

更多信息:

我希望尽快完成我的指南,它将包含有关每个图书馆的强项和弱点的更多信息以及过渡指南。

于 2011-06-29T15:07:17.643 回答
5

注意:不推荐使用答案,现在分发已过时。自 Python Packaging Authority 成立以来,这个答案不再有效,并且已经做了很多清理工作。


是的,你明白了。:-o 我认为此时首选的包是Distribute,它是 setuptools 的一个分支,它是 distutils (原始打包系统)的扩展。Setuptools 没有得到维护,因此被分叉并重命名,但是在安装时它使用 setuptools 的包名!我认为大多数 Python 开发人员现在都使用 Distribute,而且我可以肯定地说我会使用。

于 2011-06-14T14:00:51.233 回答
2

我意识到我已经回答了您的第二个问题,但没有解决您原始问题中毫无疑问的假设:

我正在尝试将一个开源库(SymPy,如果有人想知道的话)移植到 Python 3。为此,我需要在为 Python 3 构建时自动运行 2to3。

可能不需要http://docs.python.org/dev/howto/pyporting中描述了其他策略

为此,我需要使用分发,

可以:) distutils 支持代码(不是文档字符串)的构建时 2to3 转换,以不同的方式分发:http ://docs.python.org/dev/howto/pyporting#during-installation

于 2011-07-29T14:16:08.183 回答
2

在 2014 年底更新了这个问题,幸运的是,Continuum 的“ conda ”包管理器 已经极大地清理了 Python 打包混乱。

特别是,conda 可以快速创建 conda“环境”。您可以使用不同版本的 Python 配置您的环境。例如:

conda create -n py34 python=3.4 anaconda

conda create -n py26 python=2.6 anaconda

将使用不同版本的 Python 创建两个(“py34”或“py26”)Python 环境。

之后,您可以使用特定版本的 Python 调用环境:

source activate <env name>

在您必须处理不同版本的 Python 的情况下,此功能似乎特别有用。

此外,conda 具有以下特点:

  • Python 不可知论者
  • 跨平台
  • 无需管理员权限
  • 智能依赖管理(通过 SAT 求解器)
  • 很好地处理您可能需要链接的 C、Fortran 和系统级库

如果您在科学计算领域,最后一点尤其重要。

于 2014-09-29T21:26:30.910 回答