pip 需求文件中的可选依赖项

Posted

技术标签:

【中文标题】pip 需求文件中的可选依赖项【英文标题】:Optional dependencies in a pip requirements file 【发布时间】:2011-04-09 12:47:26 【问题描述】:

如何在 pip 需求文件中指定可选依赖项?

根据pip documentation,这是可能的,但文档没有解释如何做到这一点,我在网上找不到任何示例。

【问题讨论】:

伟大的问题。——一个相关的问题。将是如何定义一组应该尝试安装但如果无法安装则不考虑安装失败的要求。如果安装了 numpy,我有一个可以更好地工作的包,但如果 numpy 由于某种原因无法编译,我有一个回退。我很乐意将其设为默认安装,但如果未能满足要求,则为可选。 【参考方案1】:

您对文档有误解;它并不像它可能的那样清楚。文档中的要点是,使用需求文件,您可以随意指定推荐的完整工作包集,包括必要的依赖项和可选的依赖项。

您可以添加 cmets(以 # 开头的行)来区分这两者,但 pip 没有区别。正如 Daniel 建议的那样,您还可以有两个需求文件。

【讨论】:

你不能在需求文件中同时包含必需和可选的依赖项,因为如果文件中的任何包安装失败,“pip install”将立即中止。似乎使用两个单独的需求文件是唯一正确的解决方案。【参考方案2】:

2015 年PEP-0508 定义了一种在requirements.txt 中指定可选依赖项的方法:

requests[security]

这意味着yourpackage 的安全选项需要requests。您可以将其安装为:

pip install yourpackage[security]

【讨论】:

您可以使用extras_require argument 为setup 中的setuptools 函数配置这些“附加”之一。您可以在the requests setup.py 中看到security“额外”是如何配置的。 相关:How to install python module extras with pip requirements.txt file. 当我尝试这个时,我会收到很多错误,例如 Collecting pytest-cov[tests] ... WARNING: pytest-cov 2.10.0 does not provide the extra 'tests'Collecting numba[fast]<0.47 ... WARNING: numba 0.46.0 does not provide the extra 'fast'" 哦,我认为问题在于,在 requirements.txt 中,括号表示依赖项的“额外”,而我将其解释为“这只是我的包的依赖项,如果我包安装了那个额外的“ 如果你是从 github 安装,你可以改用 pip install "requests[security] @ git+ssh://git@github.com/psf/requests.git" 之类的东西【参考方案3】:

您可以创建optional-requirements.txtrequirements.txt,而不是在同一个文件中指定可选依赖项作为硬需求。

要将当前环境的包导出到文本文件中,您可以这样做:

pip freeze > requirements.txt

如有必要,修改 requirements.txt 的内容以准确表示您项目的依赖项。然后,要安装此文件中的所有包,请运行:

pip install -U -r requirements.txt

-U 告诉pip 将包升级到最新版本,-r 告诉它安装 requirements.txt 中的所有包。

【讨论】:

我认为您误解了这个问题。 'pip freeze' 只会打印出所有依赖项。我想知道的是如何在 pip 需求文件中指定哪些依赖项是必需的,哪些是可选的。 我在我认为你所指的文档中看到了参考,但我不确定它是否可能在一个需求文件中......虽然你可以有两个依赖文件,一个列出可选的依赖项。我会修改我的答案 谢谢 - 这是我已经采用的方法,但是阅读文档中关于可选依赖项的内容让我认为可能有更好的方法。

以上是关于pip 需求文件中的可选依赖项的主要内容,如果未能解决你的问题,请参考以下文章

在 setup.py 或 pip 需求文件中,如何控制安装包依赖项的顺序?

Odoo 14 CE 中的可选依赖项

通过 Grab 添加的外部库的可选依赖项不可用

npm 的“跳过失败的可选依赖项”是啥意思?

失败的可选依赖项/ chokidar / fsevents:

是否有一种可移植的方式在 Makefile 中制作可移植的可选依赖项?