我试图理解setup.py中extras_require()
和install_requires()
之间的区别,但无法得到它。两者都用于安装Python依赖项,但它们之间的区别是什么?
答案 0 :(得分:21)
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文件即可。
我希望这个答案有帮助。