Skip to content

conda

conda是一个跨平台、语言无关的二进制包管理器。conda 的核心理念是环境(environments)是一等公民,我们可以在多个独立的环境中隔离包。

conda 并不是虚拟环境,而是一个包管理工具

安装

conda 是anaconda的一部分,anaconda 包含了 250 多个用于数据分析、机器学习的包,不过他是商业软件。anaconda 剥离了其中的包管理工具就是conda并将其开源还提供了 conda 最小环境的安装工具miniconda

安装 conda 最简单的方式就是通过 miniconda 来安装,我们可以到miniconda 官方源下载他。他提供了 exe(windows) 以及 sh(类Unix) 两种安装方式:

Bash
curl -fLo miniconda3.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod 755 ./miniconda3.sh
./miniconda3.sh

之后会询问一些问题,然后会安装他们到 $HOME/miniconda3 目录下。推荐更改一下,例如 $HOME/.conda 目录下。

安装完成后重启 shell 能够在命令行看到 (base) 字样说明安装完成。 他会在 .bashrc 或其他 shell 脚本中添加一些运行脚本,其中会运行 bash.sh 脚本以及将 $CONDA_PREFIX/bin 添加到 PATH 中。

$CONDA_PREFIX 环境变量是当前活动环境所在路径,他会随着激活环境的不同而改变

默认启动环境

默认会自动激活 base 环境,可以通过 conda config --set auto_activate_base false 来取消这个行为,还有通常不建议使用 base 环境,他其中包含了一些 conda 命令依赖的包(例如著名的 requests),如果你修改了 base 环境的包可能会导致 conda 异常。因此通常不要在 base 环境中安装其他包。

可以在 .bashrc 中添加 conda activate <ENVIRONMENT_NAME> 来更改默认激活的环境,命名可以以 py311 这样的方式。

更新

conda 本身也是一个 conda 包,我们可以通过它来更新自己:

Bash
conda update conda

可能会出现问题,因此应当尽可能从新的 exe 或 sh 中安装

配置

conda 会在以下路径搜索配置文件 .condarc:

  • system: /etc/conda/.condarc
  • user: $XDG_CONFIG_HOME/conda/.condarc or $HOME/.condarc
  • local: $CONDA_PREFIX/.condarc

默认情况下这些文件都不存在,他会在首次运行conda config时创建~/.condarc文件。例如:

Bash
conda config --add channels conda-forge

.condarc 文件是 yaml 格式的,上面的语句生成的 yaml 字符串为:

YAML
channels:
  - conda-forge
  - defaults

可以使用 conda config --describe 获取所有可用的选项说明

设置 channels

conda 使用 channels 来管理软件源,默认包含一个 defaults 他指向: https://repo.anaconda.com/pkgs/mainpkgs/r。windows 中还包含 pkgs/msys2

default 包含了 anaconda 官方维护的所有包,但很多 pip 的包并不在官方包里面。不过社区维护一个conda-forge channel,我们可以手动安装他们:

Bash
conda config --add channels conda-forge

https://anaconda.org 是一个托管平台允许用户上传开源包

配置国内镜像

清华源提供了 anaconda 的镜像,只需要在 $HOME/.condarc 中写入:

YAML
channels:
  - defaults
show_channel_urls: true
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  deepmodeling: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/

之后还需要conda clean -i 来清理下换成确保用的是镜像站点。

安装默认包

可配置在创建新环境时自动安装一些包:

YAML
create_default_packages:
  - pip
  - ipython
  - scipy=0.15.0

环境管理

环境(environments)是 conda 中的一等公民。使用 conda 可用创建、导出、列出、删除、更新以及激活环境:

Bash
########### 创建环境 #####################
# -n/--name venv_name 指定环境名
# package 是要安装的包,可用使用 pyton=3.9 来安装指定包
# 如果是 conda 环境外需要使用 conda env 来创建
conda [env] create [options] -n venv_name [pacage ...]
# 可用的配置项
# --clone venv_name  克隆现有环境
# --file requirements.txt  指定依赖文件自动安装其中的软件包
# -c/--channel channel_name 指定搜索包的通道
# --no-default-packages  不使用 create_default_packages 配置

########## 导出环境 #################
# 导出 venv_name 到指定文件
# 如果不指定 -n 使用当前环境,如果不指定 -f 输出到 stdout
conda env export [-n/--name venv_name] [-f/--file file/to/path]

########## 列出所有环境 #################
conda env list
# conda environments:
#
base                  *  /home/yangguodong/.conda

########## 删除环境 #################
# 删除指定环境,注意必须先停用他才能够删除
conda env remove -n venv_name

########## 更新环境 #################
# 基于环境文件更新环境
# --prune 会删除环境文件中没有定义的包
# 环境文件由 conda env export 导出
conda env update [-n/--name venv_name] [--prune] -f env_file

########## 激活/分离环境 #################
# 激活环境
conda activate venv_name
# 分离环境
conda deactivate

分享环境信息

有三种方式分享环境信息:

  1. pip freeze > requirements.txt: python 标准方式
  2. conda list --explicit: conda 标准方式
  3. conda env export -f env.yaml: 分享环境(包含更多内容)

包管理

包管理无外乎就是查找、安装、卸载和更新:

Bash
########### 查找包 #####################
# -c 指定搜索的 channel
conda search package_name [-c/--channel channel]

########### 安装包 #####################
# 可以指定 package_name=x.x 可以包含 x.*
conda install package_name [-c/--channel channel]

########### 删除包 #####################
conda remove package_name

########### 更新包 #####################
conda update package_name

########### 列出所有包 #####################
conda list