发行版,distutils,setuptools和distutils2之间的区别?


594

情况

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

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


问题

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


问题

有人可以解释差异吗?我应该用什么?什么是最现代的解决方案?(Distribute顺便说一句,我也很感谢有关向移植的一些指南,但这超出了问题的范围……)


22
多么令人困惑?我是来自Java / C ++背景的python。在这种情况下,分配非常简单。对于python,我对所有这些分发系统完全感到困惑。
拉菲·哈查杜安

75
我同意,Python打包安装在社区没有明确指导的情况下有太多选择。
萨本库(Sabuncu)2012年

6
我只想在不支持二进制发行版的
pixelbeat

@pixelbeat pip确实支持安装滚轮(所谓的二进制发行版),该链接已过期。
Flimm

Answers:


836

截至2020年3月,该问题的大多数其他答案已经过时了几年。当您遇到有关Python包装问题的建议时,请记住查看发布日期,并且不要相信过时的信息。

Python包装用户指南》值得一读。每个页面上都显示有“最后更新”日期,因此您可以检查手册的最新性,并且内容非常全面。它托管在Python Software Foundation的python.org的子域中,这本身就增加了可信度。“ 项目摘要”页面在这里尤其重要。

工具摘要:

以下是Python封装环境的摘要:

支持的工具:

弃用/废弃的工具:

  • distribute是的叉子setuptools。它共享相同的名称空间,因此,如果您安装了Distribute,则import setuptools实际上将导入使用Distribute分发的软件包。Distribute被合并回Setuptools 0.7中,因此您不再需要使用Distribute。实际上,Pypi上的版本只是安装Setuptools的兼容层。

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

其他:

如果您有兴趣,还有其他工具,请阅读《 Python打包用户指南》中的“ 项目摘要 ”。我就不一一列举,不重复该网页,并随时回答匹配的问题,这是只有约distributedistutilssetuptoolsdistutils2

建议:

如果这一切对您来说都是新手,并且您不知道从哪里开始,那么我建议您将学习setuptools,和pipvirtualenv一起很好地结合使用。

如果你正在寻找到virtualenv,你可能有兴趣在这样一个问题:是什么区别venvpyvenvpyenvvirtualenvvirtualenvwrapper,等?。(是的,我知道,我和你一起吟。)


2
@makeramen:在邮件列表中查看此主题
Flimm 2013年

6
而且看起来没有任何更好的:'Distribute' is a now deprecated fork of the 'Setuptools' project.@ PyPI分发页面。
KurzedMetal

3
@KurzedMetal,据SetupTools专家介绍,setuptools 0.7将同时包含分布和旧的setuptools还原到宇宙的顺序。因此,实际情况将大大改善!
John McDonnell 2013年

8
Python打包用户指南》将提供有关python打包状态的最新信息。Nick Coughlan在2013年PyCon上指出了这一点。
imanuelcostigan

1
@Flimm最近的编辑是在一段时间之前。Bento现在成熟了吗?
Martin Thoma

251

我是distutils维护者和distutils2 / packaging贡献者。我在ConFoo 2011上谈论了Python封装,如今,我正在编写它的扩展版本。它尚未发布,因此以下是一些有助于定义内容的摘录。

  • Distutils是用于包装的标准工具。它可以满足简单的需求,但功能有限,扩展范围也不小。

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

  • Distribute是Setuptools的一个分支,由开发人员启动,觉得它的开发速度太慢并且无法对其进行开发。当distutils2由同一组启动时,其开发速度大大减慢。2013年8月更新:分发重新合并到setuptools中并停止使用。

  • Distutils2是一个新的distutils库,它是distutils代码库的一个分支,从安装工具(其中一些已在PEP中进行了详细讨论)中汲取了好主意,并且是受pip启发的基本安装程序。 用来导入Distutils2的实际名称packaging在Python 3.3+标准库中,或者distutils2在2.4+和3.1-3.2中。(将很快提供一个反向端口。) Distutils2并未发布Python 3.3版本,因此被搁置了。

更多信息:

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


1
否。distutils2是否采用了标准化(PEP)之后的setuptools / distribute中的一些好主意(例如,我指导GSoC学生添加了开发命令和自动脚本生成功能),但这绝不会成为现实。替换:我们不需要某些部分(例如鸡蛋,VCS集成等)。OTOH,distutils2具有setuptools / distribute所没有的东西。为了简化过渡,我认为分布式开发人员可能会使用distutils2支持新的标准和工具。我还认为我记得setuptools开发人员说过他想支持新标准。
埃里克·阿劳霍

1
ez_setup在所有这方面都落在哪里?另外,distutils2的状态是否有任何更新?
詹姆斯·麦克马洪

2
@ÉricAraujo很抱歉听到延迟。我真的希望它能为3.4做好准备!我喜欢 Python,但包装始终使我无法自拔。(在其他新闻中,您的指南会如何发布?如果完成了,您可以在上面的答案中链接它吗?)
Zearin 2012年

9
@AlexisHuet如果包含下面注释的链接(可以从share按钮中获取),则这种注释会更好。
erikbwork 2013年

2
您也许应该更新答案以提及distribute最近合并回的内容setuptools。许多信息过时了的事实
加剧

5

注意:已弃用答案,现在分发已过时。自Python打包机构成立以来,该答案不再有效,并且已经做了很多工作来清理此问题。


是的,您知道了。:-o我认为目前首选的软件包是Distribute,它是setuptools的一个分支,是distutils(原始打包系统)的扩展。Setuptools并未得到维护,因此已被分叉并重命名,但是在安装时,它使用setuptools的软件包名称!我认为大多数Python开发人员现在都使用Distribute,并且可以肯定地说我确实这样做。


记录下来,我接受了这个答案,因为它现在告诉了我这种情况(而另一个答案中的图片只是没有提及的关系的扩展是“ is fork”)。在沿途的某个地方,我还了解到文档本身通常不确定要表达的内容。
VPeric 2011年

2
@VPeric,的确,文档反映了python的这一方面处于不断变化的状态。
juanchopanza 2011年

2

我意识到我已经回答了您的第二个问题,但没有解决您原始问题中的毫无疑问的假设:

我正在尝试将开放源代码库(SymPy,如果有人想知道)移植到Python3。为此,在构建Python 3时,我需要自动运行2to3。

可能不是需要。其他策略请参见http://docs.python.org/dev/howto/pyporting

为此,我需要使用分配,

可能 :) distutils以不同的分发方式支持代码(不是docstrings)的构建时2to3转换:http : //docs.python.org/dev/howto/pyporting#during-installation


谢谢,尽管我们已经决定通过编写脚本来处理转换来解决问题。是的,我知道除了使用2to3之外还有其他选择,但是SymPy是一个复杂的代码库(我上次检查时大约有200k行以上),并且使用2to3是唯一可行的策略。再次感谢,无论如何!
VPeric 2011年

2

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和系统级库

如果您身处科学计算领域,那么最后一点尤其重要。

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.