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