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

$ pip install "splinter[django]"

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


当前回答

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

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

按照pip手册

其他回答

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"]

你所使用的语法是:

pip install "project[extra]"

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

来自@chetner的解释:

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

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

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

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

这正是该项目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"],

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

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

按照pip手册