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 个新软件包,包括 seaborn
、matplotlib
和 pandas
。现在假设时间过去了,我继续设置我的环境并希望显式安装 matplotlib
和 pandas
:
conda install matplotlib pandas
这告诉我 "All requested packages already installed",没关系。但是现在,如果我决定不再需要 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
。有什么想法吗?
解决方法
我想不出一种自动化的方法来做到这一点,但如果你绝对必须实现这一点,那么一个 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 定义中,然后从中创建环境是一个更好的主意。
简化的 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
这告诉我 "All requested packages already installed",没关系。但是现在,如果我决定不再需要 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
。有什么想法吗?
解决方法
我想不出一种自动化的方法来做到这一点,但如果你绝对必须实现这一点,那么一个 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 定义中,然后从中创建环境是一个更好的主意。