如何防止Conda在默认情况下激活基本环境?

我最近在我的Mac上安装了anaconda2。默认情况下,Conda被配置为当我打开一个新的终端会话时激活基本环境。

我想要访问Conda命令(即我想要Conda的路径添加到我的$PATH, Conda在初始化时这样做,所以这很好)。

但是,我通常不使用python编程,并且我不希望Conda在默认情况下激活基本环境。

当第一次从提示符执行conda init时,Conda将以下内容添加到我的.bash_profile中:

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/Users/geoff/anaconda2/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/Users/geoff/anaconda2/etc/profile.d/conda.sh" ]; then
. "/Users/geoff/anaconda2/etc/profile.d/conda.sh"
else
export PATH="/Users/geoff/anaconda2/bin:$PATH"
fi
# fi
unset __conda_setup
# <<< conda initialize <<<

如果我注释掉了整个块,那么我就不能激活任何Conda环境。

我试着把整个街区都注释掉,除了

export PATH="/Users/geoff/anaconda2/bin:$PATH"

但是当我开始一个新的会话并尝试激活一个环境时,我得到了这个错误消息:

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.

这个问题(和其他类似的)是有帮助的,但并不能最终回答我的问题,它更适合linux用户。

需要明确的是,我不是要求从我的$PS1中删除(base),我是要求Conda在我打开终端会话时不激活基地。

343404 次浏览

所以最后我发现,如果我像这样注释掉Conda初始化块:

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
# __conda_setup="$('/Users/geoff/anaconda2/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
# if [ $? -eq 0 ]; then
# eval "$__conda_setup"
# else
if [ -f "/Users/geoff/anaconda2/etc/profile.d/conda.sh" ]; then
. "/Users/geoff/anaconda2/etc/profile.d/conda.sh"
else
export PATH="/Users/geoff/anaconda2/bin:$PATH"
fi
# fi
# unset __conda_setup
# <<< conda initialize <<<

这完全是我想要的。也就是说,如果需要,Conda可用于激活环境,但默认情况下不能激活。

答案取决于您安装的conda版本。对于conda >= 4.4的版本,在初始化后deactivate conda环境应该足够了,因此添加

conda deactivate

正确的下面

# <<< conda initialize <<<

我在conda 4.6中添加了类似的代码块。在我的例子中,有一个conda配置设置来禁用自动基础激活:

conda config --set auto_activate_base false

第一次运行它时,它将在您的主目录中创建一个.condarc,并使用该设置来覆盖默认设置。

这不会使您的.bash_profile变得杂乱,但它是一个更干净的解决方案,无需手动编辑conda管理的部分。

这可能是最近发现的水蟒的虫子。对我有用的方法:

step1: vim /anaconda/bin/activate,它显示:

 #!/bin/sh
_CONDA_ROOT="/anaconda"
# Copyright (C) 2012 Anaconda, Inc
# SPDX-License-Identifier: BSD-3-Clause
\. "$_CONDA_ROOT/etc/profile.d/conda.sh" || return $?
conda activate "$@"

step2:注释掉最后一行:# conda activate "$@"

关闭终端中conda base环境的自动激活。

conda config --set auto_activate_base false

激活conda基础环境:

conda activate

conda 4.6之后,有3种方法来实现这一点。(最后一种方法优先级最高。)

  1. 使用子命令conda config修改设置。

    conda config --set auto_activate_base false
    
  2. 实际上,前面的conda config子命令正在改变配置文件.condarc。我们可以直接修改.condarc。将以下内容添加到主目录下的.condarc中,

    # auto_activate_base (bool)
    #   Automatically activate the base environment during shell
    #   initialization. for `conda init`
    auto_activate_base: false
    
  3. 在shell的init文件中设置环境变量CONDA_AUTO_ACTIVATE_BASE。(.bashrc为bash, .zshrc为zsh)

    export CONDA_AUTO_ACTIVATE_BASE=false
    

    要将基于condarc文件的配置参数名称转换为环境变量参数名称,请将名称全部设置为大写字母预谋 CONDA_。例如,conda的always_yes配置参数可以使用CONDA_ALWAYS_YES环境变量指定。

    环境设置优先考虑与相应的设置在.condarc文件。

参考文献

如果你手动管理你的.bashrc,喜欢保持简单,你真正需要的是:

. "$HOME/anaconda2/etc/profile.d/conda.sh"

看到# EYZ0。

这将使conda命令可用,而无需激活基本环境(也无需读取conda配置)。

请注意,这(当然)与使用conda init管理conda安装不兼容,但除此之外,它没有任何不好的地方。与conda init生成的代码相比,您甚至可能体验到显著的加速,因为这个解决方案避免调用conda来解析您的配置文件,以确定是否启用基本环境等。

最好也保留if/fi行,以避免在几个可能没有安装conda的系统上使用相同的bashrc时出现错误消息:

if [ -f "$HOME/anaconda2/etc/profile.d/conda.sh" ]; then
. "$HOME/anaconda2/etc/profile.d/conda.sh"
fi

最后,如果你在几个系统之间共享bashrc,而conda可能安装在不同的路径上,你可以这样做:

for CONDA_PREFIX in \
"$HOME/anaconda2" \
"$HOME/miniconda3" \
"/opt/miniconda3" \
do
if [ -f "$CONDA_PREFIX/etc/profile.d/conda.sh" ]; then
. "$CONDA_PREFIX/etc/profile.d/conda.sh"
break
fi
done

当然,与conda init生成的代码相比,这段代码的长度是相似的,但仍然会执行得更快,对于在不同系统之间同步.bashrc的用户来说,这段代码可能比conda init更好。

有一件事没有指出,如果你只是想从Conda (Python)的脚本目录(正如@DryLabRebel想要的那样)运行应用程序,没有活动环境和激活基础环境之间几乎没有区别。

你可以通过conda安装和卸载,conda显示基本环境为活动状态——本质上是:

> echo $Env:CONDA_DEFAULT_ENV
> conda env list
# conda environments:
#
base                  *  F:\scoop\apps\miniconda3\current


> conda activate
> echo $Env:CONDA_DEFAULT_ENV
base
> conda env list
# conda environments:
#
base                  *  F:\scoop\apps\miniconda3\current

对于conda 4.12.0(在WOS下)以下工作(其中所有之前的答案-这些包括-没有做的把戏):
在你的activate.bat文件(我的是在~ / / activate.bat miniconda3 /脚本),改变行:

@REM This may work if there are spaces in anything in %*
@CALL "%~dp0..\condabin\conda.bat" activate %*

@REM This may work if there are spaces in anything in %*
@CALL "%~dp0..\condabin\conda.bat" deactivate

这个行更改/修改在(激活.bat文件的)section中不起作用:

@if "%_args1_first%"=="+" if NOT "%_args1_last%"=="+" (
@CALL "%~dp0..\condabin\conda.bat" activate
@GOTO :End
)

可能是因为这取决于你的miniconda3 (Anaconda Prompt)可执行文件是如何设置的:%windir%\System32\cmd.exe "/K" some-path-to\miniconda3\Scripts\activate.bat some-path-to\miniconda3(在我的情况下).

警告:更新conda覆盖这个(激活.bat)文件;因此,必须根据需要/更新多次修改上面的行。要我说,这也不是什么大问题。