Python有一个令人困惑的工具历史,可以用来打包和描述项目:这些工具包括标准库中的distutils、distribute、distutils2和setuptools (可能还有更多)。distribute和distutils2似乎是为了支持setuptools而停止的,这就留下了两个相互竞争的标准。
据我理解,setuptools提供了更多的选项(例如声明依赖项、测试等)。但是,它没有包含在Python库中(还?)。
[1]现在建议:
使用
setuptools定义项目并创建源分布。
并解释:
虽然可以在许多项目中使用纯
distutils,但它不支持定义对其他项目的依赖关系,并且缺少几个方便的实用程序来自动正确填充由setuptools提供的包元数据。在标准库之外,setuptools还为不同版本的Python提供了更一致的特性集,并且(与distutils不同),setuptools将被更新以在所有受支持的版本上生成即将出现的“元数据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不支持安装函数中的依赖项。
为什么人们仍然在为支持distutils而付出额外的努力--难道setuptools不在标准库中是唯一的原因吗?distutils的优点是什么,编写只支持setuptools的setup.py文件有什么缺点吗?
发布于 2014-08-18 21:07:46
看看这个问题吧。它很好地解释了所有的打包方法,并可能在一定程度上帮助回答您的问题:分发、distutils、setuptools和distutils2之间的差异?
远程仍然是用进行打包的标准工具。它包含在标准库中(Python 2和Python3.0至3.3)。它对于简单的Python发行版很有用,但缺乏特性。它介绍了可以在setup.py脚本中导入的distutils Python包。 Setuptools是为了克服远程技术的局限性而开发的,并不包括在标准库中。它引入了一个命令行实用工具easy_install。它还介绍了可以在setup.py脚本中导入的setuptools包,以及可以在代码中导入以定位随发行版安装的数据文件的pkg_resources Python包。它的一个问题是它对distutils Python包进行了猴子补丁。它应该能很好地应用于pip。最新版本于2013年7月发布。
因此,正如您所看到的,setuptools应该比distutils更好,而且我知道您的问题来自何处,但是我并不认为distutils很快就会失去支持,简单地说,它在许多情况下与一些流行的遗留程序一起使用。正如您可能知道的那样,在遗留程序中更改这些东西是很痛苦的,并且会带来很多问题,例如不兼容,这将导致开发人员不得不重写源代码。因此,还有一个事实,即distutils是标准python库的一部分,而setuptools不是。因此,如果您正在创建python程序,在这个时代,使用setuptools,但是要记住,如果没有distutils,setuptools就不会存在。
发布于 2014-08-18 09:16:44
实际上,setuptools不在标准库中是唯一的原因
这就是原因之一。以下是直接来自setup.py的内容
if len(sys.argv) >= 2 and ('--help' in sys.argv[1:] or
sys.argv[1] in ('--help-commands', 'egg_info', '--version',
'clean')):
# Use setuptools for these commands (they don't work well or at all
# with distutils). For normal builds use distutils.
try:
from setuptools import setup
except ImportError:
from distutils.core import setup因此,如果NumPy能找到它,它会更喜欢setuptools。但是SciPy过去常常这样做,直到修补在某些情况下更喜欢distutils。引用提交日志:
Setuptools sets mode +x on the test scripts, so that Nose refuses to run
them. Better not do that.当然,合并在setuptools和distribute之间应该能够在适当的时候解决所有这些问题,但是许多包仍然需要支持Python2.6安装。
发布于 2014-08-24 11:32:02
我们仍然讨论和使用distutils的原因有几个,尽管setuptools无疑是更好的工具集。
首先,distutils随处可见。如果您希望构建一个与其他人共享的模块,并且没有任何复杂的需求,那么它将保证在您的工作机器上可用。如果您必须支持早期版本的python,或者您发现自己在一个不熟悉的环境中工作,这一点尤其重要。
其次,setuptools提供了对distutils的增强。因此,它是在distutils工具集的基础上建模的,并从那里获取了它的所有结构。setuptools的文档假定读者熟悉distutils,并且只记录它如何增强基本工具集。您可以想象一下,distutils定义了方言,setuptools增强了该方言。
我对新项目的个人方法是从我将要使用distutils的假设开始。只有当项目增长到需要setuptools的特性时,我才会进行升级。setuptools是distutils的替代工具,它是对我的setup.py的一行更改。
https://stackoverflow.com/questions/25337706
复制相似问题