通过名称检测python pip子包是否安装

Fab*_*.D. 4 pip

Airflow 模块附带一个主 pip 包apache-airflow和多个子包,仅安装我们需要的内容(检查文档https://airflow.incubator.apache.org/installation.html#extra-packages

我想测试是否安装了子包(例如获取 bash 命令来了解是否apache-airflow[mysql]安装)。

要知道是否apache-airflow已安装,如果已安装,我可以执行pip show apache-airflow并获取0退出代码,1否则。如果这样做pip show apache-airflow['mysql'],我总是会得到1退出代码,子包是否安装。

我找不到任何选择。任何想法?

Ant*_*ile 5

您在这里提到的“子包”称为“setuptools extra”。pip 不会将这些记录在文件系统中的任何位置。但是,您可以通过迭代安装元数据并测试每个依赖包是否已安装来检测它们是否已安装。

幸运的是,有一种方法pkg_resources可以为您做到这一点

我进行了测试,jsonschema[format]因为它对我来说很容易安装/卸载。

jsonschema[format]安装

$ python -c 'import pkg_resources; pkg_resources.require("jsonschema[format]")'
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

[format]没有额外的依赖

$ python -c 'import pkg_resources; pkg_resources.require("jsonschema[format]")'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 967, in require
    needed = self.resolve(parse_requirements(requirements))
  File "venv/lib/python3.6/site-packages/pkg_resources/__init__.py", line 853, in resolve
    raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'webcolors; extra == "format"' distribution was not found and is required by jsonschema

$ echo $?
1
Run Code Online (Sandbox Code Playgroud)