distutils, setuptools和distutils2?

这种情况

我正在尝试将一个开源库移植到Python 3。(SymPy,如果有人想知道。)

因此,在为Python 3构建时,我需要自动运行2to3。为此,我需要使用distribute。因此,我需要移植当前系统,这(根据doctest)是distutils

< br >

这个问题

不幸的是,我不确定这些模块之间的区别- distutilsdistributesetuptools。文档是粗略的,因为它们似乎都是彼此的分支,旨在在大多数情况下兼容(但实际上,不是所有情况)……等等。

< br >

这个问题

我应该用什么?最现代的解决方案是什么?(顺便说一句,我也希望有一些关于移植到Distribute的指南,但这有点超出了问题的范围…)

95003 次浏览

注意:回答已弃用,分发现已废弃。这个答案不再有效,因为Python打包权威机构已经成立,并做了大量工作来清理这个问题。


是的,你说对了。我认为现在首选的包是分发,这是setuptools的一个分支,它是distutils(原始打包系统)的扩展。Setuptools没有被维护,所以它被分叉和重命名,但是当安装时它使用Setuptools的包名!我认为大多数Python开发人员现在都使用分发,我可以肯定地说我是这样做的。

我是distutills维护者和distutil2 /打包贡献者。我在ConFoo 2011上做了一个关于Python打包的演讲,这些天我正在写它的扩展版本。这本书还没有出版,所以这里有一些摘录,应该有助于定义一些东西。

  • Distutils是用于包装的标准工具。它可以很好地满足简单的需求,但是有局限性,扩展起来也很重要。

  • Setuptools是一个出于填补distutils功能缺失和探索新方向的愿望而诞生的项目。在一些子社区,这是一个事实上的标准。它使用了Python核心开发人员不喜欢的猴子补丁和魔法。

  • strong>是Setuptools的一个分支,它是由开发人员开始的,他们觉得它的开发速度太慢,不可能发展它。当同一组开始使用distutil2时,它的发育速度大大减慢。2013年8月更新:分发被合并回setuptools并停止使用。

  • Distutils2是一个新的distutils库,作为distutils代码库的一个分支开始,从设置工具中获得了很好的想法(其中一些在pep中已经详细讨论过),以及一个受pip启发的基本安装程序。用于导入Distutils2的实际名称在Python 3.3+标准库中是packaging,在2.4+和3.1-3.2中是distutils2。 Distutils2没有出现在Python 3.3版本中,它被搁置了。

更多信息:

我希望尽快完成我的指南,它将包含关于每个库的优点和缺点的更多信息以及过渡指南。

我意识到我已经回答了你的第二个问题,而没有解决你最初问题中毫无疑问的假设:

我正在尝试将一个开源库(SymPy,如果有人想知道的话)移植到Python 3。来 这样做,我需要运行2to3自动构建Python 3。

你是五月,不是需要。其他策略在http://docs.python.org/dev/howto/pyporting中描述

要做到这一点,我需要使用分配,

您的五月:) distutils支持代码(而不是文档字符串)的构建时2to3转换,以不同于分发的方式:http://docs.python.org/dev/howto/pyporting#during-installation

截至2022年5月,这个问题的大多数其他答案都已经过时好几年了。当你遇到关于Python打包问题的建议时,记得查看发布日期,不要相信过时的信息。

Python打包用户指南值得一读。每一页都有一个“上次更新”;日期显示,所以你可以检查手册的最近,它是相当全面的。事实上,它托管在Python软件基金会的python.org的子域上,这增加了它的可信度。项目总结页面在这里尤其相关。

工具概述:

以下是对Python打包环境的总结:

支持工具:

  • EYZ7是为了克服Distutils的局限性而开发的,并且没有包含在标准库中。它引入了一个名为easy_install的命令行实用程序。它还介绍了setuptools Python包(可以导入到setup.py脚本中)和pkg_resources Python包(可以导入到代码中),以定位与发行版一起安装的数据文件。它的一个缺点是它给distutils Python包打了猴子补丁。它应该与pip很好地工作。# EYZ8

  • scikit-build是一个改进的构建系统生成器,它在内部使用CMake来构建已编译的Python扩展。因为scikit-build不是基于distutils的,所以它实际上没有任何限制。当ninja-build存在时,scikit-build编译大型项目的速度比其他选项快三倍以上。它应该可以很好地与pip一起工作。

  • distlib是一个库,它提供了由pip等高级工具使用的功能。

  • packaging也是一个库,提供了由pipsetuptools等高级工具使用的功能

弃用/废弃的工具:

  • distutils仍然包含在Python的标准库中,但从Python 3.10开始被认为已弃用。它对简单的Python发行版很有用,但缺乏特性。它引入了distutils Python包,可以导入到setup.py脚本中。

  • distributesetuptools的分支。它共享相同的名称空间,因此如果安装了Distribute, import setuptools将实际导入随Distribute分发的包。分布被合并回Setuptools 0.7,所以你不需要再使用分发。事实上,Pypi上的版本只是一个安装Setuptools的兼容层。

  • distutils2尝试了distutilssetuptoolsdistribute的优点,并成为Python标准库中包含的标准工具。这个想法是,distutils2将用于旧的Python版本,而distutils2将被重命名为packaging,用于Python 3.3,并将其包含在其标准库中。然而,这些计划并没有按计划进行,目前,distutils2是一个废弃的项目。它的最新版本是在2012年3月发布的,它的Pypi主页终于更新了,以反映它的死亡。

其他:

还有其他工具,如果你感兴趣,请阅读Python打包用户指南中的项目总结。为了不重复那一页,我不会把它们都列出来,并让答案与问题相匹配,这只是关于distributedistutilssetuptoolsdistutils2

推荐:

如果所有这些对您来说都是新的,并且您不知道从哪里开始,那么我建议你学习setuptoolspipvirtualenv都可以很好地配合使用。

如果你正在研究virtualenv,你可能会对这个问题感兴趣:#EYZ1, #EYZ2, #EYZ3, #EYZ0, virtualenvwrapper等之间有什么区别?。(是的,我知道,我和你一起抱怨。)

在2014年底更新了这个问题,幸运的是,Python打包的混乱已经被Continuum的“conda”包管理器大大清理了。

特别是,conda可以快速地创建conda“环境”。您可以使用不同版本的Python配置您的环境。例如:

# EYZ0

# EYZ0

将使用不同版本的Python创建两个(“py34”或“py26”)Python环境。

之后,你可以使用特定版本的Python调用环境:

# EYZ0

当您需要处理不同版本的Python时,这个特性似乎特别有用。

此外,conda还具有以下特点:

  • Python不可知论者
  • 跨平台的
  • 不需要管理权限
  • 智能依赖管理(通过SAT求解器)
  • 很好地处理C, Fortran和系统级库,你可能不得不链接

如果你在科学计算领域,最后一点尤其重要。