ChatGPT解决这个技术问题 Extra ChatGPT

How do I prevent Conda from activating the base environment by default?

I recently installed anaconda2 on my Mac. By default Conda is configured to activate the base environment when I open a fresh terminal session.

I want access to the Conda commands (i.e. I want the path to Conda added to my $PATH which Conda does when initialised so that's fine).

However I don't ordinarily program in python, and I don't want Conda to activate the base environment by default.

When first executing conda init from the prompt, Conda adds the following to my .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 <<<

If I comment out the whole block, then I can't activate any Conda environments.

I tried to comment out the whole block except for

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

But then when I started a new session and tried to activate an environment, I got this error message:

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

This question (and others like it) are helpful, but doesn't ultimately answer my question and is more suited for linux users.

To be clear, I'm not asking to remove the (base) from my $PS1 I'm asking for Conda not to activate base when I open a terminal session.

Have you tried to use source activate instead? aka "the oldschool method"
this question is so useful that should be in the anaconda documentation IMO
@fabiob Some of the comments in the accepted answer explain where the information can be found. In my opinion it should be one of the first things you learn in the tutorial. Beginners shouldn't have to go pouring over the documentation for such a simple and, evidently, extremely common request.

m
mareoraft

I have conda 4.6 with a similar block of code that was added by conda. In my case, there's a conda configuration setting to disable the automatic base activation:

conda config --set auto_activate_base false

The first time you run it, it'll create a .condarc in your home directory with that setting to override the default.

This wouldn't de-clutter your .bash_profile but it's a cleaner solution without manual editing that section that conda manages.


Great. Where'd you find out about the setting? Because I don't remember reading it anywhere in the introductory tutorials?
@DryLabRebel It's not mentioned in any Release Notes, but you can find it described in the configuration options by running conda config --describe. Searching the codebase for "auto_activate_base" appears to show Conda v4.6.0 is the introduction.
Oops, missed your question. Sorry! @merv is correct in that it's in the config. I was looking at different options for a different issue and saw that option.
@DryLabRebel After installer initialized Anaconda, it prints out: If you'd prefer that conda's base environment not be activated on startup, set the auto_activate_base parameter to false: conda config --set auto_activate_base false Thank you for installing Anaconda3!
Thanks so much for this answer. IMO this should be the default behavior. For those with Linux who may be wondering if they should follow the linked Linux question, just follow this it seems to work regardless of OS (Linux Mint here)
S
Simba

There're 3 ways to achieve this after conda 4.6. (The last method has the highest priority.)

Use sub-command conda config to change the setting. conda config --set auto_activate_base false In fact, the former conda config sub-command is changing configuration file .condarc. We can modify .condarc directly. Add following content into .condarc under your home directory, # auto_activate_base (bool) # Automatically activate the base environment during shell # initialization. for `conda init` auto_activate_base: false Set environment variable CONDA_AUTO_ACTIVATE_BASE in the shell's init file. (.bashrc for bash, .zshrc for zsh) export CONDA_AUTO_ACTIVATE_BASE=false To convert from the condarc file-based configuration parameter name to the environment variable parameter name, make the name all uppercase and prepend CONDA_. For example, conda’s always_yes configuration parameter can be specified using a CONDA_ALWAYS_YES environment variable. The environment settings take precedence over corresponding settings in .condarc file.

References

The Conda Configuration Engine for Power Users

Using the .condarc conda configuration file

conda config --describe

Conda 4.6 Release


great answer. i use the env var method within scripts to control this behavior like so: export CONDA_AUTO_ACTIVATE_BASE=false; eval "$(conda shell.bash hook)"
I had to add export CONDA_AUTO_ACTIVATE_BASE=false to my .zshrc for option 3 to work.
I tried everything in this thread and nothing seemed to work until I closed and reopened VS Code. Don't forget to restart the application after changing the settings!
I have export CONDA_AUTO_ACTIVATE_BASE=false in my .bashrc and it doesn't make a difference
d
darthbith

The answer depends a little bit on the version of conda that you have installed. For versions of conda >= 4.4, it should be enough to deactivate the conda environment after the initialization, so add

conda deactivate

right underneath

# <<< conda initialize <<<

That should work, and should generalise. But I would prefer a solution that declutters my bash profile, rather than adds to it.
But if you manually edit that section, then conda can no longer automatically manage it. I would suggest just leaving it alone.
Note however, this means that in every terminal session you activate a Conda environment, then deactivate a Conda environment, which you wouldn't notice, but it's not the same as preventing a default activation.
This doesn't work, opening a new shell with the appended conda code in .zshrc i get pushed into the (base) envronment every time.
exactly as Merlin said, starting new terminal leads to have (base) again
k
kurianmat

To disable auto activation of conda base environment in terminal:

conda config --set auto_activate_base false

To activate conda base environment:

conda activate

Hey, This answer is correct, but is virtually identical to the accepted answer. My question is not concerned with activating condo, this is one of the first things you learn when going through the tutorials. Consider adding some helpful, relevant information not yet provided in the previous answers.
I was looking for how to manually activate after disabling auto. Thanks!
This helped. I was also looking for how to manually activate conda after disabling the auto-activate.
D
DryLabRebel

So in the end I found that if I commented out the Conda initialisation block like so:

# >>> 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 <<<

It works exactly how I want. That is, Conda is available to activate an environment if I want, but doesn't activate by default.


Unfortunately, if the block contents are managed by other scripts, as stated at the start of the code block, this change may get replaced or rolled back by other scripts.
@DryLabRebel - did you ever find a robust approach that removed the clutter from rc file ? I would be interested in this too, being able to just treat conda like other envs, rather than it cluttering things up
@baxx no I haven't. If you want the latest version of conda, and you want it to work, then you really need the initialisation commands.
ok cheers, i feel there might be a way around if you just install the conda env in the project dir, not in a centralised location. Not too sure yet
Here's what I don't understand: Why can't Conda change the shell settings on the fly (i.e. temporarily) when I call conda activate instead of forcing me to permanently change my shell environment? I mean, adding a path to $PATH is no problem but I certainly don't want Conda to change my $PS1.
M
Manuel F

for conda 4.12.0 (under WOS) the following worked (where all the previous answers -these included- didn't do the trick):
in your activate.bat file (mine was at ~/miniconda3/Scripts/activate.bat), change the line:

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

into

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

this line chage/modification doesn't work in the section (of the activate.bat file):

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

maybe because it depends on how your miniconda3 (Anaconda Prompt) executable is set up: %windir%\System32\cmd.exe "/K" some-path-to\miniconda3\Scripts\activate.bat some-path-to\miniconda3 (in my case).

caveat: updating conda overwrites this (activate.bat) file; so one has to modify the above line as many times as needed/updated. not much of a deal-breaker if you ask me.


c
coldfix

If you manage your .bashrc manually and like to keep it simple, all you really need is:

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

See Recommended change to enable conda in your shell.

This will make the conda command available without activating the base environment (nor reading your conda config).

Note that this is (of course) not compatible with managing the conda installation with conda init, but other than that, nothing bad is coming from it. You may even experience a significant speedup compared to the conda init generated code, because this solution avoids calling conda to parse your config files on whether to enable the base environment, etc.

It's best to also keep the if/fi lines to avoid error messages if using the same bashrc on several systems where conda may not be installed:

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

Finally, if you share your bashrc between several systems where conda may be installed in different paths, you could do as follows:

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

Of course, this is now similar in length compared to the conda init generated code, but will still execute much faster, and will likely work better than conda init for users who synchronize their .bashrc between different systems.


If you want to keep your bashrc simple, you can remove all the conda init generated clutter, and keep only a single line The "clutter" which says !! Contents within this block are managed by 'conda init' !! ? What is the advantage of doing this instead of just changing the appropriate Conda setting/config option?
The advantage is cutting 11 lines of unneeded code from bashrc, and improves shell startup time by avoiding to call conda if not needed (conda is pretty slow and can easily add a second or more on the first start just for parsing a value from another config file that says that it shouldn't be activated anyway). Also, this makes your bashrc easier to read which may be relevant to some users.
By doing this, you will be breaking conda init which manages this automatically, modifying this section is a bad idea
The point of this answer is not to use conda init because the code it generates is slow and doesn't allow you to synchronize your .bashrc between different machines...
C
CcMango

This might be a bug of the recent anaconda. What works for me:

step1: vim /anaconda/bin/activate, it shows:

 #!/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: comment out the last line: # conda activate "$@"


T
Thorsten

One thing that hasn't been pointed out, is that there is little to no difference between not having an active environment and and activating the base environment, if you just want to run applications from Conda's (Python's) scripts directory (as @DryLabRebel wants).

You can install and uninstall via conda and conda shows the base environment as active - which essentially it is:

> 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

No, there is a lot of difference: when the conda base environment is activated, its bin directory (which includes a.o. python, pip, and a slew of smaller utilities) is added to the front of PATH, overriding whatever is the default on the system.
Seconded. Anaconda's default behavior is frustrating. I modify, and develop with/against my system python installation for a reason (many of my python scripts are part of the system, I want them to be available to all users, and I want to test them against the system python, not conda). It's a complete mess to have the Anaconda environment interposed by default.
M
Manideep Pullalachervu

I faced the same problem. Initially I deleted the .bash_profile but this is not the right way. After installing anaconda it is showing the instructions clearly for this problem. Please check the image for solution provided by Anaconda