形势
我正在尝试将一个开源库移植到Python3。(SymPy,如果有人想知道的话。)
因此,在为Python3构建时,我需要自动运行2to3
。要做到这一点,我需要使用distribute
。因此,我需要移植当前系统,该系统(根据doctest)是distutils
。
问题
不幸的是,我不确定这些模块distutils
、distribute
、setuptools
之间有什么区别。文档最好是粗略的,因为它们似乎都是彼此的分支,旨在在大多数情况下兼容(但实际上并非所有)…等等。
问题
有人能解释一下区别吗我该用什么?最现代化的解决方案是什么?(顺便说一句,我也很感激一些关于移植到Distribute
的指南,但这有点超出了问题的范围…)
截至2022年5月,这个问题的大多数其他答案已经过时好几年了。当你遇到关于Python打包问题的建议时,记得查看发布日期,不要相信过时的信息。
Python打包用户指南值得一读。每一页都有一个";最后更新的";日期显示,这样你就可以查看手册的最新版本,而且它非常全面。事实上,它托管在python软件基金会的python.org的子域上,这让它更加可信。项目摘要页面在这里尤其重要。
工具概述:
以下是Python包装领域的总结:
支持的工具:
-
setuptools
是为克服Distutils的限制而开发的,不包含在标准库中。它引入了一个名为easy_install
的命令行实用程序。它还介绍了可以在setup.py
脚本中导入的setuptools
Python包,以及可以在代码中导入的用于查找随发行版一起安装的数据文件的pkg_resources
Python包。其中一个问题是它对distutils
Python包进行了猴子补丁。它应该能很好地与pip
配合使用。它会定期发布。-
官方文档|Pypi页面|GitHub repo|Python包用户指南的
setuptools
部分
-
官方文档|Pypi页面|GitHub repo|Python包用户指南的
-
scikit-build
是一个改进的构建系统生成器,它在内部使用CMake来构建已编译的Python扩展。因为scikit构建不是基于distutils,所以它实际上没有任何限制。当ninja build存在时,scikit build编译大型项目的速度可以比其他版本快三倍以上。它应该能很好地与pip
配合使用。-
官方文档|Pypi页面|GitHub repo|Python包用户指南的
scikit-build
部分
-
官方文档|Pypi页面|GitHub repo|Python包用户指南的
-
distlib
是一个库,提供pip
等更高级别工具使用的功能。-
官方文档|Pypi页面|Bitbucket repo|Python包用户指南
distlib
部分
-
官方文档|Pypi页面|Bitbucket repo|Python包用户指南
-
packaging
也是一个库,提供pip
和setuptools
等更高级别工具使用的功能-
官方文档|Pypi页面|GitHub repo|Python包用户指南
packaging
部分
-
官方文档|Pypi页面|GitHub repo|Python包用户指南
废弃/废弃工具:
-
distutils
仍然包含在Python的标准库中,但从Python 3.10开始就被认为是不推荐使用的。它对于简单的Python发行版很有用,但缺少功能。它介绍了可以在setup.py
脚本中导入的distutils
Python包。-
官方文档|Python包用户指南
distutils
部分
-
官方文档|Python包用户指南
-
distribute
是setuptools
的一个分支。它共享相同的命名空间,所以如果安装了Distribute,import setuptools
实际上会导入使用Distribute分发的包Distribute已合并回Setuptools 0.7,因此您不再需要使用Distribute。事实上,Pypi上的版本只是一个安装Setuptools的兼容层。 -
distutils2
试图充分利用distutils
、setuptools
和distribute
,成为Python标准库中的标准工具。当时的想法是,distutils2
将为旧的Python版本分发,distutils2
将为Python 3.3重命名为packaging
,并将其包含在其标准库中。然而,这些计划并没有按预期进行,目前,distutils2
是一个废弃的项目。最近一次发布是在2012年3月,它的Pypi主页终于更新了,以反映它的死亡。
其他:
还有其他工具,如果您感兴趣,请阅读《Python打包用户指南》中的项目摘要。我不会把它们全部列出,以免重复那一页,并保持答案与问题相匹配,而问题只是关于distribute
、distutils
、setuptools
和distutils2
。
建议:
如果所有这些对您来说都是新的,并且您不知道从哪里开始,我建议您学习setuptools
,以及pip
和virtualenv
,它们都能很好地配合使用。
如果你正在研究virtualenv
,你可能会对这个问题感兴趣:venv
、pyvenv
、pyenv
、virtualenv
、virtualenvwrapper
等之间有什么区别?。(是的,我知道,我和你一起呻吟。)
我是distutils的维护者和distutils2/打包贡献者。我在ConFoo 2011上做了一个关于Python封装的演讲,这些天我正在写它的扩展版本。它还没有出版,所以这里有一些摘录应该有助于定义东西。
-
Distutils是用于包装的标准工具。它可以很好地满足简单的需求,但扩展起来是有限的,并非微不足道。
-
Setuptools是一个旨在填补缺失的distutils功能并探索新方向的项目。在某些子社区中,这是一个事实上的标准。它使用了猴子补丁和魔术,这是Python核心开发人员所反对的。
-
Distribute是Setuptools的一个分支,开发人员认为其开发速度太慢,不可能对其进行开发。当distutils2由同一组启动时,其开发速度大大减慢。2013年8月更新:distribute被合并回setuptools并停止使用。
-
Distutils2是一个新的distutils库,最初是distutils代码库的一个分支,有来自设置工具的好想法(其中一些在PEP中进行了深入讨论),以及受pip启发的基本安装程序
用于导入Distutils2的实际名称是Python 3.3+标准库中的Distutils2没有发布Python 3.3,因此被搁置。packaging
,或2.4+和3.1–3.2中的distutils2
。(后台端口很快就会提供。)
更多信息:
- Distutils的命运-Pycon Summit+Packaging Sprint详细报告
- Distutils和Distutils2之间的快速区别
我希望很快完成我的指南,它将包含更多关于每个图书馆的优点和缺点的信息,以及一个过渡指南。
注意:答案已弃用,分发现已过时。自从Python包装管理局成立以来,这个答案就不再有效了,并且已经做了很多工作来清理这个问题。
是的,你明白了。:-我认为现在首选的包是Distribute,它是setuptools的一个分支,是distutils(原始打包系统)的扩展。Setuptools没有得到维护,因此被分叉并重命名,但在安装时,它使用Setuptools的包名!我认为大多数Python开发人员现在都使用Distribute,我可以肯定地说我使用了
我正在尝试将一个开源库(SymPy,如果有人想知道的话)移植到Python3。到要做到这一点,我需要在为Python3构建时自动运行2to3。
您可能,而不是需要。其他策略在http://docs.python.org/dev/howto/pyporting
要做到这一点,我需要使用分布式
您可能:)distutils支持代码(而不是文档字符串)的构建时2to3转换,其方式与分发的不同:http://docs.python.org/dev/howto/pyporting#during-安装
在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和系统级库
如果你在科学计算领域,最后一点尤为重要。