What are the differences between "conda env export -> environment.yml" and "conda list -> spec.txt"? And which is better? - anaconda

conda env export -> environment.yml
conda list -> spec-file.txt (All produce raw text. File names seems to be convention)
The document is a little bit confusing. It seems that the only differences are:
environment.yml has name and channel fields;
Their respective "restoration" command: conda env create -f environment.yml... vs conda create -f spec.txt....

Related

Export miniconda2's environments to miniconda3

I used miniconda2 but I had to upgrade to miniconda3. However, how can export miniconda2's environments to miniconda3?
Thank you in advance,
UPDATE
I found here the below script:
for env in $(conda env list | cut -d" " -f1); do
if [[ ${env:0:1} == "#" ]] ; then continue; fi;
conda env export -n $env > ${env}.yml
done
It only picks up the new miniconda3 environments and not the old miniconda2 which are located in a different folder.
> ls -1 /work/miniconda2/envs/
3d-dna
abyss
afterqc
busco4
...
(base)> conda activate /work//miniconda2/envs/busco4
(busco4)>
How can I modify the above script to export from miniconda2 folder?
I'm having a hard time finding a conda YML file that's that old. There's no foolproof way that I'm aware of but here is a way that should satisfice the solution.
Note: This is for linux or mac; you can use findstr for Windows. Or PowerShell.
From your environment:
conda env export --from-history | grep -v "prefix" > your_environment_name.yml
You can view the contents with cat environment.yml. This gives you the libraries -- but not the dependencies -- and no version numbers for anything. I did that because sometimes a dependent library will get dropped for some reason or another. You may need to modify this with the new version of python you want.
I think this works better than conda env export | cut -f 1 -d '=' | grep -v ^prefix because, again, sometimes a dependency will get dropped.
From there
conda env create -f your_environment_name.yml -p /home/user/anaconda3/envs/your_environment_name
An alternative approach here is to add the previous Miniconda2 package cache (/work/miniconda2/pkgs) and environments directory (/work/miniconda2/envs) to the pkgs_dirs and envs_dirs Conda configuration settings. That way you can simply continuing having them available without having to archive and recreate. There are some details in this answer.
You may need to add back the Miniconda3 locations after this if you would like them to continue to be defaults.
Also, because you installed multiple copies of Conda, you should probably check your ~/.bashrc (and/or ~/.bash_profile) file to remove any previous sections from conda init left by the other version.

How to remove multiple conda environments using one command line

I know that the following command can be used to remove one specific anaconda environment:
$ conda env remove -n env_name
But, is there any way I can specify multiple anaconda environment names in the above command line?

How to test if a conda environmnt exists and matches the contents of a yml environment file in shell

I am running some bash scripts that submit sbatch scripts after doing some stuff and I want to check if the conda environment requierd for the tools in the sbatch script to work exists and then that this named conda environment matches the contents of a conda environment yml file.
So essentially this:
test ! -d ~/miniconda3/envs/fungal-hybrid-assembly || echo "Conda environment does not exist. Initialising conda environment......" && conda create fungal-hybrid-assembly.yml
But testing that the fungal-hybrid-assembly environment actually contains the correct packages rather than it just existing.

Specify conda env in project folder

I want to dynamically store in the project directory, how can I do that?
I have searching and found this Can I choose where my conda environment is stored? but this not dynamically store my conda environment to the project directory like virtualenv do
Use --prefix, -p for conda create instead of --name, -n.
$ conda create --help
...
Target Environment Specification:
-n ENVIRONMENT, --name ENVIRONMENT
Name of environment.
-p PATH, --prefix PATH
Full path to environment location (i.e. prefix).
...
Usage
conda create -p ./venv python=3.6
conda env list
# activate the local environment with relative or absolute path
conda activate ./venv
conda deactivate
# remove the env
conda env remove -p ./venv
# or just delete the "venv" folder directly
Note: When you set a specific path for your environment with -p, -n is not allowed, which means you cannot give the env a name in this case. You have to operate this kind of envs with their paths.

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.
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.
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
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 <<<
To disable auto activation of conda base environment in terminal:
conda config --set auto_activate_base false
To activate conda base environment:
conda activate
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.
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.
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.
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 "$#"
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

Resources