【发布时间】:2017-05-07 05:40:09
【问题描述】:
我试图了解 setup.py 中 extras_require() 和 install_requires() 之间的区别,但无法理解。两者都是用来安装Python依赖的,但是它们有什么区别呢?
【问题讨论】:
标签: python setuptools setup.py
我试图了解 setup.py 中 extras_require() 和 install_requires() 之间的区别,但无法理解。两者都是用来安装Python依赖的,但是它们有什么区别呢?
【问题讨论】:
标签: python setuptools setup.py
install_requires 是不管怎么安装的依赖包。
pip install mypackage
extras_require 是可选的,需要在安装时指定。
这是pip的功能。
pip install mypackage[extra]
pip install mypackage[develop]
pip install mypackage[extra,develop]
一个很好的例子是https://pypi.org/project/imgui/,它允许您选择特定的图形后端。
请参阅PEP 508 以查看您可以使用的所有可能的选择器;例如; python_version < "2.7".
【讨论】:
这是一个很好的问题。我自己也在寻找答案,但找不到让我满意的答案。 所以在积累了一些经验之后,这里举一些例子可以帮助更好的理解:
假设我们的包是foo,它与用户包bar 集成,扩展了它的功能。
我们的包foo 不能在没有bar 的情况下工作,所以它似乎应该在install_requires 中,但是有一个问题。例如,如果用户安装了 bar 的 1.1 版,然后安装了我们的包 foo - 我们的包可能安装了 bar 的 1.2 版,这将覆盖用户版本。
相反,我们将bar 放在bar 部分的extras_require 中。
在这种情况下,用户可以安全地安装foo,知道它将与他现有的 bar 版本集成。
但是如果用户没有安装bar 怎么办?在这种情况下,用户将运行pip install foo[bar]。
另一个很好的例子是测试。
很多时候,你的包测试使用包,如mock 或特定数据类型(如DataFrame),这些对于包本身的使用不是强制性的。
在这种情况下,您可以将测试所需的所有包放在extras_require 的测试部分中。当您想在虚拟环境(tox)中运行测试时,您只需在 tox.ini 文件中写入deps=my_package[tests]即可。
我希望这个答案会有所帮助。
【讨论】:
bar-1.1,是什么让您认为安装 foo 会导致安装 bar-1.2?如果foo 确实与两者兼容,那么它应该在其install_requires 中声明它,可能类似于bar>=1.1。如果bar 是强制依赖项,那么它肯定应该在install_requires 中,而不是extras_require 中。 -- 我想我会同意第二部分。
extras_require
将“附加”(项目的可选功能)名称映射到字符串或字符串列表的字典,指定必须安装哪些其他发行版才能支持这些功能。
和
install_requires
一个字符串或字符串列表,指定在安装此发行版时需要安装哪些其他发行版。
Declaring “Extras” (optional features with their own dependencies) 部分对此进行了详细说明:
有时项目具有“推荐”的依赖项,但并非所有项目的使用都需要这些依赖项。例如,如果安装了 ReportLab,项目可能会提供可选的 PDF 输出,如果安装了 docutils,则可能会提供 reStructuredText 支持。这些可选功能称为“附加功能”,setuptools 也允许您定义它们的要求。这样,需要这些可选功能的其他项目可以强制安装附加要求,方法是在其
install_requires中命名所需的附加功能。
最大的不同是extras_require中的需求只是按需安装:
这些需求不会被自动安装,除非另一个包依赖于它们(直接或间接),方法是在相关项目名称后的方括号中包含所需的“附加”。 (或者,如果附加功能在 EasyInstall 命令行的需求规范中列出。)
总结一下:
install_requires。它们将始终安装。extras_require。这些依赖项将不会安装,除非用户或其他包调用了该功能。【讨论】:
pip install 'package[extra]' 之类的东西。
extras_require和install_requires很好的docs
我不确定官方的用法,但是我使用extras_require() 来指定条件依赖。
就我而言-
extras_require={":python_version<'3.5'": ["scandir"]}
理论上,这应该可以通过install_requires() 本身获得,但它只能在启动setuptools 的X.XX 版本(关于哪个版本开始正确的声明)时才有效。
这篇文章解释的很好:Conditional Python Dependencies