当前位置: 首页 > 知识库问答 >
问题:

setupols vs. distutils:为什么distutils仍然是一个东西?

尉迟浩思
2023-03-14

Python有一个令人困惑的工具历史,可以用来打包和描述项目:这些工具包括标准库中的distutils分发distutils2setupols(也许更多)。似乎分发distutils2被停用,取而代之的是setupols,这留下了两个相互竞争的标准。

据我所知,setuptools提供了比distutils多得多的选项(例如,声明依赖项、测试等),但是它没有包含在Python标准库中(尚未?)。

Python打包用户指南[1]现在建议:

使用setuptools定义项目并创建源发行版。

并解释道:

尽管您可以对许多项目使用纯distutils,但它不支持定义对其他项目的依赖关系,并且缺少由setuptools提供的用于正确自动填充包元数据的几个方便实用程序。在标准库之外,setuptools还提供了跨不同版本Python的更一致的功能集,并且(与distutils)不同,setuptools将被更新,以在所有支持的版本上生成即将推出的“Metadata 2.0”标准格式。

即使对于选择使用distutils的项目,当pip直接从源代码安装此类项目(而不是从预构建的控制盘文件安装)时,它实际上也会使用setuptools构建您的项目。

然而,我们正在研究各种项目的设置。py文件显示这似乎不是一个实际的标准。许多软件包仍然使用distutils,而那些支持setuptools的软件包通常将setuptoolsdistutils混合使用,例如,通过执行回退导入:

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

然后尝试编写一个可以由setuptoolsdistutils安装的安装程序。这通常包括各种容易出错的依赖项检查方法,因为distutils不支持设置函数中的依赖项。

为什么人们仍在付出额外的努力来支持distutils——标准库中没有setuptools是唯一的原因吗?distutils的优点是什么?编写设置是否有缺点。仅支持setuptools的py文件。

共有3个答案

茹照
2023-03-14

尽管setuptools无疑是更好的工具集,但我们仍在讨论和使用distutils有几个原因。

首先,distutils无处不在。如果您希望构建一个与其他人共享的模块,并且没有任何复杂的需求,那么可以保证它在您的工作机器上可用。如果您必须支持较旧版本的python,或者您发现自己在一个不熟悉的环境中工作,这一点尤其重要。

其次,setuptools提供了distutils的增强功能。因此,它是按照distutils工具集建模的,并从中获取它的所有结构。setuptools的文档假定读者熟悉distutils,并且只记录它如何增强基本工具集。您可以认为distutils定义了方言,而setuptools增强了方言。

对于新项目,我个人的方法是从假设我要使用distutils开始的。只有当项目增长到需要setupool的功能时,我才进行升级。setupols是distutils的临时替代工具,它是对我的setup.py.的单行更改

许曦
2023-03-14

setupols不在标准库中是唯一的原因

这是一个原因。以下内容直接来自NumPy设置。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.

当然,setupols分发之间的合并应该在适当的时候解决所有这些问题,但是许多包仍然需要支持Python 2.6安装。

景远航
2023-03-14

看看这个问题。它很好地解释了所有的打包方法,在某种程度上可能有助于回答您的问题:distribute、distutils、setuptools和distutils2之间的区别?

Distutils仍然是Python中打包的标准工具。它包含在标准库(Python2和Python3.0到3.3)中。它对于简单的Python发行版很有用,但缺少特性。它引入了可以在设置中导入的distutils Python包。py脚本

Setuptools是为克服Distutils的限制而开发的,不包括在标准库中。它引入了一个名为easy_install的命令行实用程序。它还引入了setuptools Python包,可以在您的设置中导入。py脚本和pkg_资源Python包,可以在代码中导入该包以查找随发行版安装的数据文件。它的一个缺陷是它修补了distutils-Python包。它应该与pip一起工作。最新版本于2013年7月发布。

因此,正如您所看到的,setuptools应该比distutils更受欢迎,我知道您的问题来自何方,但我不认为distutils会很快失去支持,简单地说,它在许多情况下用于一些流行的遗留程序。您可能知道,在遗留程序中更改这些类型的内容可能会非常痛苦,并且会带来很多问题,例如不兼容,这将导致开发人员不得不重写源代码。这就是事实,distutils是标准python库的一部分,而setuptools不是。因此,如果您正在创建python程序,在当今时代,请使用setuptools,但是请记住,如果没有distutils,setuptools将永远不存在。

 类似资料:
  • 我知道十进制数不能精确地用有限二进制数表示(解释),因此将失去一些精度,并且不能精确地。另一方面,可以准确地表示,因为它是。 可以理解的是,三次添加并不能准确地给出,所以下面的代码打印: 如果不能精确地表示,那么添加5次它怎么能精确地给出可以精确地表示呢?

  • 问题内容: 我知道十进制数不能用有限的二进制数精确地表示(解释),因此会失去一些精度,并且不会精确地表示。另一方面,因为是,所以可以精确表示。 话虽如此,将 三遍 相加并不完全是可以理解的,因此,以下代码将输出: 但是, 五次 相加会得到确切的结果呢?以下代码显示: 如果不能精确表示,将其相加5次给出的精确表示又如何呢? 问题答案: 舍入误差不是随机的,并且它的实现方式会尝试使误差最小化。这意味着

  • 问题内容: 我注意到这个构造函数非常痛苦(即使在Stack Overflow上也是如此)。即使文档明确指出,人们仍会使用它: 此构造函数的结果可能无法预测 http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal(double) 我什至看到JSR-13得到批准,并提出了以下建议: 可能不推荐使用的现有规范:

  • 问题内容: 我注意到人们建议不要混合使用Swing和AWT ,但是我们看到了很多: 因此,为什么许多包括Java的人(因为我在这里从他们的教程中得到了答案)仍然使用AWT导入,尽管我看到它主要用于s。 你如何添加 本地 的Swing S /图书馆像的东西,,冲床/ slections等? 还是我会用?(尽管与Java Bean有关) 现在已经让我困惑了一段时间,我的大多数应用程序都具有Swing和

  • 设置: 具有一个片段的活动,该片段通过单击按钮进行实例化。在fragment的构造函数中,使用了Bundle。在Bundle和ArrayList中 问题:分离片段时,字符串(姓氏)会按预期销毁,但数组列表会持续存在。因此,在调用片段的新实例时,会出现前一个ArrayList条目。回调不是问题所在。该行为也会在没有回调的情况下出现。 我已经检查了变量(和)和在点片段构造函数(),片段在方法()和片段

  • 在默认情况下,我希望angular发出请求。不是JSON。 角度1.4.5 如何将整个应用程序配置为使用x-www-form-urlencoded而不使用自行车作为拦截器等。