我有一个虚拟环境,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 步。 查找虚拟环境 的站点包目录:
请注意我的 shell 提示符,最后显示venv38
和 egrep。
(venv38) myuser@foo$ python -m site | egrep venv38
site.py 模块有各种有趣的信息,但我们只对 venv 的网站包感兴趣。
输出:
'/Users/myuser/kds2/py2/venv38/lib/python3.8/site-packages',
步骤 2. 在*dist-info/METADATA
文件中查找依赖项
切换到您在上面找到的站点包目录。
我正在寻找谁在使用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
自己的依赖项。