分发,distutils,setuptools和distutils2之间的区别?

情况

我试图将一个开源库移植到Python 3.( SymPy ,如果有人想知道)。

所以,我需要为Python 3构build时自动运行2to3 。为此,我需要使用distribute 。 因此,我需要移植目前的系统,这(根据doctest)是distutils

问题

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

问题

有人可以解释这些差异吗? 我该用什么? 什么是最现代化的解决scheme? (另外,我还要感谢一些关于移植到Distribute指南,但这超出了问题的范围。)

截至2017年1月,对这个问题的所有其他答案至less有两年过期。 当您遇到有关Python包装问题的build议时,请记住查看发布date,不要信任过时的信息。

Python打包用户指南值得一读。 每个页面都显示“上次检查”date,因此您可以检查手册的新近性,这是相当全面的。 它被托pipe在Python Software Foundation的python.org的一个子域名上的事实只是增加了它的可信度。 项目摘要页面在这里特别重要。

工具总结:

以下是2017年1月Python包装的总结:

支持的工具:

  • Distutils仍然是Python打包的标准工具。 它包含在标准库(Python 2和Python 3.0到3.6)中。 这对于简单的Python发行版很有用,但缺乏特性。 它介绍了可以在setup.py脚本中导入的distutils Python包。

    • 官方文档 | Python软件包用户指南的distutils部分
  • Setuptools是为了克服Distutils的局限性而开发的,不包含在标准库中。 它引入了一个名为easy_install的命令行工具。 它还介绍了可以在setup.py脚本中导入的pkg_resources Python包,以及可以在代码中导入的pkg_resources Python包,以定位随分发安装的数据文件。 其中一个问题是,它会修复distutils Python包。 它应该与pip很好地工作。 它看到正式版本。

    • 官方文档 | Pypi页面 | GitHub repo | Python包用户指南的setuptools部分

弃用/放弃的工具:

  • 分发是Setuptools的一个分支。 它共享相同的命名空间,所以如果你安装了Distribute, import setuptools实际上会导入使用Distribute分发的包。 分发被合并回到Setuptools 0.7 ,所以你不需要再使用分配。 事实上,Pypi上的版本只是一个安装Setuptools的兼容层。

  • Distutils2是尝试采用Distutils,Setuptools和Distribute中最好的一种,并成为Python标准库中包含的标准工具。 这个想法是,Distutils2将分发给旧的Python版本,Distutils2将被重新命名为Python 3.3的packaging ,这将包括在它的标准库。 但是,这些计划并没有按预期进行,目前Distutils2是一个被遗弃的项目 。 最新版本是在2012年3月,其Pypi主页终于更新,以反映其死亡。

Alpha软件:

  • Distlib是一个工具,旨在实现以前的工具function的一个子集,但只有在接受的PEP中定义得非常好的function。 它是PyPA(Python Package Authority)的一个工具,有望在某一天最终被包含在Python标准库中。 它仍然被认为是alpha软件,所以最终用户要小心。

    • 官方文档 | Pypi页面 | Bitbucket回购 | Python包用户指南的distlib部分
  • 还有更多的工具 (例如:Bento),但是我不会提到它们,因为它们太晦涩难懂了,或者很早或者还没开发出来,或者它们不是直接的select。

build议:

所以最后,在所有这些选项中, 我会推荐Setuptools ,除非你的要求是非常基本的,你只需要Distutils。 Setuptools与Virtualenv和Pip,我强烈推荐的工具很好地工作。 Virtualenv和Pip都可以被认为是官方的,因为它们是PyPA的一部分,Python 3现在提供了ensurepip (可以帮助你在某些系统上安装pip )。

如果你正在寻找Virtualenv,你可能会对这个问题感兴趣: venvpyvenvpyenvvirtualenvvirtualenvwrapper等有什么区别? 。 (是的,我知道,我呻吟着。)

作为一个侧面说明,我build议使用Virtualenv 1.10或更高版本,因为它是Python 2和3的第一个识别Setuptools / Distribute合并的版本。

我是distutils维护者和distutils2 /包装贡献者。 我在ConFoo 2011上做了一个关于Python打包的讨论,现在我正在写一个扩展的版本。 目前还没有发布,所以这里有一些摘录可以帮助你定义。

  • Distutils是用于包装的标准工具。 它对于简单的需求来说工作得很好,但是有限而且不是微不足道的。

  • Setuptools是一个从渴望填补缺失distutilsfunction和探索新的方向出生的项目。 在一些分社区,这是一个事实上的标准。 它使用Python核心开发人员所诟病的猴子补丁和魔法。

  • 分发是Setuptools的一个分支,开发人员感觉它的开发速度太慢,而且无法进化。 当同一组发动distutils2时,其发展速度大大减慢。 2013年8月更新:分发合并到setuptools并终止。

  • Distutils2是一个新的distutils库,作为distutils代码库的一个分支开始,从安装工具(其中一些在PEP中进行了深入的讨论)中获得了很好的想法,还有一个受pip启发的基本安装程序。 用于导入Distutils2的实际名称是packaging在Python 3.3+标准库中,或者distutils2 packaging在2.4+和3.1-3.2中。 (一个backport即将可用。) Distutils2并没有使Python 3.3的版本,它被搁置。

更多信息:

  • Distutils的命运–Pycon Summit + Packaging Sprint详细报道
  • Distutils和Distutils之间的快速差异2

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

注意:不赞成反对,现在分发已经过时。

是的,你知道了。 :-o我想这个时候首选的包是Distribute ,它是setuptools的一个分支,它是distutils(原始包装系统)的扩展。 Setuptools没有被维护,所以被分叉和重命名,但是当安装它使用setuptools的包名! 我认为大多数Python开发人员现在都使用Distribute,我可以肯定地说我是这么做的。

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

conda特别快速地创造conda“ 环境 ”。 您可以使用不同版本的Python来configuration您的环境。 例如:

conda create -n py34 python=3.4 anaconda

conda create -n py26 python=2.6 anaconda

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

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

source activate <env name>

这个特性对于你不得不处理不同版本的Python的情况似乎特别有用。

而且,conda具有以下特点:

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

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

很多人在这里抱怨在这个问题上缺乏明确的社区指导。

目前,这看起来像工具build议最好的权威来源: https : //packaging.python.org/en/latest/current.html#tool-recommendations

我意识到我已经回答了你的第二个问题,而没有解决你原来的问题中的无可置疑的假设:

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

可以不需要 。 其他策略在http://docs.python.org/dev/howto/pyporting中描述;

要做到这一点,我需要使用分发,

可以 🙂 distutils支持构build时间2to3转换的代码(不docstrings),以不同的方式分发的: http : //docs.python.org/dev/howto/pyporting#during-installation

这个问题似乎还在不断变化。 截至2013年10月31日,“Python打包用户指南” 快速build议定义了“目前推荐的工具集”。 它还链接到“ Python包装的未来 ”