如何查找Python软件包的反向依赖关系

3

我有一个虚拟环境,安装了elasticsearch Python包。

我想找出哪个包依赖于elasticsearch并在虚拟环境中进行了安装。

(.venv)root@test:~# pip freeze | grep elast
elasticsearch==1.4.0.dev0

我尝试了一些来自使用pip显示反向依赖关系的解决方案,但它并没有起作用。

(.venv)root@test:~# python
Python 2.7.8 (default, Oct 18 2014, 12:50:18)
[GCC 4.9.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pip
>>> package_name = 'elasticsearch'
>>> rev_dep = [pkg.project_name for pkg in pip.get_installed_distributions() if package_name in [requirement.project_name for requirement in pkg.requires()]]
>>> rev_dep
[]
>>>

模块路径返回虚拟环境路径。

(.venv)root@test:~# python -c 'import elasticsearch; print elasticsearch.__path__'
['/opt/venvs/.venv/local/lib/python2.7/site-packages/elasticsearch']

我有疑问,elasticsearch Debian包是否安装了这个Python包,但不确定。

(.venv)root@test:~# dpkg -l | grep elast
ii  elasticsearch                        1.2.0                           all          Open Source, Distributed, RESTful Search Engine

1
首先,检查 elasticsearch 安装的位置(以便您知道是否正在使用系统包)。请提供以下命令的输出:python -c 'import elasticsearch; print elasticsearch.__path__' - Thomas Orozco
1个回答

2

步骤1. 找到您虚拟环境的site-packages目录:

请注意我的shell提示显示为venv38,并以egrep结尾。

(venv38) myuser@foo$ python -m site | egrep venv38

site.py模块具有各种有趣的信息,但我们只对虚拟环境的site-packages感兴趣。

输出:

'/Users/myuser/kds2/py2/venv38/lib/python3.8/site-packages',

第二步。查找*dist-info/METADATA文件中的依赖项

切换到上面找到的site-packages目录。

我正在寻找谁在使用bleach而不是elasticsearch

cd /Users/myuser/kds2/py2/venv38/lib/python3.8/site-packages

find . -name METADATA -exec grep -H -i bleach {} \; | grep Requires-Dist

注意:虽然在这里不必担心,但包名称中的字符如-_可能会影响grep的编写方式。

输出:

./readme_renderer-24.0.dist-info/METADATA:Requires-Dist: bleach (>=2.1.0)

因此,readme_renderer 是导入此依赖项的东西。

请注意,使用 find . -name METADATA -exec grep -H Requires-Dist {} \; | grep bleach 即在您搜索的软件包和Requires-Dist之间交换grep序列不起作用,因为在我的情况下,它显示了很多bleach自己的依赖关系。


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