简化的 MWE => 假设我有 Anaconda 并执行以下操作:
conda create -n demo python=3.6
conda activate demo
conda install seaborn
最后一个命令安装 39 个新软件包,包括 seaborn
、matplotlib
和 pandas
。现在假设时间过去了,我继续设置环境并希望显式安装 matplotlib
和 pandas
:
conda install matplotlib pandas
这告诉我“所有请求的软件包都已安装”,这没关系。但是现在,如果我决定不再需要 seaborn
并将其删除,
conda remove seaborn
这会删除安装 seaborn
时安装的所有 39 个软件包,包括 matplotlib
和 pandas
,这是我在之后明确安装的!如何避免这个问题?
我的预期行为是 conda remove seaborn
删除 seaborn
及其所有依赖项,但不删除任何包(或依赖项)其中)在 seaborn
之前或之后显式安装。有些人可能会说只需卸载 seaborn
和所有 39 个软件包,然后手动重新安装 matplotlib
和 pandas
即可。这在微不足道的情况下有效,但是一旦有例如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
。有什么想法吗?
最佳答案
解决方法
我想不出一种自动化的方法来做到这一点,但如果你绝对必须实现这一点,那么一种巧妙的方法是:
仅删除您想要的包:
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 定义中,然后从中创建环境。
关于python - Conda删除卸载的软件包比预期多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58441645/