对于给定的conda
包,如何列出依赖它的包?
我最近在已经拥有MPI版本(openmpi)的大学集群上安装了anaconda。与anaconda一起安装的mpich2
包和mpi4py
包适用于mpi4py的演示,但mpi*
编译器(mpicc等)不兼容。所以我conda remove
' d mpich2
和mpi4py
并使用pip
使用本地MPI安装和编译器安装mpi4py
。
我不得不四处寻找mpi4py
的依赖关系,然后找到mpich2
的家属,我只识别了mpi4py
。mpich2
。 是否有" easy"找出取决于{{1}}的内容的方法
答案 0 :(得分:23)
conda info
会告诉您package cache
所在的目录(或目录)。这些目录包含每个包的唯一目录,每个包目录包含一个info
目录和一个名为index.json
的文件。每个文件中都有一个requires
字段,引用conda
个依赖项列表。简而言之,您需要在这些文件中搜索您尝试删除的软件包。
例如,如果我的主目录中安装了anaconda
,因此包缓存为~/anaconda/pkgs
,那么为了找到mpich2
的家属,我将:
grep mpich2 ~/anaconda/pkgs/*/info/index.json
anaconda
包会看到2行,因为mpich2
位于前面提到的requires
列表和名为depends
的列表中。您还会看到每个mpich2
包可用的一行,因为每个包还有一个name
字段。然后,您会看到每个包依赖的一行或多行,需要mpich2
。我的搜索仅生成mpi4py
。
现在我认为您可以执行--dry-run
删除,但似乎remove
不会删除依赖项,因此没有列出任何特殊内容。
如果grep
不可用,那么我确定你可以制作一个python脚本来做同样的事情,比如使用glob
模块甚至json
来做搜索。
答案 1 :(得分:6)
搜索包缓存只会显示您已下载的包。对于您的情况,这种行为很好,但如果您想知道依赖于给定包的每个包,更好的方法是搜索您的频道的重新发送数据。 repodata缓存在~/anaconda/pkgs/cache
中,或者您可以使用浏览器导航到http://repo.continuum.io/pkgs/free/,然后点击repodata.json
获取您使用的平台(对于Binstar,转到,例如https://conda.binstar.org/asmeurer })。然后在“depends”键中搜索包的名称。
答案 2 :(得分:5)
conda search --reverse-dependency <package>
应该是答案。除非它不起作用。请对此issue进行投票,以表明它对用户很重要。据报道,1月18日,状态没有变化。希望能收集到足够的选票。也许有人可以提交PR进行修复。
在此之前,如果pip包的反向依赖项版本与conda的版本相同,那么您可能会使用pipdeptree有部分解决方案,通常不是这种情况。但这至少会给您一些提示。
pipdeptree --reverse --packages <package>
答案 3 :(得分:2)
使用最新版本的conda,您可以
gralde clean --stacktrace
获取将与给定软件包一起卸载的软件包列表。
答案 4 :(得分:1)
无耻的插件:conda-depgraph可以很容易地做到这一点:
$ conda depgraph --from-channels in mpich2
┌────────┐
│anaconda│
└───┬─┬──┘
│ │
│ └──┐
v │
┌──────┐ │
│mpi4py│ │
└──┬───┘ │
│ ┌───┘
│ │
v v
┌──────┐
│mpich2│
└──────┘
答案 5 :(得分:1)
根据Yann的回答,在conda核心中进行代码潜水并阅读this,我想到了以下脚本来获取所有缓存通道的反向依赖图:
import glob
import json
import os
from collections import defaultdict
info = json.load(os.popen('conda info --json'))
print('Loading channels...')
channels = [
json.load(open(repodata))
for pkg_dir in info['pkgs_dirs']
for repodata in glob.glob(os.path.join(pkg_dir, 'cache', '*.json'))
]
print('Done')
rdeps = defaultdict(set)
for c in channels:
for k, v in c['packages'].items():
package = '-'.join(k.split('-')[:-2])
for dep in v['depends']:
dependant = dep.split()[0]
rdeps[dependant].add((package, c['_url']))
现在,您可以获得特定软件包的反向依赖关系:
>>> print(rdeps['mpich2'])
set()
好吧,现在不再依赖它了...但是,如果您在ipython或Jupyter中运行它,则可以快速查询反向依赖关系,例如:
>>> print(rdeps['aiosqlite'])
{('databases', 'https://conda.anaconda.org/conda-forge/linux-64')}
您将获得软件包名称(没有版本,可能会有很多),以及频道URL(可以显示给您,如果是pkgs/main/(arch)
或conda-forge
等。