分布,distutils,setuptools和distutils2之间的差异?

VPe*_*ric 588 python packaging distutils setuptools distribute

情况

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

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


问题

不幸的是,我不知道什么是这些模块-之间的区别distutils,distribute,setuptools.文档是最好的粗略,因为它们似乎都是彼此的分支,旨在在大多数情况下兼容(但实际上,不是全部)......等等.


问题

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

Fli*_*imm 824

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

Python的包装用户指南值得一读.每个页面都显示"上次审核"日期,因此您可以查看手册的新近度,并且它非常全面.事实上,它托管在Python软件基金会的python.org的子域上,只是增加了它的可信度.该项目总结页面是特别与此有关.

工具摘要:

以下是2017年1月Python包装环境的摘要:

支持的工具:

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

  • Setuptools的开发是为了克服Distutils的局限性,并未包含在标准库中.它引入了一个名为的命令行实用程序easy_install.它还介绍了setuptools可以在setup.py脚本中导入的pkg_resourcesPython包,以及可以在代码中导入的Python包,用于查找随分发安装的数据文件.其中一个问题是它可以修补distutilsPython包.它应该很好用pip.它看到定期发布.

  • scikit-build是一个改进的构建系统生成器,它在内部使用CMake构建编译的Python扩展.因为scikit-build不是基于distutils,所以它实际上没有任何限制.当存在ninja-build时,scikit-build可以编译大型项目的速度比替代方案快三倍.它应该很好用pip.它看到定期发布.

弃用/弃用工具:

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

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

Alpha软件:

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

  • 还有一些工具(例如:Bento),但我不会提及它们,因为它们对于这个答案帖子来说太过模糊或利基或早期或未开发,否则它们不是直接替代品.

建议:

总而言之,在所有这些选项中,我建议使用Setuptools,除非您的要求非常基本且只需要Distutils.Setuptools与Virtualenv和Pip非常合作,我强烈推荐这些工具.Virtualenv和Pip都可以被认为是官方的,因为它们是PyPA的一部分,而Python 3现在出货ensurepip(它可以帮助您pip在某些系统上安装).

如果你正在寻找进入VIRTUALENV,你可能有兴趣在这样一个问题:是什么区别venv,pyvenv,pyenv,virtualenv,virtualenvwrapper,等?.(是的,我知道,我和你一起呻吟.)

作为附注,我建议使用Virtualenv 1.10或更高版本,因为它是第一个识别用于Python 2和3的Setuptools/Distribute合并的版本.

  • [Python包装用户指南](https://python-packaging-user-guide.readthedocs.org/en/latest/index.html)将获得有关python包装状态的最新信息.Nick Coughlan在[2013 PyCon](https://www.youtube.com/watch?v=ePFWp3oSfyU)上发现了这一点. (8认同)
  • 并且看起来没有更好:''Distribute'是'Setuptools'项目的一个现已弃用的分支.@ PyPI Distribute页面. (6认同)
  • @KurzedMetal,根据SetupTools人员的说法,setuptools 0.7将包含分发和旧的setuptools恢复到宇宙的顺序.所以实际上事情会有很大改善! (3认同)
  • @makeramen:参见[邮件列表中的这个帖子](http://mail.python.org/pipermail/python-dev/2012-June/120430.html). (2认同)
  • 你是上帝,感谢你保持这个维护,我把这个添加了书签,时不时地我回来看看我是否错过了任何更改,我已经看到了这个答案的很多更新。再次:非常感谢您抽出宝贵的时间,就像您所说,周围有很多错误信息,我很高兴将此作为更新信息的可靠来源。 (2认同)

Éri*_*ujo 251

我是distutils维护者和distutils2 /包装贡献者.我在ConFoo 2011上谈了Python包装,现在我正在编写它的扩展版本.它还没有发布,所以这里有摘录应该有助于定义事物.

  • Distutils是用于包装的标准工具.它对于简单的需求非常有效,但是有限且不易于扩展.

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

  • Distribute是Setuptools的一个分支,由开发人员发现它的开发速度太慢并且无法进化它.当distutils2由同一组开始时,它的发展相当缓慢.2013年8月更新:分发合并回setuptools并停止.

  • Distutils2是一个新的distutils库,作为distutils代码库的一个分支,从设置工具(其中一些在PEP中进行了彻底讨论)中获得了很好的想法,以及受pip启发的基本安装程序. 用于导入Distutils2的实际名称packaging在Python 3.3+标准库中,或者distutils2在2.4+和3.1-3.2中.(很快就会有一个backport.) Distutils2没有发布Python 3.3,它被搁置了.

更多信息:

我希望尽快完成我的指南,它将包含有关每个图书馆的优缺点和过渡指南的更多信息.

  • @AlexisHuet如果它包含[下面的注释](http://stackoverflow.com/a/14753678/131120)(你可以从`share`按钮获得)的链接,这种评论会更好. (9认同)
  • @ÉricAraujo很抱歉听到延迟.我真的希望它能及时准备好3.4!我喜欢**Python,但包装总是让我撞到墙上.(在其他新闻中,你的导游将如何到来?如果它已经完成,你可以在上面的答案中链接它吗?) (2认同)
  • 你应该更新答案,提到`distribute`最近被合并回`setuptools`.事实上,大部分信息都已过时,这增加了混乱 (2认同)

Kei*_*ith 5

注意:不推荐使用的答案,现在分发已过时.

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

  • @VPeric,确实,文档反映了这样一个事实:python的这个方面处于变化/乱七八糟的状态. (2认同)