distribute、distutils、setuptools和distutils2之间的区别?

2021-06-14 23:32:32 发布

您现在位置:Python中文网/ 问答频道 /正文

形势

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

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


问题

不幸的是,我不确定这些模块之间的区别-distutilsdistributesetuptools。文档是最粗略的,因为它们看起来都是一个叉子,旨在在大多数情况下(但实际上,并不是全部)兼容,等等。


问题

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

3条回答
网友
1楼 ·

注意:答案已弃用,现在分发已弃用。自从Python打包机构成立以来,这个答案就不再有效了,并且已经做了很多工作来清理这个问题。


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

网友
2楼 ·

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

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

  • Setuptools是一个希望填充缺少的distutils功能并探索新方向的项目。在某些子单元中,它实际上是一个标准。它使用了Python核心开发人员不喜欢的猴子补丁和魔法。

  • Distribute是一个由开发人员创建的Setuptools分支,他们觉得自己的开发速度太慢,不可能对其进行改进。当distutils2由同一组启动时,它的发育明显减慢。2013年8月更新:distribute合并回setuptools并停止使用。

  • Distutils2是一个新的distutils库,最初是distutils代码库的一个分支,它从安装工具(其中一些在PEPs中已经详细讨论过)中获得了好的想法,并且是一个受pip启发的基本安装程序。 用于导入Distutils2的实际名称是Python 3.3+标准库中的packaging,或者是2.4+和3.1–3.2中的distutils2。(很快就会有一个backport。)Distutils2没有发布Python 3.3,它被挂起了。

更多信息:

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

网友
3楼 ·

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

Python Packaging User Guide值得一读。每一页都显示了“最后一次审阅”的日期,因此您可以查看手册的近况,而且非常全面。它托管在python软件基金会python.org的一个子域上,这一事实增加了它的可信度。这里Project Summaries页特别相关。

工具摘要:

以下是2017年1月Python打包环境的总结:

支持的工具:

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

  • Setuptools是为克服Distutils的限制而开发的,不包含在标准库中。它引入了一个名为easy_install的命令行实用程序。它还引入了可以在脚本中导入的setuptoolsPython包,以及可以在代码中导入的pkg_resourcesPython包,以查找随发行版安装的数据文件。它的缺点之一是它对Python包进行了monkey补丁。它应该与pip配合使用。It sees regular releases.

  • scikit build是一个改进的构建系统生成器,它在内部使用CMake构建编译的Python扩展。因为scikit构建不是基于distutils的,所以它没有任何限制。当忍者版本存在时,scikit版本可以比其他版本快三倍以上编译大型项目。它应该与pip配合使用。It sees regular releases.

弃用/废弃的工具:

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

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

Alpha软件:

  • Distlib是一个工具,旨在实现以前工具功能的子集,但只有在公认的政治公众人物中定义得很好的功能。它是PyPA(Python包权威)的工具之一,希望有一天它最终会包含在Python标准库中。它仍然被认为是alpha软件,因此最终用户要小心。

  • a couple more tools(例如:Bento),但我不会提及它们,因为它们太模糊或利基,或早期或未开发的回答,否则他们不是直接的替代品。

建议:

总之,在所有这些选项,我建议使用Setuptools,除非您的要求非常基本,而且只需要Distutils。Setuptools与Virtualenv和Pip(我强烈推荐的工具)配合得非常好。Virtualenv和Pip都可以被认为是官方的,因为它们是PyPA的一部分,而Python 3现在发布了^{}(这有助于在某些系统上安装pip)。

如果你在研究Virtualenv,你可能会对这个问题感兴趣:What is the difference between ^{}, ^{}, ^{}, ^{}, ^{}, etc?。(是的,我知道,我和你一起呻吟。)

另外,我建议您使用Virtualenv 1.10或更高版本,因为它是第一个承认Setuptools/Distribute合并的版本,适用于Python 2和3。

相关问题