Conda删除的软件包比预期的要多

时间:2019-10-17 22:45:43

标签: python package anaconda conda uninstall

简化的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。有什么想法吗?

1 个答案:

答案 0 :(得分: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定义中,然后从中创建环境是一个更好的主意。