如何让“conda env list”隐藏环境而不删除它?

How to get `conda env list` to hide an environment without removing it?

我在一个尚未激活的文件夹中有一个虚拟环境。 运行 conda env list 不会列出此环境。

但是,在我第一次使用Conda激活环境后,现在我每次运行 conda env list都会包含这个环境。

有没有办法忽略 conda env list 中的环境而不删除它(因为这会删除整个文件夹)? 我想保留该文件夹而不删除它并且 Conda 不会每次都列出它。

AFAIK,无法通过配置或其他 out-of-the-box 选项来指定要被 conda env list 命令忽略的特定环境。但是,如果我们深入了解 Conda 如何生成此列表,我们至少可以实施一个解决方法。

Conda 用户环境跟踪

Conda 以两种方式跟踪环境:

  1. 自动发现位于任何 envs_dirs 目录中的环境。您可以检查 conda config --show envs_dirs 以查看包含哪些目录。如果不改变 conda-env 工作原理的内部结构(即,您必须分叉 conda 代码并添加新功能),这样的环境在 conda env list 中是不可忽视的。

  2. 任何时候用户激活一个环境,它都会被添加到一个 user-specific 跟踪文件中,即

    ~/.conda/environments.txt
    

    其中 ~ 是用户主目录。清除您希望隐藏的环境文件应该从 conda env list 输出中删除环境,至少直到它再次被激活。

自动解决方法示例

如果您想要更自动化的清除,您可以在 shell 初始化文件(例如 .bash_profile)中包含一行,以使用类似 [=21] 的方式从该文件中删除条目=] 和一个正则表达式来匹配您希望忽略的环境。

作为一个具体的例子,我作为 Snakemake 用户经常遇到这个问题。 Snakemake 自动生成 Conda 环境,并将它们用于 运行 可重现(-ish)上下文中的代码。这些环境都在 .snakemake/ 目录下生成,并最终开始支配我的 conda env list 输出。这绝对是个麻烦,因为我从未打算手动激活任何这些环境,而且它们都是用哈希命名的,所以几乎不可能通过前缀识别它们的内容。

要自动清除这些,我可以将以下内容添加到我的 .bashrc.bash_profile:

sed -i '/\.snakemake/d' ~/.conda/environments.txt

这仍然会导致暂时显示这些 auto-generated 环境,但每次启动新的 shell 时它们都会被清除。希望这种暂时性的情况不会造成大麻烦,否则我想对此更有创意的解决方案也是可行的,例如,每当文件被更改时触发清除操作。