一尘不染

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

python

情况
我正在尝试将开放源代码库移植到Python3。(SymPy,如果有人想知道的话。)

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

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

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


阅读 415

收藏
2020-02-19

共1个答案

一尘不染

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

《Python包装用户指南》值得一读。每个页面上都显示有“上次审阅”日期,因此你可以检查本手册的新近度,并且内容全面。它托管在Python Software Foundation的python.org的子域中,这本身就增加了可信度。“ 项目摘要”页面在这里尤其重要。

工具摘要:
以下是2017年1月Python封装格局的摘要:

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

官方文档 | distutilsPython软件包用户指南”部分
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中,因此你不再需要使用分发。实际上,Pypi上的版本只是安装Setuptools的兼容层。

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

Alpha软件:

Distlib是一种工具,旨在实现以前工具功能的子集,但仅实现在公认的PEP中非常明确定义的功能。它是PyPA(Python打包机构)的工具之一,希望有朝一日最终将其包含在Python标准库中。它仍然被认为是alpha软件,因此最终用户要当心。

还有更多工具(例如Bento),但我不会提及它们,因为它们对于本答案过分模糊,利基,太早或尚未开发,否则它们不是直接的替代品。

建议:

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

如果你正在寻找进入VIRTUALENV,你可能有兴趣在这样一个问题:是什么区别venv,pyvenv,pyenv,virtualenv,virtualenvwrapper,等?。

2020-02-19