setup.py中的extras_require()和install_requires()之间的区别?

时间:2016-12-21 17:46:48

标签: python setuptools setup.py

我试图理解setup.py中extras_require()install_requires()之间的区别,但无法得到它。两者都用于安装Python依赖项,但它们之间的区别是什么?

4 个答案:

答案 0 :(得分:21)

根据setuptools documentation

  

extras_require
  将“extras”(项目的可选功能)的名称映射到字符串或字符串列表的字典,指定必须安装其他发行版以支持这些功能。

  

install_requires
  一个字符串或字符串列表,指定在此时需要安装的其他发行版。

关于Declaring “Extras” (optional features with their own dependencies)的部分详细说明了这一点:

  

有时项目具有“推荐”的依赖关系,这对项目的所有使用都不是必需的。例如,如果安装了ReportLab,项目可能会提供可选的PDF输出,如果安装了docutils,则可能提供reStructuredText支持。这些可选功能称为“附加功能”,setuptools允许您定义其要求。通过这种方式,需要这些可选功能的其他项目可以通过在install_requires中命名所需的附加内容来强制安装其他要求。

最大的区别是extras_require中的要求仅根据需要安装:

  

这些要求不会自动安装,除非另一个包依赖于它们(直接或间接),方法是在相关项目名称后面的方括号中包含所需的“额外”。 (或者,如果附加内容列在EasyInstall命令行的需求规范中。)

总结一下:

  • 如果依赖必要来运行项目,请将其放在install_requires中。它们将一直安装。
  • 如果您的项目具有添加依赖关系的可选功能,请将这些依赖项放在extras_require中。除非用户或其他软件包调用该功能,否则将安装这些依赖项。

答案 1 :(得分:11)

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"

答案 2 :(得分:4)

我不确定官方用法,但我使用extras_require()来指定条件依赖项。

就我而言 -

extras_require={":python_version<'3.5'": ["scandir"]}

从理论上讲,这应该可以通过install_requires()本身获得,但它只能起始于setuptools的版本X.XX(几个版本开始正确的版权声明)。

本文很好地解释了它:Conditional Python Dependencies

答案 3 :(得分:-2)

这是一个很好的问题。我一直在寻找自己的答案,但找不到让我满意的答案。 因此,在获得一些经验之后,下面是一些示例,可以帮助您更好地理解:

假设我们的软件包为foo,并且与用户软件包bar集成在一起,以扩展其功能。 如果没有foo,我们的软件包bar就无法工作,因此似乎应该放在install_requires中,但这是有问题的。例如,如果用户安装了bar的1.1版,则安装了我们的软件包foo-我们的软件包可能安装了bar的1.2版,它将覆盖用户的版本。 相反,我们将bar放在bar的{​​{1}}部分中。 在这种情况下,用户可以知道自己将与现有版本的bar集成在一起,从而安全地安装extras_require。 但是,如果用户未安装foo怎么办?在这种情况下,用户将运行bar

另一个很好的例子是测试。 通常,对Packge的测试使用诸如pip install foo[bar]之类的软件包或特殊数据类型(诸如mock之类的软件包,这些软件包对于使用软件包本身不是强制性的。 在这种情况下,您可以将测试所需的所有软件包放在DataFrame的test部分中。如果要在虚拟环境(tox)中运行测试,只需将extras_require写入tox.ini文件即可。

我希望这个答案有帮助。