对于给定的conda
包,如何列出依赖它的包?
我最近在一个已经有MPI版本(openmpi)的大学集群上安装了anaconda。与anaconda一起安装的mpich2
包和mpi4py
包适用于mpi4py的演示,但是mpi*
编译器(mpicc等)不兼容。所以我conda remove
'd mpich2
和mpi4py
并使用pip
使用本地MPI安装和编译器安装mpi4py
。
我不得不四处寻找mpi4py
的依赖关系然后mpich2
的家属,我只识别了mpi4py
。是否有“简单”的方法来找出取决于mpich2
的东西?
搜索包缓存只会显示已经下载的包。对于您的情况,这种行为很好,但如果您想知道依赖于给定包的每个包,更好的方法是搜索您的频道的重新发送数据。 repodata缓存在~/anaconda/pkgs/cache
中,或者您可以使用浏览器导航到http://repo.continuum.io/pkgs/free/并单击repodata.json
获取您使用的平台(对于Binstar,转到例如https://conda.binstar.org/asmeurer)。然后在“depends”键中搜索包的名称。
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脚本来做同样的事情,使用glob
module甚至json
进行搜索。
conda search --reverse-dependency <package>
应该是答案。除了它没有工作。请对此issue投票,以表明它对用户很重要。据报道,1月18日,地位没有变化。希望如果收集到足够多的选票,我们会对此进行评估。或者也许有人可以提交PR来修复它。
在此之前,如果包的反向依赖关系的pip版本与conda的版本相同,那么使用pipdeptree可能会有部分解决方案,而通常情况并非如此。但至少它会给你一些指示。
pipdeptree --reverse --packages <package>
使用最新版本的conda,你可以做到
conda remove --dry-run <package>
获取将与给定的软件包一起卸载的软件包列表。
无耻的插件:conda-depgraph可以很容易地做到这一点:
$ conda depgraph --from-channels in mpich2
┌────────┐
│anaconda│
└───┬─┬──┘
│ │
│ └──┐
v │
┌──────┐ │
│mpi4py│ │
└──┬───┘ │
│ ┌───┘
│ │
v v
┌──────┐
│mpich2│
└──────┘