setuptools与distutils:为什么distutils仍然是一回事?


142

Python就可以用于包装和说明项目工具混淆历史:这些包括distutils标准库中,distributedistutils2,和setuptools(也许更多)。看来,distributedistutils2投票赞成的停产setuptools,这让两个相互竞争的标准。

据我所知,setuptools提供了更多的选择(例如,声明依赖项,测试等)distutils,但是它没有包含在Python标准库中(还可以吗?)。

现在推荐《Python打包用户指南》 [ 1 ]:

使用setuptools定义的项目和创建源代码分发。

并说明:

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

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

但是,查看各种项目的setup.py文件可以发现,这似乎并不是一个实际的标准。许多软件包仍在使用,distutils而那些支持的软件包则setuptools经常setuptoolsdistutils回退导入结合使用:

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

然后尝试找到一种写可以由setuptools和安装的安装程序的方法distutils。由于distutils不支持设置功能中的依赖关系,因此通常包括各种容易出错的依赖关系检查方式。

人们为什么还要付出额外的努力来支持distutils- setuptools标准库中没有的事实是唯一的原因吗?distutils编写仅支持setup.py文件的优点和缺点是什么setuptools


4
distutils已被合并回setuptools,但是有一些旧应用程序被编写为可以使用,distutils并且迁移到正确的标准涉及成本。
metatoaster

3
“看来,distribut和distutils2已停止使用setuptools而已”,正确,distribution现在只是setuptools的包装,而distutils2已死。
凯-SE是邪恶的

1
setuptools是一种增强的替代方法,distutils但请注意,“ 即使脚本本身仅导入,推荐的pip安装程序也可以使用运行所有setup.py脚本setuptoolsdistutils ”(
user2314737

Answers:


77

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

Distutils仍然是使用Python打包的标准工具。它包含在标准库中(Python 2和Python 3.0至3.3)。它对简单的Python发行版很有用,但缺少功能。它介绍了可以在setup.py脚本中导入的distutils Python软件包。

Setuptools是为克服Distutils的限制而开发的,未包含在标准库中。它引入了一个名为easy_install的命令行实用程序。它还介绍了可以在setup.py脚本中导入的setuptools Python软件包,以及可以在您的代码中导入以查找随发行版一起安装的数据文件的pkg_resources Python软件包。它的陷阱之一是它对distutils Python软件包进行了猴子修补。它应该与pip配合良好。最新版本于2013年7月发布。

因此,正如您所见,setuptools应该比distutils更受青睐,而且我知道您的问题是从哪里来的,但是我看不到distutils会很快失去支持,因为简单地说,它在许多情况下都与一些流行的旧版程序一起使用。 。正如您可能知道的那样,在旧版程序中更改此类操作可能会很痛苦,并且会遇到很多问题,例如不兼容,这将导致开发人员不得不重写源代码。因此,distutils是标准python库的一部分,而setuptools不是。因此,如果您现在正在创建python程序,请使用setuptools,但是请记住,如果没有distutils,setuptools将永远不存在。


3
“ Distutils仍然是用Python打包的标准工具。” 与《 Python打包用户指南》相矛盾。
2014年

1
我不这么认为,它是否明确表示setuptools是标准。另请注意,该短语是从我提供的网站引用的,因此,这些不是我的话。但是,这是我和其他许多人都同意的观点。

我授予您赏金,因为社区似乎同意您的意见。不幸的是,这个问题没有得到我希望的关注。
2014年

easy_install是我拒绝setuptools的主要原因-在使用它的程序包中,这对我来说是个很大的问题源(更容易重新打包)。其他功能还可以。
Stuart Gathman

14

事实是setuptools不在标准库中的唯一原因

那是原因之一。以下直接来自NumPysetup.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.

当然,一个合并之间setuptoolsdistribute应该解决这一切在适当的时间,但许多软件包仍然需要支持的Python 2.6的安装。


1
distribute是的分支,setuptools现在又合并了。
R4444 '19

10

尽管setuptools无疑是更好的工具集,但仍有许多原因值得我们讨论和使用distutils。

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

其次,setuptools提供了对distutils的增强。因此,它是根据distutils工具集建模的,并从那里开始获取其所有结构。setuptools的文档假定读者熟悉distutils,并且仅记录其如何增强基本工具集。您可以想到distutils定义了方言,而setuptools增强了该方言。

我对新项目的个人方法是从我将要使用distutils的假设开始的。只有随着项目的增长需要设置工具的功能,我才进行升级。setuptools是distutils的替代品,它是对setup.py的单行更改。


感谢您的回答。我认为可用性参数并不是那么重要,因为setuptools安装可以被引导。我发现如果distutils提供足够的功能-使用它确实有意义。但是在我看来,将distutils和setuptools混合使用并不是实现目标的一种非常干净的方法。虽然,@ larsmans在他的回答中显示了setuptools的一些困难,这些困难迫使distutils用于某些任务。
cel 2014年

9

基本上,这是由于职责划分。

setuptools不是Python标准库的一部分,因为它是由第三方而不是Python核心团队维护的。除其他外,这意味着:

  • 它不包含在核心测试套件中,也不依赖于核心功能
  • 本身并没有为附加模块设置核心标准(它们的位置,导入方式,C扩展的二进制接口等)。
  • 它独立于Python版本进行更新和发布

有效地,核心团队缩小了distutils的范围,自己保留了“核心标准”和“最小必要编译”部分,同时将超出此范围的所有东西(扩展的编译器/软件包格式/任何支持)留给了第三方。为了向后兼容,以前覆盖那些“扩展部分”的代码已过时

来自分发Python模块-Python 2.7.12文档

尽管distutils逐步淘汰了直接使用,但它仍为当前的包装和分发基础架构奠定了基础,它不仅仍然是标准库的一部分,而且其名称还可以通过其他方式(例如邮件列表的名称)保留下来。用于协调Python打包标准的开发)。

对于其他操作系统软件包同样可能提供setuptoolspip单独-由于上述原因

  • 并且因为在系统上已经存在另一个软件包管理器时,它们不是必需的-甚至对可维护性有害。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.