我正在尝试将开源库移植到Python 3.(SymPy,如果有人想知道的话。)
因此,我需要在构建Python 3时自动运行2to3
。为此,我需要使用distribute
。因此,我需要移植当前系统(根据doctest)distutils
。
不幸的是,我不确定这些模块之间的区别是什么 - distutils
,distribute
,setuptools
。文档是最好的粗略,因为它们似乎都是彼此的分支,旨在在大多数情况下兼容(但实际上,不是全部)......等等。
有人可以解释这些差异吗?我应该使用什么?什么是最现代的解决方案? (顺便说一句,我也很欣赏一些关于移植到Distribute
的指南,但这超出了问题的范围......)
答案 0 :(得分:814)
截至2017年1月,此问题的所有其他答案至少已过期两年。当您遇到有关Python包装问题的建议时,请记得查看发布日期,并且不要相信过时的信息。
Python Packaging User Guide值得一读。每个页面都显示“上次审核”日期,因此您可以查看手册的新近度,并且它非常全面。事实上,它托管在Python软件基金会的python.org的子域上,只是增加了它的可信度。 Project Summaries页面在这里特别相关。
以下是2017年1月Python包装格局的摘要:
Distutils 仍然是Python中打包的标准工具。它包含在标准库(Python 2和Python 3.0到3.6)中。它对于简单的Python发行版很有用,但缺少功能。它介绍了可以在distutils
脚本中导入的setup.py
Python包。
Setuptools 是为了克服Distutils的限制而开发的,并未包含在标准库中。它引入了一个名为easy_install
的命令行实用程序。它还引入了可以在setuptools
脚本中导入的setup.py
Python包,以及可以在代码中导入的pkg_resources
Python包,用于查找随分发安装的数据文件。其中一个问题是它会修补distutils
Python包。它应该与pip
一起使用。 It sees regular releases.
scikit-build 是一个改进的构建系统生成器,它在内部使用CMake构建编译的Python扩展。因为scikit-build不是基于distutils,所以它实际上没有任何限制。当存在ninja-build时,scikit-build可以编译大型项目的速度比替代方案快三倍。它应该与pip
一起使用。 It sees regular releases.
分发是Setuptools的一个分支。它共享相同的命名空间,因此如果安装了Distribute,import setuptools
实际上会导入随Distribute一起分发的包。 Distribute已合并回Setuptools 0.7 ,因此您无需再使用Distribute。事实上,Pypi上的版本只是一个安装Setuptools的兼容层。
Distutils2 试图充分利用Distutils,Setuptools和Distribute,并成为Python标准库中包含的标准工具。我们的想法是,Distutils2将分发给旧的Python版本,而Distutils2将被重命名为{3.3},用于Python 3.3,它将包含在其标准库中。但是,这些计划没有按预期进行,目前, Distutils2是一个废弃的项目 。最新版本于2012年3月发布,其Pypi主页最终更新以反映其死亡。
Distlib 是一个旨在实现以前工具功能的子集的工具,但只能在接受的PEP中定义得非常明确。它是PyPA(Python Package Authority)的工具之一,有希望有一天它最终会被包含在Python标准库中。 它仍被视为alpha软件,因此最终用户要小心。
有a couple more tools(例如:Bento),但我不会提及它们,因为它们对于这个答案帖子来说太过模糊或不适合或早期或未开发,否则它们不是直接替代品
总而言之,在所有这些选项中,我建议使用Setuptools ,除非您的要求非常基本且只需要Distutils。 Setuptools与Virtualenv和Pip非常合作,我强烈推荐这些工具。 Virtualenv和Pip都可以被认为是官方的,因为它们是PyPA的一部分,Python 3现在发布ensurepip
(它可以帮助你在某些系统上安装packaging
。)
如果你正在研究Virtualenv,你可能会对这个问题感兴趣:What is the difference between venv
, pyvenv
, pyenv
, virtualenv
, virtualenvwrapper
, etc?。 (是的,我知道,我和你一起呻吟。)
作为旁注,我建议使用Virtualenv 1.10或更高版本,因为它是第一个识别Python 2和3的Setuptools / Distribute合并的版本。
答案 1 :(得分:251)
我是distutils维护者和distutils2 /包装贡献者。我在ConFoo 2011上谈到了Python包装,现在我正在编写它的扩展版本。它还没有发布,所以这里有摘录应该有助于定义事物。
Distutils 是用于打包的标准工具。它对于简单的需求非常有效,但是有限且不易于扩展。
Setuptools 是一个渴望填补缺失的distutils功能并探索新方向的项目。在某些子社区中,它是事实上的标准。它使用了猴子修补和魔术,这是Python核心开发人员所不喜欢的。
分发是Setuptools的一个分支,由开发人员启动,感觉它的开发速度太慢而且无法进化。当distutils2由同一组开始时,它的发展相当缓慢。 2013年8月更新:分发合并回setuptools并停止使用。
Distutils2 是一个新的distutils库,作为distutils代码库的一个分支启动,从设置工具中获取了很好的想法(其中一些已在PEP中进行了详细讨论),以及一个基本的安装程序受pip的启发。 用于导入Distutils2的实际名称在Python 3.3+标准库中为 Distutils2没有发布Python 3.3,它被搁置了。packaging
,在2.4+和3.1-3.2中为distutils2
。 (很快就会有一个backport。)
更多信息:
我希望尽快完成我的指南,它将包含有关每个图书馆的优缺点和过渡指南的更多信息。
答案 2 :(得分:6)
注意:不推荐使用答案,现在已经过时了。
是的,你明白了。 :-o我认为此时首选包是Distribute,它是setuptools的一个分支,它是distutils(原始包装系统)的扩展。 Setuptools没有被维护,因此被分叉并重命名,但是在安装时它使用了setuptools的包名!我认为大多数Python开发人员现在都使用Distribute,我可以肯定地说我做了。答案 3 :(得分:5)
很多人抱怨这个问题缺乏明确的社区指导。
目前,这似乎是关于工具建议的最佳权威来源: https://packaging.python.org/en/latest/current.html#tool-recommendations
答案 4 :(得分:3)
我意识到我已经回答了你的第二个问题而没有解决你原来问题中毫无疑问的假设:
我正在尝试将一个开源库(SymPy,如果有人想知道)移植到Python 3。 这样做,我需要在构建Python 3时自动运行2to3。
你可能,而不是需要。其他策略在http://docs.python.org/dev/howto/pyporting
中描述要做到这一点,我需要使用distribute,
你可能 :) distutils支持代码(而不是文档字符串)的构建时2to3转换,以不同的方式分发:http://docs.python.org/dev/howto/pyporting#during-installation
答案 5 :(得分:3)
2014年末更新了这个问题,幸运的是,Continuum" conda"" environments"包经理。
特别是,conda可以快速创建conda" {{3}}"。您可以使用不同版本的Python配置环境。例如:
conda create -n py34 python=3.4 anaconda
conda create -n py26 python=2.6 anaconda
将使用不同版本的Python创建两个(" py34"或#34; py26")Python环境。
之后,您可以使用特定版本的Python调用环境:
source activate <env name>
在您必须处理不同版本的Python的情况下,此功能似乎特别有用。
此外,conda具有以下特点:
如果你在科学计算领域,最后一点尤其重要。
答案 6 :(得分:1)
这个问题似乎仍在不断变化。截至2013年3月31日,“Python包装用户指南”Quick Recommendations定义了“目前推荐的工具集”。它曾经链接到“Python包装的未来”,现在,1/20/201,5年以后,一个死链接。 :)