Conda删除比预期的卸载更多软件包

问题描述 投票:1回答:1

简化的MWE =>假设我有Anaconda并执行以下操作:

conda create -n demo python=3.6
conda activate demo
conda install seaborn

最后一条命令将安装39个新软件包,包括seabornmatplotlibpandas。现在,假设时间过去了,我将继续设置我的环境,并希望显式安装matplotlibpandas

conda install matplotlib pandas

这会告诉我“已安装所有请求的软件包”,可以。现在,如果我决定不再需要seaborn并将其删除,

conda remove seaborn

这将删除在安装seaborn时安装的所有39个软件包,包括matplotlibpandas,这是我在此之后明确安装的!如何避免这个问题?

我的预期行为是conda remove seaborn删除了seaborn及其所有依赖项,但是not删除了在seaborn之前或之后明确安装的任何程序包(或其依赖项)。有人可能会说只需卸载seaborn和所有39个软件包,然后手动重新安装matplotlibpandas。这在平凡的情况下有效,但是一旦出现例如25个具有相互依赖关系的软件包,这变得非常复杂,并且至少要进行完整的维护。

作为一个具体的例子,我如何构建一个完整的Anaconda环境,减去一个特定的软件包和only依赖于它的软件包?我尝试过:

conda create -n test python=3.6 anaconda
conda remove libtiff  # I want this to strictly only remove libtiff and its recursive dependents, but obviously this is not what happens

但是第二行实际上删除了整个环境中的每个单个软件包,因为它删除了anaconda。有什么想法吗?

python package anaconda conda uninstall
1个回答
0
投票
解决方法

我想不出一种自动的方式来做到这一点,但是,如果您绝对必须实现这一点,那么一种拙劣的方式就是:

  1. 仅删除您要的软件包:

    conda remove --force libtiff

  2. 触发一致性检查以获取现已损坏的软件包的列表:

    conda install -d python

  3. 如果有软件包,则进行迭代(即,使用步骤1删除它们);否则,您就完成了。

实际上,您还没有完成,因为现在每次尝试更改环境时,都会建议删除每个不依赖显式规范的软件包。下一步可能是:

  1. 导出结果的环境:

    conda env export -n my_env > env.yaml

  2. 重新创建环境:

    conda env remove -n my_env conda env create -n my_env -f env.yaml

现在所有软件包都是明确的规格,这也不是一件好事,但至少可以确保它们不会在以后的更新中被删除。

解说

个人,我认为这是一个坏主意,并没有真正看到动机。我认为最好是从您知道需要的软件包开始,将它们放在YAML定义中,然后从中创建环境。

© www.soinside.com 2019 - 2024. All rights reserved.