36

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

我最近在一个已经有 MPI (openmpi) 版本的大学集群上安装了 anaconda。与 anaconda 一起安装的mpich2包和mpi4py包对于 mpi4py 的演示很好,但mpi*编译器(mpicc 等)不兼容。所以我conda removempich2mpi4py习惯于使用本地 MPIpip安装mpi4py和编译器进行安装。

我不得不四处寻找mpi4py's dependencies 和mpich2'sdependents,我只确定了mpi4py. 有没有一种“简单”的方法来找出取决于mpich2什么?

4

8 回答 8

37

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字段。然后,您将看到每个依赖于 requires 的包的一行或多行 mpich2。我的搜索只产生了mpi4py.

现在我认为您可以进行--dry-run删除,但似乎remove不会删除家属,因此没有列出任何特别之处。

如果grep不可用,那么我相信你可以制作一个 python 脚本来做同样的事情,使用说glob模块,甚至json可以进行搜索。

于 2014-09-29T14:13:34.603 回答
20
conda search --reverse-dependency <package>

应该是答案。除了它不工作。请对此问题进行投票,以表明它对用户很重要。已于 1 月 18 日报告,状态没有变化。希望如果收集到足够的选票,它将被关注。或者也许有人可以提交 PR 来修复它。

在那之前,如果 pip 的包反向依赖的版本与 conda 的版本相同,那么您可能会使用pipdeptree获得部分解决方案,但通常情况并非如此。但至少它会给你一些指示。

pipdeptree --reverse --packages <package>
于 2018-10-23T06:25:34.473 回答
19

使用最新版本的 conda,您可以

conda remove --dry-run <package>

获取将与给定软件包一起卸载的软件包列表。

于 2019-04-25T08:59:55.310 回答
11

搜索包缓存只会显示您已经下载的包。对于您的情况,这种行为很好,但是如果您想知道依赖于给定包的每个包,更好的方法是搜索频道的 repodata。repodata 缓存在 中~/anaconda/pkgs/cache,或者您可以使用浏览器导航到http://repo.continuum.io/pkgs/free/并单击repodata.json您使用的平台(对于 Binstar,请访问例如https://conda .binstar.org/asmeurer)。然后在“depends”键中搜索包的名称。

于 2014-09-30T15:19:55.370 回答
4

无耻的插件:conda-depgraph可以很容易地做到这一点:

$ conda depgraph --from-channels in mpich2

 ┌────────┐
 │anaconda│
 └───┬─┬──┘
     │ │
     │ └──┐
     v    │
 ┌──────┐ │
 │mpi4py│ │
 └──┬───┘ │
    │ ┌───┘
    │ │
    v v
 ┌──────┐
 │mpich2│
 └──────┘
于 2019-04-08T10:31:32.160 回答
2

根据 Yann 的回答,在 conda 核心中进行代码潜水并阅读内容,我想出了以下脚本来获取所有缓存通道的反向依赖图:

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等等)。

于 2020-03-26T07:39:08.337 回答
1

为此有一个 conda 包:conda-tree文档

要查找依赖于包的包:

# which packages depend on a specific package
$ conda-tree whoneeds xz
['samtools', 'bcftools', 'htslib', 'python']

你也可以转储整个依赖树,然后搜索:

# full dependency tree
$ conda-tree deptree --full
neovim==0.3.1
  ├─ pynvim 0.3.2 [required: any]
  │  ├─ greenlet 0.4.15 [required: any]
...
于 2021-09-16T18:49:33.440 回答
0

mamba repoquery

虽然Mamba主要是 Conda 的替代品,但它提供的额外功能之一是通过其repoquerycommand进行依赖和反向依赖查询的可靠功能。但是请注意,这仅适用于环境级别的关系,因此必须安装包并激活环境。

演示

请注意,这与最初的问题相去甚远,所以我只是进行mpi4py安装演示并使用已安装的版本。

$ mamba create -n so-mpi4py mpi4py
## installs 24 packages

$ conda activate so-mpi4py
(so-mpi4py) $ mamba repoquery whoneeds mpich
                  __    __    __    __
                 /  \  /  \  /  \  /  \
                /    \/    \/    \/    \
███████████████/  /██/  /██/  /██/  /████████████████████████
              /  / \   / \   / \   / \  \____
             /  /   \_/   \_/   \_/   \    o \__,
            / _/                       \_____/  `
            |/
        ███╗   ███╗ █████╗ ███╗   ███╗██████╗  █████╗
        ████╗ ████║██╔══██╗████╗ ████║██╔══██╗██╔══██╗
        ██╔████╔██║███████║██╔████╔██║██████╔╝███████║
        ██║╚██╔╝██║██╔══██║██║╚██╔╝██║██╔══██╗██╔══██║
        ██║ ╚═╝ ██║██║  ██║██║ ╚═╝ ██║██████╔╝██║  ██║
        ╚═╝     ╚═╝╚═╝  ╚═╝╚═╝     ╚═╝╚═════╝ ╚═╝  ╚═╝

        mamba (0.19.0) supported by @QuantStack

        GitHub:  https://github.com/mamba-org/mamba
        Twitter: https://twitter.com/QuantStack

█████████████████████████████████████████████████████████████


Executing the query mpich



 Name   Version Build           Depends              Channel           
────────────────────────────────────────────────────────────────────────
 mpi4py 3.1.3   py310hd348148_0 mpich >=3.4,<4.0.0a0 conda-forge/osx-64

就个人而言,我通常使用树格式,与

(so-mpi4py) $ mamba repoquery whoneeds --tree mpich

mpich[3.4.2]
  └─ mpi4py[3.1.3]

真实世界的例子

更多的是对其有用性的证明,我注意到我的一个 R 环境不知何故最终安装了 Python。我对此很严格,所以我伸手去拿mamba repoquery whoneeds,发现:

(bioc_3_12) host:dir usr$ mamba repoquery whoneeds -t python

Executing the query python

python[3.9.2]
  ├─ numpy[1.20.2]
  │  └─ colormath[3.0.0]
  │     └─ spectra[0.0.11]
  │        └─ r-rspectra[0.16_0]     # <- this package is the culprit!
  │           └─ r-uwot[0.1.10]
  ├─ networkx[2.5]
  │  └─ colormath already visited
  ├─ certifi[2021.5.30]
  │  └─ setuptools[49.6.0]
  │     ├─ networkx already visited
  │     └─ pip[21.0.1]
  ├─ python_abi[3.9]
  │  ├─ numpy already visited
  │  ├─ certifi already visited
  │  └─ setuptools already visited
  ├─ colormath already visited
  ├─ spectra already visited
  ├─ decorator[4.4.2]
  │  └─ networkx already visited
  ├─ wheel[0.36.2]
  │  └─ pip already visited
  ├─ pip already visited
  └─ setuptools already visited

r-spectra结果发现Conda Forge 中的包配方错误地将其依赖项之一声明为 Python 包 ( spectra) 而不是 C++ 动态库 ( spectralib)。

于 2021-12-16T22:09:47.717 回答