distribute、distutils、setuptools和distutils2之间的差异



形势

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

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


问题

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


问题

有人能解释一下区别吗我该用什么?最现代化的解决方案是什么?(顺便说一句,我也很感激一些关于移植到Distribute的指南,但这有点超出了问题的范围…)

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

Python打包用户指南值得一读。每一页都有一个";最后更新的";日期显示,这样你就可以查看手册的最新版本,而且它非常全面。事实上,它托管在python软件基金会的python.org的子域上,这让它更加可信。项目摘要页面在这里尤其重要。

工具概述:

以下是Python包装领域的总结:

支持的工具:

  • setuptools是为克服Distutils的限制而开发的,不包含在标准库中。它引入了一个名为easy_install的命令行实用程序。它还介绍了可以在setup.py脚本中导入的setuptoolsPython包,以及可以在代码中导入的用于查找随发行版一起安装的数据文件的pkg_resourcesPython包。其中一个问题是它对distutilsPython包进行了猴子补丁。它应该能很好地与pip配合使用。它会定期发布。

    • 官方文档|Pypi页面|GitHub repo|Python包用户指南的setuptools部分
  • scikit-build是一个改进的构建系统生成器,它在内部使用CMake来构建已编译的Python扩展。因为scikit构建不是基于distutils,所以它实际上没有任何限制。当ninja build存在时,scikit build编译大型项目的速度可以比其他版本快三倍以上。它应该能很好地与pip配合使用。

    • 官方文档|Pypi页面|GitHub repo|Python包用户指南的scikit-build部分
  • distlib是一个库,提供pip等更高级别工具使用的功能。

    • 官方文档|Pypi页面|Bitbucket repo|Python包用户指南distlib部分
  • packaging也是一个库,提供pipsetuptools等更高级别工具使用的功能

    • 官方文档|Pypi页面|GitHub repo|Python包用户指南packaging部分

废弃/废弃工具:

  • distutils仍然包含在Python的标准库中,但从Python 3.10开始就被认为是不推荐使用的。它对于简单的Python发行版很有用,但缺少功能。它介绍了可以在setup.py脚本中导入的distutilsPython包。

    • 官方文档|Python包用户指南distutils部分
  • distributesetuptools的一个分支。它共享相同的命名空间,所以如果安装了Distribute,import setuptools实际上会导入使用Distribute分发的包Distribute已合并回Setuptools 0.7,因此您不再需要使用Distribute。事实上,Pypi上的版本只是一个安装Setuptools的兼容层。

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

其他:

还有其他工具,如果您感兴趣,请阅读《Python打包用户指南》中的项目摘要。我不会把它们全部列出,以免重复那一页,并保持答案与问题相匹配,而问题只是关于distributedistutilssetuptoolsdistutils2

建议:

如果所有这些对您来说都是新的,并且您不知道从哪里开始,我建议您学习setuptools,以及pipvirtualenv,它们都能很好地配合使用。

如果你正在研究virtualenv,你可能会对这个问题感兴趣:venvpyvenvpyenvvirtualenvvirtualenvwrapper等之间有什么区别?。(是的,我知道,我和你一起呻吟。)

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

  • Distutils是用于包装的标准工具。它可以很好地满足简单的需求,但扩展起来是有限的,并非微不足道。

  • Setuptools是一个旨在填补缺失的distutils功能并探索新方向的项目。在某些子社区中,这是一个事实上的标准。它使用了猴子补丁和魔术,这是Python核心开发人员所反对的。

  • Distribute是Setuptools的一个分支,开发人员认为其开发速度太慢,不可能对其进行开发。当distutils2由同一组启动时,其开发速度大大减慢。2013年8月更新:distribute被合并回setuptools并停止使用。

  • Distutils2是一个新的distutils库,最初是distutils代码库的一个分支,有来自设置工具的好想法(其中一些在PEP中进行了深入讨论),以及受pip启发的基本安装程序 用于导入Distutils2的实际名称是Python 3.3+标准库中的packaging,或2.4+和3.1–3.2中的distutils2。(后台端口很快就会提供。)Distutils2没有发布Python 3.3,因此被搁置。

更多信息:

  • Distutils的命运-Pycon Summit+Packaging Sprint详细报告
  • Distutils和Distutils2之间的快速区别

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

注意:答案已弃用,分发现已过时。自从Python包装管理局成立以来,这个答案就不再有效了,并且已经做了很多工作来清理这个问题。


是的,你明白了。:-我认为现在首选的包是Distribute,它是setuptools的一个分支,是distutils(原始打包系统)的扩展。Setuptools没有得到维护,因此被分叉并重命名,但在安装时,它使用Setuptools的包名!我认为大多数Python开发人员现在都使用Distribute,我可以肯定地说我使用了

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

可能,而不是需要。其他策略在http://docs.python.org/dev/howto/pyporting

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

可能:)distutils支持代码(而不是文档字符串)的构建时2to3转换,其方式与分发的不同:http://docs.python.org/dev/howto/pyporting#during-安装

在2014年末更新了这个问题,幸运的是,Continuum的"conda"包管理器极大地清理了Python打包混乱。

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

conda create -n py34 python=3.4 anaconda

conda create -n py26 python=2.6 anaconda

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

之后,您可以使用特定版本的Python调用环境,其中包含:

source activate <env name>

在您必须处理不同版本的Python的情况下,此功能似乎特别有用。

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

  • Python不可知论者
  • 跨平台
  • 不需要管理员权限
  • 智能依赖关系管理(通过SAT求解器)
  • 巧妙地处理了可能需要链接的C、Fortran和系统级库

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

相关内容

  • 没有找到相关文章

最新更新