分发,distutils,setuptools和distutils2之间的区别?
情况
我试图将一个开源库移植到Python 3.( SymPy ,如果有人想知道)。
所以,我需要为Python 3构build时自动运行2to3
。为此,我需要使用distribute
。 因此,我需要移植目前的系统,这(根据doctest)是distutils
。
问题
不幸的是,我不确定这些模块之间有什么区别 – distutils
, distribute
, setuptools
。 文档最好是粗略的,因为它们似乎都是彼此分叉的,意图在大多数情况下(但实际上并非全部)兼容,等等。
问题
有人可以解释这些差异吗? 我该用什么? 什么是最现代化的解决scheme? (另外,我还要感谢一些关于移植到Distribute
指南,但这超出了问题的范围。)
截至2017年1月,对这个问题的所有其他答案至less有两年过期。 当您遇到有关Python包装问题的build议时,请记住查看发布date,不要信任过时的信息。
Python打包用户指南值得一读。 每个页面都显示“上次检查”date,因此您可以检查手册的新近性,这是相当全面的。 它被托pipe在Python Software Foundation的python.org的一个子域名上的事实只是增加了它的可信度。 项目摘要页面在这里特别重要。
工具总结:
以下是2017年1月Python包装的总结:
支持的工具:
-
Distutils仍然是Python打包的标准工具。 它包含在标准库(Python 2和Python 3.0到3.6)中。 这对于简单的Python发行版很有用,但缺乏特性。 它介绍了可以在
setup.py
脚本中导入的distutils
Python包。- 官方文档 | Python软件包用户指南的
distutils
部分
- 官方文档 | Python软件包用户指南的
-
Setuptools是为了克服Distutils的局限性而开发的,不包含在标准库中。 它引入了一个名为
easy_install
的命令行工具。 它还介绍了可以在setup.py
脚本中导入的pkg_resources
Python包,以及可以在代码中导入的pkg_resources
Python包,以定位随分发安装的数据文件。 其中一个问题是,它会修复distutils
Python包。 它应该与pip
很好地工作。 它看到正式版本。- 官方文档 | Pypi页面 | GitHub repo | Python包用户指南的
setuptools
部分
- 官方文档 | Pypi页面 | GitHub repo | Python包用户指南的
弃用/放弃的工具:
-
分发是Setuptools的一个分支。 它共享相同的命名空间,所以如果你安装了Distribute,
import setuptools
实际上会导入使用Distribute分发的包。 分发被合并回到Setuptools 0.7 ,所以你不需要再使用分配。 事实上,Pypi上的版本只是一个安装Setuptools的兼容层。 -
Distutils2是尝试采用Distutils,Setuptools和Distribute中最好的一种,并成为Python标准库中包含的标准工具。 这个想法是,Distutils2将分发给旧的Python版本,Distutils2将被重新命名为Python 3.3的
packaging
,这将包括在它的标准库。 但是,这些计划并没有按预期进行,目前Distutils2是一个被遗弃的项目 。 最新版本是在2012年3月,其Pypi主页终于更新,以反映其死亡。
Alpha软件:
-
Distlib是一个工具,旨在实现以前的工具function的一个子集,但只有在接受的PEP中定义得非常好的function。 它是PyPA(Python Package Authority)的一个工具,有望在某一天最终被包含在Python标准库中。 它仍然被认为是alpha软件,所以最终用户要小心。
- 官方文档 | Pypi页面 | Bitbucket回购 | Python包用户指南的
distlib
部分
- 官方文档 | Pypi页面 | Bitbucket回购 | Python包用户指南的
-
还有更多的工具 (例如:Bento),但是我不会提到它们,因为它们太晦涩难懂了,或者很早或者还没开发出来,或者它们不是直接的select。
build议:
所以最后,在所有这些选项中, 我会推荐Setuptools ,除非你的要求是非常基本的,你只需要Distutils。 Setuptools与Virtualenv和Pip,我强烈推荐的工具很好地工作。 Virtualenv和Pip都可以被认为是官方的,因为它们是PyPA的一部分,Python 3现在提供了ensurepip
(可以帮助你在某些系统上安装pip
)。
如果你正在寻找Virtualenv,你可能会对这个问题感兴趣: venv
, pyvenv
, pyenv
, virtualenv
, virtualenvwrapper
等有什么区别? 。 (是的,我知道,我呻吟着。)
作为一个侧面说明,我build议使用Virtualenv 1.10或更高版本,因为它是Python 2和3的第一个识别Setuptools / Distribute合并的版本。
我是distutils维护者和distutils2 /包装贡献者。 我在ConFoo 2011上做了一个关于Python打包的讨论,现在我正在写一个扩展的版本。 目前还没有发布,所以这里有一些摘录可以帮助你定义。
-
Distutils是用于包装的标准工具。 它对于简单的需求来说工作得很好,但是有限而且不是微不足道的。
-
Setuptools是一个从渴望填补缺失distutilsfunction和探索新的方向出生的项目。 在一些分社区,这是一个事实上的标准。 它使用Python核心开发人员所诟病的猴子补丁和魔法。
-
分发是Setuptools的一个分支,开发人员感觉它的开发速度太慢,而且无法进化。 当同一组发动distutils2时,其发展速度大大减慢。 2013年8月更新:分发合并到setuptools并终止。
-
Distutils2是一个新的distutils库,作为distutils代码库的一个分支开始,从安装工具(其中一些在PEP中进行了深入的讨论)中获得了很好的想法,还有一个受pip启发的基本安装程序。
用于导入Distutils2的实际名称是packaging
在Python 3.3+标准库中,或者distutils2
packaging
在2.4+和3.1-3.2中。(一个backport即将可用。)Distutils2并没有使Python 3.3的版本,它被搁置。
更多信息:
- Distutils的命运–Pycon Summit + Packaging Sprint详细报道
- Distutils和Distutils之间的快速差异2
我希望尽快完成我的指导,它将包含更多关于每个图书馆的强弱点和过渡指南的信息。
注意:不赞成反对,现在分发已经过时。
是的,你知道了。 :-o我想这个时候首选的包是Distribute ,它是setuptools的一个分支,它是distutils(原始包装系统)的扩展。 Setuptools没有被维护,所以被分叉和重命名,但是当安装它使用setuptools的包名! 我认为大多数Python开发人员现在都使用Distribute,我可以肯定地说我是这么做的。
在2014年底更新了这个问题,幸运的是Python的包装混乱已经被Continuum的“ conda ”包pipe理器大大地清理了。
conda特别快速地创造conda“ 环境 ”。 您可以使用不同版本的Python来configuration您的环境。 例如:
conda create -n py34 python=3.4 anaconda
conda create -n py26 python=2.6 anaconda
将使用不同版本的Python创build两个(“py34”或“py26”)Python环境。
之后,您可以使用以下特定版本的Python来调用环境:
source activate <env name>
这个特性对于你不得不处理不同版本的Python的情况似乎特别有用。
而且,conda具有以下特点:
- Python不可知论者
- 跨平台
- 不需要pipe理员权限
- 智能依赖pipe理(通过SAT求解器)
- 很好地处理您可能需要链接的C,Fortran和系统级库
如果你在科学计算领域,最后一点尤为重要。
很多人在这里抱怨在这个问题上缺乏明确的社区指导。
目前,这看起来像工具build议最好的权威来源: https : //packaging.python.org/en/latest/current.html#tool-recommendations
我意识到我已经回答了你的第二个问题,而没有解决你原来的问题中的无可置疑的假设:
我试图将一个开源库(SymPy,如果有人想知道的话)移植到Python 3中。为此,我需要在构buildPython 3时自动运行2to3。
你可以 , 不需要 。 其他策略在http://docs.python.org/dev/howto/pyporting中描述;
要做到这一点,我需要使用分发,
你可以 🙂 distutils支持构build时间2to3转换的代码(不docstrings),以不同的方式分发的: http : //docs.python.org/dev/howto/pyporting#during-installation
这个问题似乎还在不断变化。 截至2013年10月31日,“Python打包用户指南” 快速build议定义了“目前推荐的工具集”。 它还链接到“ Python包装的未来 ”