Conda remove 卸载的软件包比预期的要多

Posted

技术标签:

【中文标题】Conda remove 卸载的软件包比预期的要多【英文标题】:Conda remove uninstalls more packages than expected 【发布时间】:2020-02-14 21:46:37 【问题描述】:

简化的 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 及其所有依赖项,但 删除在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。有什么想法吗?

【问题讨论】:

这是令人惊讶的行为。我会report this on the repo。首先,当已存在时,Conda 无法将请求的包添加到显式规范中(注意:您可以使用 --force-reinstall 强制执行此操作,例如在 matplotlib 上,但我认为默认情况下应该这样做)。其次,在调用conda remove 时,Conda 似乎正在积极地修剪到显式规范。 conda env update 命令需要一个显式的 --prune 标志才能表现得像这样,因此应该将类似的东西添加到 conda remove 是有意义的。 顺便说一句,通过“显式规范”,我指的是 Conda 通过查看其交易历史 (conda-meta/history) 得出的内部包规范列表。这是你明确要求在你的回购中的东西。运行conda env export --from-history 时,您基本上会得到它的 YAML 副本 是的,conda remove 的行为似乎与合理预期的不符。假设 conda 的行为现在保持这样,我还有什么办法可以解决它来实现我所描述的吗? 【参考方案1】:

解决方法

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

    只删除你想要的包:

    conda remove --force libtiff
    

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

    conda install -d python
    

    如果有包,则迭代(即,使用步骤 1 删除它们);否则,你就完成了。

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

    导出生成的环境:

    conda env export -n my_env > env.yaml
    

    重新创建环境:

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

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

评论

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

【讨论】:

先导出并重新创建环境,然后删除 libtiff 会不会更有效率?如果没有递归步骤 1-3,这会达到同样的效果吗?另外,关于我的问题的前半部分,有什么办法可以解决卸载软件包会自动删除我明确安装的软件包的问题? @pallgeuer 你可能是对的。另一方面,--force-reinstall 你想要添加到规范中的包。

以上是关于Conda remove 卸载的软件包比预期的要多的主要内容,如果未能解决你的问题,请参考以下文章

常春藤下载的罐子比预期的要多

Neon VLD 消耗的周期比预期的要多?

客户端通信层从 Advantage 数据库服务器接收到的数据比预期的要多

为啥我的正则表达式模式收集的比我预期的要多?

UIView 动画动画的属性比我要求的要多

如何卸载软件包?