distribute、distutils、setuptools和distutils2之间的区别?

641 投票
5 回答
99574 浏览
提问于 2025-04-16 19:32

情况

我正在尝试把一个开源库移植到Python 3。(如果有人好奇的话,是SymPy。)

所以,我需要在为Python 3构建时自动运行2to3。为此,我需要使用distribute。因此,我需要把当前的系统移植过来,而这个系统(根据文档测试)是distutils


问题

不幸的是,我不太清楚这些模块之间有什么区别——distutilsdistributesetuptools。它们的文档简直不够清晰,似乎都是从彼此分叉出来的,目的是在大多数情况下兼容(但实际上并不是所有情况都兼容)……等等。


提问

有人能解释一下它们之间的区别吗?我应该使用哪个?最现代的解决方案是什么?(顺便说一下,我也希望能得到一些关于移植到Distribute的指导,不过那有点超出问题的范围……)

5 个回答

5

注意:这个回答已经过时了,Distribute现在也不再使用。因为Python打包管理机构成立后,做了很多工作来整理这个问题,所以这个回答不再有效。


没错,你说对了。:-o 目前推荐使用的包是Distribute,它是setuptools的一个分支,而setuptools又是distutils的扩展(distutils是最早的打包系统)。因为setuptools没有得到维护,所以就被分叉出来并改了名字,不过安装后它还是用setuptools这个包名!我觉得现在大多数Python开发者都在用Distribute,我可以肯定地说我也是。

255

我是distutils的维护者,也是distutils2和打包相关项目的贡献者。我在2011年的ConFoo大会上做过一个关于Python打包的演讲,现在我正在写这个演讲的扩展版本。虽然还没发布,但这里有一些摘录,希望能帮助大家理解相关内容。

  • Distutils是用来打包的标准工具。对于简单的需求,它工作得还不错,但功能有限,扩展起来也不太容易。

  • Setuptools是为了填补distutils功能缺失而诞生的项目,同时也在探索新的方向。在一些小圈子里,它已经成为一种事实上的标准。它使用了一些被Python核心开发者不太赞成的技术,比如猴子补丁和一些魔法。

  • Distribute是Setuptools的一个分支,最初是因为一些开发者觉得Setuptools的发展速度太慢,无法继续进化而开始的。当同一组开发者开始了distutils2的项目后,Distribute的开发速度大幅放缓。2013年8月的更新:Distribute已经合并回Setuptools,并停止了开发。

  • Distutils2是一个新的distutils库,起初是从distutils的代码库分叉出来的,借鉴了setup tools中的一些好点子(其中一些在PEP中有详细讨论),并且有一个受pip启发的基本安装程序。在Python 3.3及以上版本中,你用来导入Distutils2的实际名称是packaging,在2.4+和3.1–3.2中是distutils2。(很快会有一个回溯版本。) Distutils2没有在Python 3.3版本中发布,后来被搁置了。

更多信息:

我希望能尽快完成我的指南,里面会包含关于每个库的优缺点和过渡指南的更多信息。

899

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

Python打包用户指南值得一读。每一页都有“最后更新”日期,这样你可以检查手册的更新情况,而且内容非常全面。它托管在Python软件基金会的python.org子域名上,这也增加了它的可信度。特别是项目摘要页面在这里特别相关。

工具总结:

以下是Python打包工具的总结:

支持的工具:

已弃用/放弃的工具:

  • distutils仍然包含在Python的标准库中,但自Python 3.10起被认为是弃用的。它适用于简单的Python发行版,但功能有限。它引入了可以在你的setup.py脚本中导入的distutils Python包。

  • distributesetuptools的一个分支。它共享同一个命名空间,所以如果你安装了Distribute,import setuptools实际上会导入Distribute中分发的包。Distribute已经合并回Setuptools 0.7,所以你不需要再使用Distribute。实际上,Pypi上的版本只是一个兼容层,用于安装Setuptools。

  • distutils2是一个尝试,旨在将distutilssetuptoolsdistribute的优点结合起来,成为Python标准库中包含的标准工具。计划是将distutils2分发给旧版本的Python,并将其重命名为Python 3.3中的packaging,并将其包含在标准库中。然而,这些计划并没有按预期进行,目前distutils2是一个被放弃的项目。最新的发布是在2012年3月,其Pypi主页也终于更新以反映其已结束。

其他:

还有其他工具,如果你感兴趣,可以阅读Python打包用户指南中的项目摘要。我不会列出所有工具,以免重复该页面的内容,并保持回答与问题一致,问题只涉及distributedistutilssetuptoolsdistutils2

推荐:

如果这些对你来说都是新鲜事,不知道从哪里开始,我建议你学习setuptools,同时学习pipvirtualenv,这三者配合得很好。

如果你在研究virtualenv,你可能会对这个问题感兴趣:venvpyvenvpyenvvirtualenvvirtualenvwrapper等之间有什么区别?。(是的,我知道,这让我也很头疼。)

撰写回答