![](/img/trans.png)
[英]How to distribute `.desktop` files and icons for a Python package in Gnome (with distutils or setuptools)?
[英]Differences between distribute, distutils, setuptools and distutils2?
我正在尝试将开源库移植到 Python 3。( SymPy ,如果有人想知道的话。)
因此,在为 Python 3 构建时,我需要自动运行2to3
。为此,我需要使用distribute
。 因此,我需要移植当前系统,(根据 doctest)是distutils
。
不幸的是,我不确定这些模块之间的区别是什么—— distutils
、 distribute
、 setuptools
。 文档最好是粗略的,因为它们似乎都是彼此的一个分支,旨在在大多数情况下兼容(但实际上,并非全部)......等等,等等。
有人可以解释这些差异吗? 我应该用什么? 什么是最现代的解决方案? (顺便说一句,我也很欣赏一些关于移植到Distribute
的指南,但这有点超出问题的 scope ......)
截至 2020 年 3 月,这个问题的大多数其他答案都已经过时了好几年。 当您遇到有关 Python 包装问题的建议时,请记住查看发布日期,不要相信过时的信息。
Python 包装用户指南值得一读。 每个页面都有显示的“最后更新”日期,因此您可以查看手册的新近度,并且非常全面。 它托管在 Python 软件基金会的 python.org 的子域上的事实只是增加了对它的信任。 项目摘要页面在这里特别重要。
以下是 Python 封装格局的总结:
distutils
仍然是 Python 中打包的标准工具。 它包含在标准库中(Python 2 和 Python 3)。 它对于简单的 Python 发行版很有用,但缺少功能。 它介绍了可以在setup.py
脚本中导入的distutils
Python package。
setuptools
是为了克服 Distutils 的限制而开发的,并且不包含在标准库中。 它引入了一个名为easy_install
的命令行实用程序。 It also introduced the setuptools
Python package that can be imported in your setup.py
script, and the pkg_resources
Python package that can be imported in your code to locate data files installed with a distribution. 它的问题之一是它对distutils
Python package 进行了猴子补丁。 它应该适用于pip
。 它看到定期发布。
scikit-build
是一个改进的构建系统生成器,它在内部使用 CMake 来构建编译的 Python 扩展。 因为 scikit-build 不是基于 distutils,所以它实际上没有任何限制。 当 ninja-build 存在时,scikit-build 编译大型项目的速度比替代方案快三倍。 它应该适用于pip
。
distlib
是一个库,它提供的功能可供更高级别的工具使用,例如pip
。
packaging
也是一个库,提供更高级别工具(如pip
和setuptools
使用的功能
distribute
是setuptools
的一个分支。 它共享相同的命名空间,因此如果您安装了 Distribute, import setuptools
实际上会导入与 Distribute 一起分发的 package。 Distribute 已合并回 Setuptools 0.7 ,因此您不再需要使用 Distribute。 实际上,Pypi 上的版本只是安装了 Setuptools 的兼容层。
distutils2
试图充分利用distutils
、 setuptools
并distribute
并成为 Python 标准库中包含的标准工具。 这个想法是distutils2
将为旧的 Python 版本分发,并且distutils2
将重命名为 Python 3.3 的packaging
,它将包含在其标准库中。 这些计划没有按预期 go,但是,目前, distutils2
是一个废弃的项目。 最新版本是在 2012 年 3 月,它的 Pypi 主页终于更新以反映它的死亡。
还有其他工具,如果您有兴趣,请阅读 Python 打包用户指南中的项目摘要。 我不会将它们全部列出,也不会重复该页面,并保持与问题相匹配的答案,这只是关于distribute
、 distutils
、 setuptools
和distutils2
。
如果所有这些对您来说都是新的,并且您不知道从哪里开始,我建议您学习setuptools
以及pip
和virtualenv
,它们都可以很好地协同工作。
如果您正在研究virtualenv
,您可能会对这个问题感兴趣: venv
、 pyvenv
、 pyenv
、 virtualenv
、 virtualenvwrapper
等有什么区别? . (是的,我知道,我和你一起呻吟。)
我是 distutils 维护者和 distutils2/packaging 贡献者。 我在 ConFoo 2011 上讨论了 Python 包装,这些天我正在编写它的扩展版本。 它还没有发布,所以这里有一些可以帮助定义事物的摘录。
Distutils是用于打包的标准工具。 它适用于简单的需求,但它是有限的,而且扩展起来并不简单。
Setuptools是一个出于填补 distutils 缺失功能和探索新方向的愿望而诞生的项目。 在某些子社区中,这是事实上的标准。 它使用了 Python 核心开发人员不喜欢的猴子补丁和魔法。
Distribute是 Setuptools 的一个分支,由开发人员开始,他们觉得它的开发速度太慢并且无法发展它。 当 distutils2 由同一组启动时,它的开发速度大大减慢。 2013 年 8 月更新:distribute 被合并回 setuptools 并停止。
Distutils2是一个新的 distutils 库,最初是 distutils 代码库的一个分支,其好主意取自安装工具(其中一些在 PEP 中进行了全面讨论),以及受 pip 启发的基本安装程序。 您用于导入 Distutils2 的实际名称是 Python 3.3+ 标准库中的 packaging
,或 2.4+ 和 3.1–3.2 中的distutils2
。(即将推出一个反向移植。) Distutils2 没有发布 Python 3.3 版本,因此被搁置。
更多信息:
我希望尽快完成我的指南,它将包含有关每个图书馆的强项和弱点的更多信息以及过渡指南。
许多人在这里抱怨在这个问题上缺乏明确的社区指导。
目前这看起来像是工具推荐的最佳权威来源: https://packaging.python.org/en/latest/current.html#tool-recommendations
注意:不推荐使用答案,现在分发已过时。 这个答案不再有效,因为 Python 包装管理局已经成立并且已经做了很多清理工作。
是的,你明白了。 :-o 我认为此时首选的 package 是Distribute ,它是 setuptools 的一个分支,是 distutils (原始打包系统)的扩展。 Setuptools 没有得到维护,因此被分叉并重命名,但是在安装时它使用 setuptools 的 package 名称,我认为大多数 Python 开发人员现在都使用 Distribute。 我可以肯定地说我愿意。
在 2014 年底更新了这个问题,幸运的是 Python 包装混乱已经被 Continuum 的“ conda ”package 经理大大清理了。
特别是,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 具有以下特点:
如果您在科学计算领域,最后一点尤其重要。
我意识到我已经回答了您的第二个问题,但没有解决您原始问题中毫无疑问的假设:
我正在尝试将一个开源库(SymPy,如果有人想知道的话)移植到 Python 3。为此,我需要在为 Python 3 构建时自动运行 2to3。
你可能,不需要。 http://docs.python.org/dev/howto/pyporting中描述了其他策略
为此,我需要使用分发,
你可以:) distutils 支持代码(不是文档字符串)的构建时 2to3 转换,以不同的方式分发: http://docs.python.org/dev/howto/pyporting#during-installation
这个话题似乎还在不断变化。 截至 2013 年 10 月 31 日,“Python 打包用户指南”快速推荐定义了“当前推荐的工具集”。 它曾经链接到“Python 包装的未来”,现在,2019 年 1 月 20 日,5 年多后,这是一个死链接。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.