【发布时间】:2014-10-09 20:31:48
【问题描述】:
Python 在可用于打包和描述项目的工具方面有着令人困惑的历史:这些工具包括标准库中的 distutils、distribute、distutils2 和 setuptools(可能还有更多)。似乎 distribute 和 distutils2 已停止使用,取而代之的是 setuptools,这留下了两个相互竞争的标准。
据我了解,setuptools 提供了比distutils 更多的选项(例如声明依赖项、测试等),但它还没有包含在 Python 标准库中(还没有?)。
Python 打包用户指南[1] 现在推荐:
使用
setuptools定义项目并创建源分发。
并解释:
虽然您可以将纯
distutils用于许多项目,但它不支持定义对其他项目的依赖关系,并且缺少setuptools提供的用于正确自动填充包元数据的几个便利实用程序。在标准库之外,setuptools 还为不同版本的 Python 提供了更一致的功能集,并且(与distutils不同),setuptools将被更新以在所有支持的版本上生成即将推出的“元数据 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 不支持 setup 函数中的依赖项。
为什么人们仍在努力支持distutils - 这是setuptools 不在标准库中的唯一原因吗? distutils 的优点是什么,编写只支持 setuptools 的 setup.py 文件有什么缺点。
【问题讨论】:
-
distutilshas been merged back intosetuptools,但有一些旧版应用程序是为使用distutils而编写的,并且迁移到正确的标准需要成本。 -
“distribute 和 distutils2 似乎已停止使用 setuptools”,正确,distribute 现在只是 setuptools 的包装,distutils2 已死。
-
setuptools是distutils的增强替代方案,但请注意“推荐的 pip 安装程序使用setuptools运行所有 setup.py 脚本,即使脚本本身只导入distutils" (source)
标签: python packaging setuptools distutils