简化的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
。有什么想法吗?
conda remove --force libtiff
conda install -d python
实际上,您还没有完成,因为现在每次尝试更改环境时,都会建议删除每个不依赖显式规范的软件包。下一步可能是:
conda env export -n my_env > env.yaml
conda env remove -n my_env
conda env create -n my_env -f env.yaml
现在所有软件包都是明确的规格,这也不是一件好事,但至少可以确保它们不会在以后的更新中被删除。解说
个人,我认为这是一个坏主意,并没有真正看到动机。我认为最好是从您知道需要的软件包开始,将它们放在YAML定义中,然后从中创建环境。