Conda remove 卸载比预期更多的包

Conda remove uninstalls more packages than expected

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

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

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

conda install matplotlib pandas

这告诉我 "All requested packages already installed",没关系。但是现在,如果我决定不再需要 seaborn 并将其删除,

conda remove seaborn

这将删除安装 seaborn 时安装的所有 39 个软件包,包括 matplotlibpandas,我在那之后明确安装了它们!我怎样才能避免这个问题?

我预期的行为是 conda remove seaborn 删除 seaborn 及其所有依赖项,但 不会 删除任何包(或其依赖项)在 seaborn 之前或之后明确安装。有些人可能会说只需卸载 seaborn 和所有 39 个软件包,然后手动重新安装 matplotlibpandas。这适用于微不足道的情况,但一旦有例如25 个具有复杂相互依赖关系的包,这变得非常复杂,至少维护起来很麻烦。

作为这方面的一个具体示例,我如何构建一个完整的 Anaconda 环境减去特定的包并且 依赖它的包?我试过了:

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

解决方法

我想不出一种自动化的方法来做到这一点,但如果你绝对必须实现这一点,那么一个 hacky 的方法是:

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