Python有一些工具可以用来打包和描述项目,这些工具的历史比较混乱: 包括标准库中的distutils
, distribute
, distutils2
, 以及setuptools
(也许还有其他工具)。看起来distribute
和distutils2
已经停止开发,而setuptools
成为了主流,这就留下了两个竞争标准。
我理解setuptools
提供了比distutils
更多的选项(例如声明依赖关系、测试等),但它并没有被包含在Python标准库中(至少目前是这样的)。
Python Packaging User Guide[1]现在建议:
使用
setuptools
定义项目并创建源分发包。
并解释道:
虽然许多项目都可以使用纯
distutils
,但它不支持定义对其他项目的依赖关系,并且缺少几个方便的实用程序来自动正确填充包元数据,setuptools
提供了这些实用程序。作为一个不在标准库中的工具,setuptools
也提供了一组更加一致的特性,适用于不同版本的Python,并且(与distutils
不同),setuptools
将会在所有支持的版本上更新为即将发布的“Metadata 2.0”标准格式。即使是使用
distutils
的项目,当pip从源代码直接安装这些项目(而不是从预编译的wheel文件安装)时,它实际上也会使用setuptools
来构建您的项目。
然而,查看各种项目的setup.py文件后可以发现这似乎并不是一个实际的标准。许多包仍然使用distutils
,而那些支持setuptools
的包通常会混合使用setuptools
和distutils
,例如通过回退导入:
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
接着尝试找到一种方法,可以编写一个可以同时被setuptools
和distutils
安装的设置。这通常包括各种容易出错的依赖检查方式,因为distutils
不支持在设置函数中添加依赖。
为什么人们仍在做额外的努力来支持distutils
- setuptools
不在标准库中是唯一的原因吗?distutils
的优点是什么,编写仅支持setuptools
的setup.py文件是否存在任何缺点。
distutils
已经合并回setuptools
,但是有些遗留应用程序是用distutils
编写的,迁移到正确的标准需要付出成本。 - metatoastersetuptools
是distutils
的增强替代品,但请注意 "建议使用 pip 安装程序运行所有的setup.py
脚本都使用setuptools
,即使脚本本身只导入distutils
"(来源) - user2314737