【问题标题】:Differences between distribute, distutils, setuptools and distutils2?分发、distutils、setuptools 和 distutils2 之间的区别?
【发布时间】:2011-09-14 16:53:15
【问题描述】:

情况

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

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


问题

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


问题

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

【问题讨论】:

  • 有多混乱?我是从 Java/C++ 背景来到 python 的。在这些情况下,分发非常简单。使用 python,我对所有这些分发系统完全感到困惑。
  • 我同意,Python 打包/安装有太多替代方案,而社区没有明确的指导。
  • 我只是想在不支持二进制分发的 pip 上链接这个相关信息lucumr.pocoo.org/2012/6/22/hate-hate-hate-everywhere
  • @pixelbeat pip 确实支持安装轮子(所谓的二进制发行版),该链接已过期。

标签: python packaging setuptools distutils distribute


【解决方案1】:

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

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

工具总结:

以下是 Python 打包格局的总结:

支持的工具:

已弃用/废弃的工具:

  • distributesetuptools 的一个分支。它共享相同的命名空间,因此如果您安装了 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 打包用户指南中的Project Summaries。我不会全部列出,也不会重复该页面,并保持答案与问题相匹配,这只是关于distributedistutilssetuptoolsdistutils2

建议:

如果所有这些对您来说都是新的,并且您不知道从哪里开始,我建议您学习setuptools,以及pipvirtualenv,它们都有效相处得很好。

如果您正在研究virtualenv,您可能会对这个问题感兴趣:What is the difference between venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, etc?。 (是的,我知道,我和你一起呻吟。)

【讨论】:

  • @makeramen:见this thread on the mailing list
  • 看起来也好不到哪里去:'Distribute' is a now deprecated fork of the 'Setuptools' project.@PyPI 分发页面。
  • @KurzedMetal,根据 SetupTools 人员的说法,setuptools 0.7 将包含分布式和旧的 setuptools 恢复秩序的宇宙。因此,事情实际上将得到显着改善!
  • Python Packaging User Guide 将拥有关于 python 打包状态的最新信息。 Nick Coughlan 在2013 PyCon 上注意到了这一点。
  • 你是上帝,感谢您保持这个维护,我有这个书签,有时我会回来看看我是否错过了任何更改,我已经看到了很多关于这个的更新回答。再说一遍:非常感谢您抽出宝贵的时间,就像您说周围有很多错误信息一样,我很高兴将其作为更新信息的可靠来源。
【解决方案2】:

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

  • Distutils 是用于打包的标准工具。它可以很好地满足简单的需求,但有限且难以扩展。

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

  • Distribute 是 Setuptools 的一个分支,由开发人员认为它的开发速度太慢并且无法对其进行改进而启动。当 distutils2 由同一组启动时,它的开发速度大大减慢。 2013 年 8 月更新:distribute 合并回 setuptools 并停止。

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

更多信息:

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

【讨论】:

  • 没有。 distutils2 从 setuptools/distribute 中获取了一些好的想法,无论是否标准化(PEP)(例如,我指导一个 GSoC 学生添加开发命令和自动脚本生成),但它永远不会成为替代品:有些部分是我们不想要的(eggs、VCS 集成等)。 OTOH,distutils2 有一些 setuptools/distribute 没有的东西。为了简化过渡,我认为发行版开发人员可能会使用 distutils2 来支持新的标准和工具;我还记得 setuptools 开发者说他想支持新标准。
  • ez_setup 在这一切中属于哪里? distutils2 的状态还有更新吗?
  • @ÉricAraujo 很抱歉听到延迟的消息。我真的希望它能及时为 3.4 做好准备!我喜欢 Python,但包装总是让我头疼不已。 (在其他新闻中,您的指南怎么样?如果完成了,您可以在上面的答案中链接它吗?)
  • @AlexisHuet 这种评论如果包含指向comment below的链接会更好(您可以从share按钮获得)。
  • 您或许应该更新答案以提及 distribute 最近被合并回 setuptools。大部分信息已经过时这一事实增加了混乱
【解决方案3】:

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


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

【讨论】:

  • 作为记录,我接受了这个答案,因为它告诉了我现在的情况(并且是另一个答案中的图片只是没有提到的关系的扩展)。在路上的某个地方,我还了解到文档本身通常不确定它要说什么。
  • @VPeric,确实,文档反映了这样一个事实,即 python 的这一方面处于不断变化/一团糟的状态。
【解决方案4】:

我意识到我已经回答了您的次要问题,但没有解决您原始问题中未经质疑的假设:

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

可能,而不是需要。其他策略描述在http://docs.python.org/dev/howto/pyporting

为此,我需要使用分发,

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

【讨论】:

  • 谢谢,尽管我们已经决定通过编写脚本来处理转换来解决这个问题。是的,我知道除了使用 2to3 之外还有其他选择,但是 SymPy 是一个复杂的代码库(我上次检查时大约有 200k+ 行),使用 2to3 是唯一现实的策略。再次感谢,无论如何!
【解决方案5】:

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

特别是,conda 可以快速创建 conda "environments"。您可以使用不同版本的 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 和系统级库

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

【讨论】:

    猜你喜欢
    • 2017-08-15
    • 2010-11-16
    • 2014-05-27
    • 2021-06-19
    • 2014-10-09
    • 2012-10-07
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多