【问题标题】:Difference between extras_require() and install_requires() in setup.py?setup.py 中的 extras_require() 和 install_requires() 之间的区别?
【发布时间】:2017-05-07 05:40:09
【问题描述】:

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

【问题讨论】:

    标签: python setuptools setup.py


    【解决方案1】:

    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】:

      这是一个很好的问题。我自己也在寻找答案,但找不到让我满意的答案。 所以在积累了一些经验之后,这里举一些例子可以帮助更好的理解:

      假设我们的包是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 中。 -- 我想我会同意第二部分。
      • 没关系,因为 foo 只是一个扩展。假设你的包是 ReSharper 之类的小东西,它为 Visual Studio 添加了功能。当用户安装 ReSharper 时,你真的要开始下载和安装 5GB Visual Studio 吗?同样,如果用户的版本不正确,在这种情况下您不想覆盖他的版本。
      【解决方案3】:

      根据setuptools documentation

      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。这些依赖项将不会安装,除非用户或其他包调用了该功能。

      【讨论】:

      • install the extras 你可以使用pip install 'package[extra]' 之类的东西。
      • extras_requireinstall_requires很好的docs
      【解决方案4】:

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

      就我而言-

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

      理论上,这应该可以通过install_requires() 本身获得,但它只能在启动setuptools 的X.XX 版本(关于哪个版本开始正确的声明)时才有效。

      这篇文章解释的很好:Conditional Python Dependencies

      【讨论】:

      • "version X.XX" 是“至少版本 20.5”或者甚至可能是“至少 v36.2.0”,据我所知。
      猜你喜欢
      • 2013-12-18
      • 2013-09-18
      • 2013-03-21
      • 2017-04-22
      • 2019-12-18
      • 2017-10-22
      • 2019-05-02
      相关资源
      最近更新 更多