简化的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
及其所有依赖项,但 not 删除了之前或之前明确安装的任何软件包(或其依赖项)在seaborn
之后。有人可能会说只需卸载seaborn
和所有39个软件包,然后手动重新安装matplotlib
和pandas
。这在平凡的情况下有效,但是一旦出现例如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
。有什么想法吗?
答案 0 :(得分:0)
我想不出一种自动的方式来做到这一点,但是如果您绝对必须做到这一点,那么一种卑鄙的方式可以做到:
仅删除所需的软件包:
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定义中,然后从中创建环境是一个更好的主意。