Python 有一段令人困惑的工具史,可以用来打包和描述项目: 这些工具包括标准库中的 distutils
、 distribute
、 distutils2
和 setuptools
(也许还有更多)。看来,distribute
和 distutils2
已经停产,取而代之的是 setuptools
,这就留下了两个相互竞争的标准。
据我所知,setuptools
提供了比 distutils
多得多的选项(例如声明依赖项、测试等) ,但是它还没有包含在 Python 标准库中(还没有?).
Python 打包用户指南[ 1]现在建议:
使用
setuptools
定义项目并创建源发行版。
并解释说:
尽管您可以对许多项目使用纯
distutils
,但是它不支持定义对其他项目的依赖关系,并且缺少一些方便的实用工具来正确地自动填充由setuptools
提供的包元数据。在标准库之外,setuptools 还为不同版本的 Python 提供了更加一致的特性集,而且(与distutils
不同) ,setuptools
将被更新,以便在所有支持的版本上生成即将推出的“ Metadata 2.0”标准格式。即使对于选择使用
distutils
的项目,当 pip 直接从源代码安装此类项目(而不是从预构建的轮文件安装)时,它实际上也会使用setuptools
构建项目。
然而,查看各种项目的 Setup.py文件显示,这似乎不是一个实际的标准。许多软件包仍然使用 distutils
,而那些支持 setuptools
的软件包经常将 setuptools
和 distutils
混合在一起,例如通过执行后备导入:
try:
from setuptools import setup
except ImportError:
from distutils.core import setup
然后尝试找到一种方法来编写可由 setuptools
和 distutils
安装的安装程序。这通常包括各种容易出错的依赖关系检查方法,因为 distutils
不支持 setup 函数中的依赖关系。
为什么人们仍然在额外的努力去支持 distutils
-setuptools
不在标准库中的事实是唯一的原因吗?distutils
的优点是什么? 编写仅支持 setuptools
的 Setup.py文件有什么缺点吗。