关于python:distribute,distutils,setuptools和distutils2之间的区别?

Differences between distribute, distutils, setuptools and distutils2?

形势

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

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

问题

不幸的是,我不知道这些模块之间的区别是什么——distutilsdistributesetuptools。文档尽可能简明扼要,因为它们似乎都是彼此的分叉,旨在在大多数情况下(但实际上并非全部)兼容……等等。

问题

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


截至2017年1月,该问题的所有其他答案均已过期至少两年。当您遇到关于Python打包问题的建议时,请记住查看发布日期,不要信任过期的信息。好的。

python packaging用户指南值得一读。每一页都会显示"上次审阅"的日期,因此您可以查看手册的最新版本,而且它非常全面。它在Python软件基金会的Python .Org的子域上托管的事实只是增加了信任。项目摘要页面在这里特别相关。好的。工具摘要:

以下是2017年1月的python打包环境总结:好的。支持的工具:

  • distutils仍然是用python打包的标准工具。它包含在标准库中(python2和python3.0到3.6)。它对于简单的Python发行版很有用,但缺少特性。它引入了可以在您的setup.py脚本中导入的distutilspython包。好的。

    • python package用户指南的official docs_distutils部分
  • SETUPTOOLS是为了克服distuils的局限性而开发的,不包括在标准库中。它引入了一个名为easy_install的命令行实用程序。它还介绍了可以在您的setup.py脚本中导入的setuptoolspython包,以及可以在代码中导入的pkg_resourcespython包,以定位安装了分发版的数据文件。它的一个优点是它monkey修补了distutilspython包。它应该和pip很好地配合。它会定期发布。好的。

    • 官方文档pypi page github repo setuptoolssection of python package user guide.>sub>
  • SciKit构建是一个改进的构建系统生成器,内部使用cmake构建编译的Python扩展。因为scikit构建不是基于distutils的,所以它实际上没有任何限制。当存在忍者版本时,Scikit版本可以比其他版本更快地编译大型项目三倍。它应该和pip很好地配合。它会定期发布。好的。

    • 官方文件pypi page github repo

弃用/废弃工具:

  • 分发是安装工具的一个分支。它共享相同的名称空间,因此如果您安装了distribute,那么import setuptools实际上会导入使用distribute分发的包。Distribute已合并回SetupTools 0.7,因此您不再需要使用Distribute。实际上,pypi上的版本只是安装安装安装工具的兼容层。好的。

  • distuils2试图利用distuils、setuptools和distribute中的优势,并成为Python标准库中包含的标准工具。其想法是,distuils2将针对旧的Python版本进行分发,distuils2将被重命名为针对Python3.3的packaging,该版本将包含在其标准库中。然而,这些计划没有按预期进行,目前distutils2是一个废弃的项目。最新的版本是在2012年3月,它的Pypi主页最终被更新以反映它的死亡。好的。

Alpha软件:

  • distlib是一个旨在实现先前工具功能的子集的工具,但仅限于在公认的PEP中定义得很好的功能。它是pypa(python package authority)的一个工具,希望有一天它最终能够包含在python标准库中。它仍然被认为是阿尔法软件,所以最终用户要小心。好的。

    • 官方文档pypi page bitback repo distlibsection of python package user guide.>sub>
  • 还有一些工具(如:便当),但我不会提及它们,因为它们太模糊、太利基、太早或太不发达,不适合这个答案,否则它们不是直接的替代品。好的。

建议:

因此,总之,在所有这些选项中,我建议使用安装工具,除非您的需求非常基本,并且您只需要distuils。安装工具与virtualenv和pip(我强烈推荐的工具)配合得很好。virtualenv和pip都可以被认为是正式的,因为它们是pypa的一部分,而python 3现在提供了ensurepip(这有助于在某些系统上安装pip)。好的。

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

作为附带说明,我建议使用virtualenv 1.10或更高版本,因为它是第一个承认针对python 2和3的setuptools/distribute合并的版本。好的。好啊。


我是distuils维护人员和distuils2/包装贡献者。我在2011年的Confoo大会上做了一个关于Python打包的讨论,现在我正在编写一个扩展版本。它还没有出版,所以这里有一些摘录应该有助于定义事物。

  • distutils是用于包装的标准工具。对于简单的需求,它工作得相当好,但是它是有限的,而且扩展起来并不容易。

  • SETUPTOOLS是一个项目,源于对填补缺少的distuils功能和探索新方向的渴望。在一些小城市,这是一个事实上的标准。它使用了Python核心开发人员不喜欢的猴子补丁和魔法。

  • Distribute是安装工具的一个分支,开发人员认为它的开发速度太慢,不可能进行改进。当distutils2由同一组启动时,其开发速度明显减慢。2013年8月更新:Distribute重新合并到SetupTools中并停止使用。

  • distuils2是一个新的distuils库,开始时作为distuils代码库的一个分支,从安装工具(其中一些在PEPS中进行了详细讨论)中获得了好的想法,并且是一个受PIP启发的基本安装程序。用于导入distutils2的实际名称是python 3.3+标准库中的packaging,或2.4+和3.1–3.2中的distutils2。(很快就会有一个backport可用。)distutils2 did not make the python 3.3 release,and it was put on hold.

更多信息:

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

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


注意:答案已弃用,分发现已废弃。

是的,你明白了。:-o我认为此时首选的包是分布式的,它是SETUPTOOLS的分支,是distutils(原始打包系统)的扩展。安装工具未被维护,因此被分叉并重命名,但安装时使用安装工具的包名称!我认为大多数Python开发人员现在都使用distribute,我可以肯定地说我使用distribute。


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

目前,这似乎是关于工具建议的最佳权威来源:https://packaging.python.org/en/latest/current.html工具建议


在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

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

此外,康达还具有以下特点:

  • Python不可知论者
  • 跨平台
  • 不需要管理员权限
  • 智能依赖性管理(通过SAT解决方案)
  • 可以很好地处理C、Fortran和系统级库,这些库可能需要与之链接

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


我认识到,我回答了你的第二个问题,但没有回答你最初问题中的毫无疑问的假设:

I'm trying to port an open-source library (SymPy, if anyone is wondering) to Python 3. To
do this, I need to run 2to3 automatically when building for Python 3.

你可以,不需要。其他策略在http://docs.python.org/dev/howto/pyporting中介绍。

To do that, I need to use distribute,

您可以:)distutils支持代码(而不是docstrings)的构建时2to3转换,其方式与安装期间分发的方式不同:http://docs.python.org/dev/howto/pyporting


这个主题似乎还在不断变化。截至2013年10月31日,"python packaging用户指南"快速建议定义了"当前推荐的工具集"。它曾经链接到"Python打包的未来",现在是2019年1月20日,5年后,一个死链接。:)