方括号在pip安装中意味着什么?

Bab*_*yan 52 python pip dependency-management

我看到越来越多这样的命令:

$ pip install "splinter[django]"
Run Code Online (Sandbox Code Playgroud)

这些方括号有什么作用?

Ben*_*ott 52

[optional]PIP 中的括号表示可选的依赖项

以防万一另一位开发人员希望在他们自己的 Python 包部署中实现这种模式,这里有对brackets []in pip的进一步解释。

例如:Apache Airflow

要从pip安装airflow,我们使用以下命令:

pip install 'apache-airflow'
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式安装气流的可选组件:

pip install 'apache-airflow[aws]'
#      [optional] -----------^
Run Code Online (Sandbox Code Playgroud)

当我们搜索 pypi 时apache-airflow注意可选包没有出现:

pip search 'apache-airflow'

apache-airflow (1.10.9)                            - Programmatically author, schedule and monitor data pipelines
pylint-airflow (0.1.0a1)                           - A Pylint plugin to lint Apache Airflow code.
swe-airflow-tools (0.0.3)                          - Tools for Apache Airflow Application
airflow (0.6)                                      - Placeholder for the old Airflow package
...
Run Code Online (Sandbox Code Playgroud)

实施方式 setup.py

您可以在setup.py 脚本
的左侧看到这是如何完成的setup.py-extras_require是定义的。
右侧是这些可选子包的相关安装命令。

setup.py 与安装


Joe*_*don 51

您使用的语法是:

pip install "project[extra]"
Run Code Online (Sandbox Code Playgroud)

你的情况,你installingsplinter拥有的附加支持包django.方括号([])不是特定语法,只是约定.真的,你正在安装名为的包:"splinter[django]".

解释来自@chetner:

该命令pip install splinter django将安装两个名为splinter和的包django.splinter[django],另一方面,安装的一个变体splinter,其包含包支持django.请注意,它与django包本身无关,而只是由splinter包定义的字符串,用于启用的特定功能集.

  • 我认为这个答案是不正确的。这不会安装“splinter[django]”包,而是同时安装 splinter 和 Django 项目。这些是 setuptools 附加功能,如 @paul 和 prosti 的回答中所解释的 (11认同)
  • 想要扩展您的答案以便未来的用户能够受益吗?例如,“额外”是什么意思? (5认同)
  • `splinter`仍然是包名; `pip`本身解析`splinter [django]`并将其识别为包含额外"参数"的包名,以帮助它安装正确的文件.如何解释参数`django`完全取决于用于定义包`splinter`的`setup.py`文件(或其他一些配置文件?我实际上并不知道细节). (3认同)
  • @BabkenVardanyan该命令将安装两个名为`splinter`和`django`的包.另一方面,`splinter [django]`安装`splinter`包的一个变种,它包含对`django`的支持.请注意,它与`django`包本身无关,但它只是一个由`splinter`包定义的字符串,用于启用的特定功能集. (2认同)
  • 我认为这个答案不正确。查看 [elasticsearch](https://github.com/elastic/elasticsearch-py/blob/master/setup.py) 包。它具有“elasticsearch[async]”风格,其中包含与安装“elasticsearch”时完全相同的代码,但除了确保使用异步类正常运行之外,还只需安装“aiohttp”。没有单独的“elasticsearch[async]”包 (2认同)
  • “确实,您正在安装名为:'splinter[django]'的软件包。” <- 我认为这是不正确的。我刚刚运行了 `pip install splinter[django]`,并且 `pip freeze` 没有显示任何名为 splinter[django] 的包名称,而是分别显示包 splinter 和 django 。 (2认同)

小智 13

总长DR

方括号包含 setup.py 中定义的“额外”选项信息,pip 将使用该信息来安装其他依赖项。

pip install "splinter[django]"
Run Code Online (Sandbox Code Playgroud)

具体来说,上面的行将首先安装“splinter”包,然后使用“splinter”项目的 setup.py 中指定的“django”选项安装“splinter”项目所需的额外依赖项。

解释

pip install "splinter[django]" 

pip install "splinter" "Django>=2.0.6" "lxml>=4.2.4" "cssselect"
Run Code Online (Sandbox Code Playgroud)

从 splinter==0.16.0 开始,对于 python==3.9.2,以上两个命令是等效的。

在干净的虚拟环境中,两个 pip install 都会生成以下软件包。

在此输入图像描述

两个 pip install 命令之所以达到相同的效果,是因为这实际上是基于splinter 包的 setup.py在后台运行的在此输入图像描述

“[django]”是“splinter”包的“额外”选项。Pip 将查看 splinter 包的 setup.py,并找到需要使用指定的 '[django]' 选项安装的内容。在本例中,是这 3 个包: ["Django>=2.0.6", "lxml>=4.2.4", "cssselect"]


Pau*_*aul 8

可以肯定的是这些是setuptools的附加功能:

https://setuptools.readthedocs.io/zh-CN/latest/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies

有时,项目具有“推荐”依赖关系,而对于项目的所有使用而言,并不是必需的。例如,如果安装了ReportLab,则一个项目可能提供可选的PDF输出,如果安装了docutils,则一个项目可能提供reStructuredText支持。这些可选功能称为“额外” ...


小智 6

也许值得一提的是,这个可选的包语法允许多个附加项(在括号内用逗号分隔),如下所示:

python -m pip install SomePackage[PDF,EPUB]  # multiple extras
Run Code Online (Sandbox Code Playgroud)

根据pip 手册

  • 但是我可以查询有多少个“推荐”依赖项可用吗?特别是,它们都是独立的并且可以相互组合/兼容吗?我可以安装所有这些,比如“pip install package[*]”吗? (2认同)

pro*_*sti 5

这也正是从列表setup.py中的项目文件的问题

"django": ["Django>=1.7.11;python_version<'3.0'", "Django>=2.0.6;python_version>'3.3'", "lxml>=2.3.6", "cssselect", "six"],
Run Code Online (Sandbox Code Playgroud)