如何识别conda包依赖者?

问题描述 投票:13回答:5

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

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

我不得不四处寻找mpi4py的依赖关系然后mpich2的家属,我只识别了mpi4py。是否有“简单”的方法来找出取决于mpich2的东西?

conda
5个回答
6
投票

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


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不会删除dependents,所以没有列出任何特殊的。

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


6
投票
conda search --reverse-dependency <package>

应该是答案。除了它没有工作。请对此issue投票,以表明它对用户很重要。据报道,1月18日,地位没有变化。希望如果收集到足够多的选票,我们会对此进行评估。或者也许有人可以提交PR来修复它。

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

pipdeptree --reverse --packages <package>

3
投票

使用最新版本的conda,你可以做到

conda remove --dry-run <package>

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


1
投票

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

$ conda depgraph --from-channels in mpich2

 ┌────────┐
 │anaconda│
 └───┬─┬──┘
     │ │
     │ └──┐
     v    │
 ┌──────┐ │
 │mpi4py│ │
 └──┬───┘ │
    │ ┌───┘
    │ │
    v v
 ┌──────┐
 │mpich2│
 └──────┘
© www.soinside.com 2019 - 2024. All rights reserved.