检测Python pip子包是否按名称安装

4
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作为退出代码。
我找不到任何选项。有什么建议吗?
1个回答

5
这里所指的“子包”被称为“setuptools额外包”。pip不会在文件系统中记录它们。但是,您可以通过迭代安装元数据并测试每个依赖软件包是否已安装来检测它们是否已安装。
幸运的是,pkg_resources中有一个方法可以为您执行此操作
我使用jsonschema[format]进行测试,因为它很容易安装/卸载。

安装了jsonschema[format]

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

没有依赖于 [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

有没有办法在setup.py内部访问这些额外的内容?我想根据提供的额外内容包含不同的软件包。 - Jack
@Jack 有点跟这个问题无关,但是那是 extras_require - anthony sottile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接