情况
我正在尝试将开放源代码库移植到Python3。(SymPy,如果有人想知道的话。)
因此,2to3在为Python 3构建时,我需要自动运行。为此,我需要使用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发行版很有用,但缺少功能。它介绍了distutils可以在setup.py脚本中导入的Python包。
官方文档 | distutils“ Python软件包用户指南”部分
Setuptools是为克服Distutils的限制而开发的,它不包含在标准库中。它引入了一个名为的命令行实用程序easy_install。它还介绍了setuptools可以在setup.py脚本中导入的pkg_resourcesPython包,以及可以在代码中导入的Python包,以查找随发行版一起安装的数据文件。它的陷阱之一是它猴子修补了distutilsPython包。它应该与配合良好pip。它可以看到常规版本。
Distribute是Setuptools的一个分支。它共享相同的名称空间,因此,如果你安装了Distribute,则import setuptools实际上将导入使用Distribute分发的软件包。分发已合并回Setuptools 0.7中,因此你不再需要使用分发。实际上,Pypi上的版本只是安装Setuptools的兼容层。
Distutils2试图充分利用Distutils,Setuptools和Distribute,并成为Python标准库中包含的标准工具。想法是将Distutils2分发给旧的Python版本,并将Distutils2重命名packaging为Python 3.3,并将其包含在其标准库中。这些计划没有按计划进行,但是,当前,Distutils2是一个废弃的项目。最新版本于2012年3月发布,其Pypi主页最终已更新以反映其死亡。
Alpha软件:
Distlib是一种工具,旨在实现以前工具功能的子集,但仅实现在公认的PEP中非常明确定义的功能。它是PyPA(Python打包机构)的工具之一,希望有朝一日最终将其包含在Python标准库中。它仍然被认为是alpha软件,因此最终用户要当心。
还有更多工具(例如Bento),但我不会提及它们,因为它们对于本答案过分模糊,利基,太早或尚未开发,否则它们不是直接的替代品。
建议:
因此,总而言之,在所有这些选项中,我建议你使用Setuptools,除非你的要求非常基础并且只需要Distutils。Setuptools与Virtualenv和Pip(我强烈推荐的工具)配合使用非常好。Virtualenv和Pip都可以被认为是官方的,因为它们是PyPA的一部分,并且Python 3已发布ensurepip(可帮助你pip在某些系统上安装)。
如果你正在寻找进入VIRTUALENV,你可能有兴趣在这样一个问题:是什么区别venv,pyvenv,pyenv,virtualenv,virtualenvwrapper,等?。
问题内容: 我正在开发一个具有多个.txt依赖项的Python egg(它们是用于通过egg本身生成文件的模板),而我正努力将这些依赖项复制到期间。根据文档… 我的软件包的文件系统: 在setup.py中: 在我的包装内: …配置和文件系统的这种组合应导致并通过提供。不幸的是,它们在期间没有被复制到。我想念什么? 谢谢! 问题答案: 您是否查看过setuptools文档,其中包含软件包数据:htt
问题内容: 我错放了太多次了,我想我一直忘记,因为我不知道两者之间的区别,只是一个给了我我期望的价值,而另一个却没有。 为什么是这样? 问题答案: 是的简写形式(尽管请注意,该表达式只会被计算一次。) 是的,即指定一元的到。 例子:
问题内容: 因此,我有一段简单的代码可以打印出整数1-10: 然后,如果仅在第3行上更改一个运算符,它将打印出无限数量的1整数(我知道为什么会这样做)。为什么在运行第二个程序时没有出现语法错误?如果赋值运算符后面跟着一个加法运算符,它不会调用语法错误吗? 问题答案: 与相同, 只是意味着。
问题内容: 有人可以解释一下 和 我不知道“确切”的含义 问题答案: 在这个例子中,什么都没有。当您具有多个具有相似名称的路径时,该参数将起作用: 例如,假设我们有一个显示用户列表的组件。我们还有一个用于创建用户的组件。的网址应嵌套在下。因此,我们的设置可能如下所示: 现在,这里的问题是,当我们转到路由器时,将通过所有定义的路由,并返回它找到的第一个匹配项。因此,在这种情况下,它将首先找到路线,然
问题内容: 我很好奇printStackTrace()和toString()之间的区别是什么。乍一看,他们 似乎 做的完全相同。 码: 问题答案: 不,有重要区别!使用toString,您只有异常的类型和错误消息。使用printStackTrace()可以获得异常的整个堆栈跟踪,这对于调试非常有帮助。 System.out.println(toString())的示例: printStackTra