Anaconda 是一个用于科学计算的开源 Python 发行版,集成了包和虚拟环境管理器,包括了很多数据科学中常用的包,特别适合数据科学和机器学习。 与之类似的还有 Miniconda,它和 Anaconda 的主要区别就是:Miniconda在安装时并没有附带很多科学计算常用的包,在使用时需要手动下载。除了安装包的大小不同,在实际使用中其实没什么区别。

安装

Anaconda的下载和安装都非常简单,只需要按照官网上的步骤进行即可。 实践中可以选择安装Miniconda而非Anaconda,安装包的体积会小很多。

Miniconda 安装(Windows)

直接下载安装程序,确定安装即可,注意修改一下安装位置。

安装程序可能会提示是否修改环境变量,可以确定,也可以稍后手动进行,我们需要将一些路径到PATH中,例如

1
2
3
D:/miniconda3
D:/miniconda3/Scripts
D:/miniconda3/Library/bin

因为Miniconda里面可能有各种乱七八糟的包和软件,为了避免潜在的版本冲突(比如覆盖了其它在外部单独安装的软件),建议将这几个路径添加在靠后的位置。

Miniconda 安装(Linux)

记录一下在Linux中安装Miniconda的过程(官网文档)

  • 在家目录下创建目录

    1
    mkdir -p ~/miniconda3

  • 下载离线安装脚本(大概几百M)

    1
    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh

  • 执行安装

    1
    bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3

  • 删除安装脚本

    1
    rm ~/miniconda3/miniconda.sh

Anaconda 安装(Linux)

记录一下在Linux中安装Anaconda的过程

  • 下载离线安装脚本,大约1个G(具体版本可能会有所不同)

    1
    wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh

  • 执行安装

    1
    bash Anaconda3-2024.06-1-Linux-x86_64.sh

  • 删除安装脚本

    1
    rm Anaconda3-2024.06-1-Linux-x86_64.sh

在安装过程中需要选择安装位置,默认是当前用户的家目录下,将其修改为/opt/anaconda3即可。

安装脚本可能会提示自动进行conda init,可以确定,也可以稍后手动进行。

基本配置

安装完成之后,需要在shell(bash,fish,pwsh等)使用conda init命令,这个命令会自动在shell的启动脚本中添加一段配置,大致内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/path/to/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/path/to/anaconda3/etc/profile.d/conda.sh" ]; then
. "/path/to/anaconda3/etc/profile.d/conda.sh"
else
export PATH="/path/to/anaconda3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<

如果直接执行conda init报错找不到conda,可以使用conda的完整路径来执行,例如

1
2
3
~/miniconda3/condabin/conda init bash

/opt/anaconda3/condabin/conda init bash

执行conda init之后,重新加载配置文件(source ~/.bashrc)或者退出shell重新进入,即可实现在shell中自动激活conda环境, 此时在命令行中通常会显示(base),这代表默认的base环境。

使用下面的命令可以查看conda现有的完整配置

1
conda config --show

通常我们不希望自动激活虚拟环境,可以使用下面的命令关闭自动激活行为

1
conda config --set auto_activate_base False

如果网络环境不够好,可以添加国内的镜像,例如

1
2
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/

这两个配置实际会存储在用户家目录下的配置文件~/.condarc中,内容大致为

1
2
3
4
5
auto_activate_base: false
channels:
- https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
- https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
- defaults

在配置完成之后,由于Miniconda默认不包含很多常用的库,有必要提前进行下载,例如:

  • numpy
  • matplotlib
  • scipy
  • sympy
  • pandas
  • jupyter notebook

常用操作

下面这些操作对于Anaconda和Miniconda没有区别。

环境管理

默认情况下,conda会自动创建一个名为base的基础环境,我们也可以创建其它的虚拟环境,在新的环境中可以指定python版本。

1
conda create --name myenv python=3.8

可以通过克隆已有的环境来创建新的环境

1
conda create --name myenv2 --clone myenv

列出当前的所有虚拟环境

1
conda env list

删除虚拟环境的所有包和虚拟环境自身

1
conda remove --name myenv --all

查看当前环境的信息

1
conda info

环境切换

激活指定的虚拟环境(缺省环境名时会自动激活base环境)

1
conda activate myenv

退出虚拟环境

1
conda deactivate

conda会通过修改PATH环境变量以及一些CONDA_开头的环境变量来实现不同环境的切换, 这使得在不同环境中使用python命令会指向不同目录下的文件,下面是Windows下的例子

1
2
(base) D:/anaconda3/python.exe
(myenv) D:/anaconda3/envs/myenv/python.exe

除了先执行conda init,再执行conda activate,也可以使用下面的方式进行一次性的配置和环境激活,这对于通过脚本执行的情况很有用

1
source /opt/anaconda3/etc/profile.d/conda.sh && conda activate base

包管理

下面的操作都是在具体的虚拟环境中进行的,操作并不会影响到其他虚拟环境。

列出(当前环境中)已安装的包

1
conda list

在conda仓库中查找包

1
conda search package_name

安装包(可以指定包的版本)

1
2
conda install package_name
conda install package_name=1.2.3

更新包

1
2
conda update package_name
conda update --all

非常有趣的是,conda updateconda upgrade是完全一样的。

卸载包

1
conda remove package_name

使用conda removeconda uninstall是完全一样的。

清理当前环境中的缓存,以及不再需要的文件和包

1
conda clean --all

环境迁移

下面提供两种虚拟环境迁移的方法。

第一种方法,通过如下方式导出包列表

1
conda list --explicit > spec-list.txt

其中的内容大致为

1
2
3
4
5
6
7
8
# This file may be used to create an environment using:
# $ conda create --name <env> --file <this file>
# platform: win-64
@EXPLICIT
https://repo.anaconda.com/pkgs/main/win-64/blas-1.0-mkl.conda
https://repo.anaconda.com/pkgs/main/win-64/ca-certificates-2024.7.2-haa95532_0.conda
https://repo.anaconda.com/pkgs/main/win-64/icc_rt-2022.1.0-h6049295_2.conda
...

然后在别的计算机中可以通过 spec-list.txt 文件创建环境

1
conda create --name newenv --file spec-list.txt

第二种方法,通过如下方式导出环境信息

1
conda env export > environment.yml

其中的内容大致为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
name: base
channels:
- defaults
dependencies:
- altgraph=0.17.3=py312haa95532_0
- anyio=4.2.0=py312haa95532_0

...

- zstd=1.5.5=hd43e919_0
- pip:
- dukpy==0.4.0
- mutf8==1.0.6
- you-get==0.4.1718
prefix: D:/anaconda3

然后在别的计算机中可以通过 environment.yml 文件创建环境

1
conda env create -f environment.yml

两种方式有如下区别:

  • 第一种方式导出的信息是和平台(操作系统)相关的,因此不能在不同的平台之间迁移;第二种方式则可以跨平台迁移。
  • 第一种方式得到的信息更精确,可以精确复刻虚拟环境;第二种方式得到的信息则比较粗略,因为考虑到不同平台上可能存在的差异。

这两种方式都只是导出了一个信息列表,因此还需要在目标平台上进行联网下载和安装; 除此之外,Conda-pack也是一种环境迁移的方式,并且它是包括二进制文件的,大致相当于直接打包,因此显然需要保证二进制文件在目标平台可以顺利运行。

conda底层细节

conda在管理虚拟环境的过程中,实际上除了修改PATH环境变量,还会控制如下几个特殊的环境变量:

  • CONDA_DEFAULT_ENV:表示当前激活的 conda 环境的名称
  • CONDA_EXE:指向 conda 可执行文件的完整路径
  • CONDA_PREFIX:执行当前激活的 conda 环境的路径
  • CONDA_PROMPT_MODIFIER:用于修改命令行提示符的环境变量,通常是环境的名称加括号,例如(base),并且会出现在命令行提示符的前面
  • CONDA_PYTHON_EXE:指向当前 conda 环境中 Python 解释器的路径
  • CONDA_SHLVL:表示当前激活的 conda 环境的层级(没有激活是为0,激活后变成1,允许嵌套激活)

这些变量都是由conda管理的,也会影响conda和其它工具的行为。

对于Python自身来说,实际的运行也会涉及到一些PYTHON开头的环境变量,例如PYTHONPATH

可以使用如下方法查看当前的所有CONDA开头的环境变量

1
2
3
4
5
# powershell
Get-ChildItem Env: | Where-Object { $_.Name -like "CONDA*" }

# bash
env | grep '^CONDA'

例如在完成conda init配置后,登陆shell时的默认情况通常为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Windows(powershell)
CONDA_DEFAULT_ENV base
CONDA_EXE D:\miniconda3\Scripts\conda.exe
CONDA_PREFIX D:\miniconda3
CONDA_PROMPT_MODIFIER (base)
CONDA_PYTHON_EXE D:\miniconda3\python.exe
CONDA_SHLVL 1

# Linux(bash)
CONDA_EXE=/home/fenglielie/miniconda3/bin/conda
CONDA_PREFIX=/home/fenglielie/miniconda3
CONDA_PROMPT_MODIFIER=(base)
CONDA_SHLVL=1
CONDA_PYTHON_EXE=/home/fenglielie/miniconda3/bin/python
CONDA_DEFAULT_ENV=base

在完成conda init配置,并设置conda不自动激活环境时,登陆shell时的默认情况通常为

1
2
3
4
5
6
7
8
# Windows(powershell)
CONDA_EXE D:\miniconda3\Scripts\conda.exe
CONDA_PROMPT_MODIFIER False

# Linux(bash)
CONDA_EXE=/home/fenglielie/miniconda3/bin/conda
CONDA_SHLVL=0
CONDA_PYTHON_EXE=/home/fenglielie/miniconda3/bin/python

这里Windows(powershell)和Linux(bash)的表现略有不同。手动激活环境后,环境变量就会变得和上面的状态一致。