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

| 情况 我正在尝试将开放源代码库移植到Python3。(SymPy,如果有人想知道的话。) 因此,在为Python 3构建时,我需要自动运行ѭ0。为此,我需要使用
distribute
。因此,我需要移植当前的系统(根据doctest)为
distutils
。 问题 不幸的是,我不确定这两个模块(
distutils
distribute
setuptools
)有什么区别。该文档最好是粗略的,因为它们似乎是彼此的一个分支,旨在在大多数情况下兼容(但实际上不是全部)……等等。 问题 有人可以解释差异吗?我应该用什么?什么是最现代的解决方案? (顺便说一句,我也很感谢您提供一些移植到
Distribute
的指南,但这超出了问题的范围……)     
已邀请:
截至2017年1月,此问题的所有其他答案都至少已过期两年。当您遇到有关Python封装问题的建议时,请记住查看发布日期,并且不要相信过时的信息。 《 Python包装用户指南》值得一读。每个页面上都显示一个“上次审核”日期,因此您可以检查手册的最新性,而且内容很全面。它托管在Python Software Foundation的python.org的子域中,这增加了它的可信度。 “项目摘要”页面在这里尤其重要。 工具摘要: 以下是2017年1月Python封装格局的摘要: 支持的工具: Distutils仍然是使用Python打包的标准工具。它包含在标准库中(Python 2和Python 3.0至3.6)。它对于简单的Python发行版很有用,但缺少功能。它介绍了可以在
setup.py
脚本中导入的
distutils
Python软件包。 官方文档| Python软件包用户指南的“ 2”部分 Setuptools是为克服Distutils的限制而开发的,它不包含在标准库中。它引入了一个名为“ 10”的命令行实用程序。它还介绍了可以在
setup.py
脚本中导入的ѭ5Python软件包,以及可以在代码中导入以查找随发行版一起安装的数据文件的files13ѭPython软件包。它的陷阱之一是它对
distutils
Python程序包进行了猴子修补。
pip
应该可以很好地工作。它可以看到常规版本。 官方文档| Pypi页面| GitHub存储库| Python软件包用户指南的第5部分 scikit-build是一个改进的构建系统生成器,它内部使用CMake来构建编译的Python扩展。由于scikit-build不是基于distutils的,因此它实际上没有任何限制。如果存在ninja-build,则scikit-build可以比其他方法快三倍地编译大型项目。
pip
应该可以很好地工作。它可以看到常规版本。 官方文档| Pypi页面| GitHub回购 弃用/废弃的工具: Distribute是Setuptools的一个分支。它共享相同的名称空间,因此如果您安装了Distribute,则
import setuptools
实际上会导入随Distribute分发的软件包。 Distribute被合并回Setuptools 0.7,因此您不再需要使用Distribute。实际上,Pypi上的版本只是安装Setuptools的兼容层。 Distutils2试图充分利用Distutils,Setuptools和Distribute,并成为Python标准库中包含的标准工具。想法是将Distutils2分发给旧的Python版本,并且将Distutils2重命名为3.319ѭ(对于Python 3.3),并将其包含在其标准库中。这些计划没有按预期进行,但是,当前,Distutils2是一个废弃的项目。最新版本于2012年3月发布,其Pypi主页最终已更新以反映其死亡。 Alpha软件: Distlib是旨在实现以前工具功能的子集的工具,但仅实现公认的PEP中定义非常明确的功能。它是PyPA(Python打包机构)的工具之一,希望有朝一日最终将其包含在Python标准库中。它仍然被认为是alpha软件,因此最终用户要当心。 官方文档| Pypi页面| Bitbucket回购| Python软件包用户指南的第20部分 还有更多工具(例如Bento),但我不会提及它们,因为它们对于本答案过分模糊,利基,太早或尚未开发,否则它们不是直接的替代品。 建议: 因此,总而言之,在所有这些选项中,我建议使用Setuptools,除非您的要求非常基本并且只需要Distutils。 Setuptools与Virtualenv和Pip(我强烈推荐的工具)配合使用非常好。 Virtualenv和Pip都可以被认为是官方的,因为它们是PyPA的一部分,并且Python 3现在已经发行
ensurepip
(这可以帮助您在某些系统上安装
pip
)。 如果您正在研究Virtualenv,您可能会对以下问题感兴趣:
venv
pyvenv
pyenv
virtualenv
virtualenvwrapper
等之间有什么区别? (是的,我知道,我和你一起吟。) 附带说明一下,我建议使用Virtualenv 1.10或更高版本,因为它是第一个可识别适用于Python 2和3的Setuptools / Distribute合并的版本。     
我是distutils的维护者和distutils2 / packaging的撰稿人。我在ConFoo 2011上讨论了Python封装,现在我正在编写它的扩展版本。它尚未发布,因此这里有一些摘录可以帮助定义事物。 Distutils是用于包装的标准工具。它可以满足简单的需求,但功能有限,扩展范围也不小。 Setuptools是一个旨在填补缺少的distutils功能并探索新方向的项目。在某些子社区中,这是事实上的标准。它使用Python核心开发人员不喜欢的猴子补丁和魔术。 Distribute是Setuptools的一个分支,由开发人员启动,认为它的开发速度太慢并且无法对其进行开发。当distutils2由同一组启动时,其开发速度大大减慢。 2013年8月更新:分发被合并回setuptools中并停止使用。 Distutils2是一个新的distutils库,它是distutils代码库的一个分支,从安装工具(其中一些已在PEP中进行了详细讨论)中汲取了好主意,并且是受pip启发的基本安装程序。在Python 3.3+标准库中,用于导入Distutils2的实际名称是
packaging
,在2.4+和3.1-3.2中是
distutils2
。 (将很快提供一个反向端口。)Distutils2并未发布Python 3.3版本,因此被搁置了。 更多信息: Distutils的命运– Pycon峰会+ Packaging Sprint详细报告 Distutils和Distutils2之间的快速区别 我希望很快完成我的指南,它将包含有关每个图书馆的优缺点的更多信息以及过渡指南。     
        注意:已弃用答案,现在分发已过时。自Python打包机构成立以来,此答案已不再有效,并且已经做了很多工作来清理此问题。 是的,您知道了。 :-o我认为目前首选的软件包是Distribute,它是setuptools的一个分支,它是distutils(原始包装系统)的扩展。 Setuptools并未得到维护,因此已被分叉并重命名,但是在安装时,它使用setuptools的软件包名称!我认为大多数Python开发人员现在都在使用Distribute,并且可以肯定地说。     
        我意识到我已经回答了您的第二个问题,但没有解决您原始问题中的毫无疑问的假设:   我正在尝试将开放源代码库(SymPy,如果有人想知道的话)移植到Python 3。   为此,在为Python 3构建时我需要自动运行2to3。 您可能不需要。其他策略在http://docs.python.org/dev/howto/pyporting中进行了描述   为此,我需要使用分配, 您可能:) distutils以不同的分发方式支持代码(不是docstrings)的构建时2to3转换,分发方式如下:http://docs.python.org/dev/howto/pyporting#during-installation     
        在2014年末更新此问题,幸运的是Continuum的\“ conda \”软件包管理器已大大消除了Python的混乱包装。 特别地,conda迅速启用了conda \“ environments \”的创建。您可以使用不同版本的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和系统级库 如果您身处科学计算领域,那么最后一点尤其重要。     

要回复问题请先登录注册