如何识别conda包依赖者?

时间:2014-09-29 14:13:35

标签: conda

对于给定的conda包,如何列出依赖它的包?

我最近在已经拥有MPI版本(openmpi)的大学集群上安装了anaconda。与anaconda一起安装的mpich2包和mpi4py包适用于mpi4py的演示,但mpi*编译器(mpicc等)不兼容。所以我conda remove' d mpich2mpi4py并使用pip使用本地MPI安装和编译器安装mpi4py

我不得不四处寻找mpi4py的依赖关系,然后找到mpich2的家属,我只识别了mpi4pympich2是否有" easy"找出取决于{{1}}的内容的方法

6 个答案:

答案 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等。