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

$ pip install "splinter[django]"

这些方括号是做什么用的?


当前回答

我很确定这些是setuptools的额外功能:

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

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

其他回答

你所使用的语法是:

pip install "project[extra]"

在你的例子中,你正在安装splinter包,它增加了对django的支持。方括号([])不是特定的语法,只是惯例。实际上,您正在安装名为“splinter[django]”的包。

来自@chetner的解释:

命令pip install splinter django将安装两个包,分别命名为splinter和django。另一方面,Splinter [django]安装了Splinter包的变体,其中包含对django的支持。注意,它与django包本身没有任何关系,而只是一个由splinter包定义的字符串,用于启用特定的特性集。

也许值得知道的是,这个可选包语法允许多个额外项(括号内用逗号分隔),如:

python -m pip install SomePackage[PDF,EPUB]  # multiple extras

按照pip手册

我很确定这些是setuptools的额外功能:

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

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

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

以防其他开发人员希望在他们自己的Python包部署中实现此模式,这里进一步解释pip中的括号[]。

例如:Apache气流

要从pip安装气流,我们使用这个命令:

pip install 'apache-airflow'

你可以安装可选的气流组件:

pip install 'apache-airflow[aws]'
#      [optional] -----------^

当我们在pypi中搜索apache-气流时,注意可选包没有显示出来:

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
...

通过setup.py实现

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

TLDR

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

pip install "splinter[django]"

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

解释

pip install "splinter[django]" 

pip install "splinter" "Django>=2.0.6" "lxml>=4.2.4" "cssselect"

对于splinter==0.16.0,使用python==3.9.2,上述两个命令是等效的。

在一个干净的虚拟环境中,这两个pip安装都将产生以下包。

两个pip安装命令实现相同效果的原因是,这实际上是基于splinter包的setup.py在后台运行的

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