Python笔记:Conda常用命令

conda 是个复杂的 Python 版本管理隔离工具,这里我只是简单介绍一些 Conda 的常用命令,详细请参考:命令 — conda 24.7.1 文档

管理conda

1. 帮助指南

🛠️ 获取帮助

当我们不确定某个conda命令的具体用法时,可以通过添加-h--help参数来查看该命令的使用说明:

1
2
3
conda [order_name] -h
conda [order_name] --help
conda create --help # Example: show <create> usage

🔍 信息查询

当我们想要了解Conda本身或环境的基本信息时,可以使用conda info命令。该命令也支持添加参数以获取更准确的输出:

1
conda info		# Example: show .condarc

conda info常用查询参数:

查询参数 功能
--envs 列出当前用户已知的Conda环境
--system 显示系统级环境变量信息

此外,Conda也支持查询所有Python环境的相关信息(如果以管理员身份运行,Conda会查询全部用户的所有Python环境):

1
conda search --envs

2. 配置概述

Conda有两种管理配置信息的方式,一种是通过conda config指令管理,另一种是通过编辑.condarc文件管理。值得一提的是.xxxrc在计算机领域很常见,rcResource Configuration的缩写,通常用作存储应用程序命令行工具的用户偏好设置和配置选项,例如:.npmrc.nvmrc

⚙ 使用conda config命令配置

查看Conda环境配置的方法有两种:一种是--show,该命令只会查询字段的当前配置 ;另一种是--get,该命令可以查看对该字段进行变更的指令记录

1
2
3
4
5
6
7
8
9
10
# Show all config
conda config --show

# Show [field_name] config
conda config --show [field_name]
conda config --get [field_name]

# Example: check channels config
conda config --show channels
conda condig --get channels

查看Conda环境配置字段的含义以及当前配置

1
2
3
4
conda config --describe [field_name]

# Example: show channels describe
conda config --describe channels

管理Conda环境配置数据,需要注意的有:--add--prepend实现的效果是一样的;--add等操作是用于数组类型,而--set是用于值类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
conda config --append <Key> [Value]

# Next two order equals to each other
conda config --prepend <Key> [Value]
conda config --add <Key> [Value]

const config --set <Key> [Value]

# Useful for '--add' and '--set'
conda config --remove <Key> [Value]
conda config --remove-key <Key> [Value]

# Example: add mirror-source to channels
conda config --add channels [source_url]

# # Result:
# # channels:
# # - [source_url]


# Example: add conda-forge to custom_channels
conda config --set custom_channels.conda-forge [source_url]

# # Result:
# # custom_channels:
# # conda-forge: [source_url]

📝 编辑.condarc文件

当我们使用conda info查看当前Conda的信息时,可以看见以下两个信息:

user config file populated config files
C:\Users\lzz\.condarc C:\Users\lzz\.condarc

其中populated config files是指当前Conda运行实例已加载的Conda配置信息我们可以编辑windows的环境变量,来实现加载项目目录中.condarc文件的目的。

1
2
set CONDARC=%CD%\.condarc		# Add condarc path
set CONDARC= # Remove condarc path

我们也可以根据Conda提供的.condarc查找策略来设置.condarc文件路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
if on_win:
SEARCH_PATH = (
"C:/ProgramData/conda/.condarc",
"C:/ProgramData/conda/condarc",
"C:/ProgramData/conda/condarc.d",
)
else:
SEARCH_PATH = (
"/etc/conda/.condarc",
"/etc/conda/condarc",
"/etc/conda/condarc.d/",
"/var/lib/conda/.condarc",
"/var/lib/conda/condarc",
"/var/lib/conda/condarc.d/",
)

SEARCH_PATH += (
"$CONDA_ROOT/.condarc",
"$CONDA_ROOT/condarc",
"$CONDA_ROOT/condarc.d/",
"$XDG_CONFIG_HOME/conda/.condarc",
"$XDG_CONFIG_HOME/conda/condarc",
"$XDG_CONFIG_HOME/conda/condarc.d/",
"~/.config/conda/.condarc",
"~/.config/conda/condarc",
"~/.config/conda/condarc.d/",
"~/.conda/.condarc",
"~/.conda/condarc",
"~/.conda/condarc.d/",
"~/.condarc",
"$CONDA_PREFIX/.condarc",
"$CONDA_PREFIX/condarc",
"$CONDA_PREFIX/condarc.d/",
"$CONDARC",
)

当有多个populated config files存在时,也就是Conda读入了多个.condarc文件时,Conda遵循以下优先策略:

  • 当配置值是数组或者列表时按优先级合并,若为原始值时保留到优先级高的配置;
  • .condarc优先级由低到高依次为:解析器的.condarc → $CONDARC 指定的.condarcconfig order参数 → 环境变量

当我们使用conda config编辑.condarc文件时,可以通过--system--env--file [file_name]来指定配置输出位置:

参数 功能
--system [默认选项] 输出到User Config FileC:\Users\lzz\.condarc)中
--env 输出到当前活动环境下的.condarc中,如果没有则同--system
--file [filename] 输出到指定.condarc文件中

3. 版本与更新

我们可以使用如下指令查看更新Conda版本。

1
2
3
4
5
6
7
8
9
# Check conda version
conda -V
conda --version

# Update conda
conda update conda

# Update Anaconda
conda update Anaconda

4. 通道配置

Conda官方的库提供的Python包较少,有时需要到第三方社区维护的Conda通道去找寻相关的Python包,例如:conda-forgebioconda 。故我们需要配置 default_channelscustom_channelsConda提供多个下载通道。

值得一提的是,在使用Conda管理的Python 项目也可以使用pip安装所需的包,但是这种conda installpip install混用的情况很容易导致库的依赖关系混乱。

🔗 设置官方通道及其镜像通道

我们打开.condarc后会发现Conda自动帮我们加入了channels: -default,而且官方通道的地址不是在.condarc中配置的,故我们只需要配置官方通道的镜像源即可。

我们可以直接在 channels 里面添加官方通道的镜像源:

1
conda config --add channels [channel_url]

也可以将官方通道的镜像源添加到 default_channels 里面,以便与conda-forge等第三方社区通道区分开来:

1
conda config --add default_channels [channel_url]

🧱 添加社区通道

使用第三方社区通道(如 conda-forge),我们需要配置channels: -[community_name]

1
2
3
4
conda config --add channels [community_name]

# Example: add conda-forge community channel
conda config --add channels conda-forge

对于第三方社区通道的地址,我们通常不用配置镜像源直接配置其地址即可。需要注意的是使用命令行工具添加配置的过程较为特殊,这里建议直接修改.condarc即可。可别忘了--add--set的区别。

1
2
3
4
5
conda config --set custom_channels.[community_name] [channel_url]

# Example: add conda-forge upon custom_channels
conda config --set custom_channels.conda-forge
http://mirrors.aliyun.com/anaconda/cloud

指定第三方社区通道下载包:

1
2
3
4
5
conda install [package_name] --channel [community_name]
conda install [package_name] -c [community_name]

# Example: use conda-forge install GDAL
conda install GDAL --channel conda-forge

🎯 优先级问题

关于 channels 的优先级问题,我们可以使用--describe去查看Conda官方的介绍。channels 中越靠前优先级越高,--prepend--append来控制 channel 的插入顺序。当Conda要下载东西的时候便会从优先级高的通道依次查找到优先级低的通道。

我们可以通过改变channel_priority配置来改变Conda下载策略:

  • flexible:只要在 所有通道 中找到了对应库便下载,不会引起 unsatisfiable error。在下载没有指定版本的包时,包版本高的优先。
  • strict:如果 高优先级通道 没有找到对应库便会报错。在下载没有指定版本的包时,通道优先级高的优先。
1
2
conda config --set channel_priority strict
conda config --set channel_priority flexible

⚙️ 其他通道配置

  • show_channel_urls:控制着Conda是否在执行操作(如搜索、安装或更新包)时显示通道的URL

  • channel_alias:通道别名,Conda会先在 channelscustom_channels 中进行匹配,如果没找到相对应的完整URL,则会根据 channel_alias 进行补全,其默认值如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    conda config --describe channel_alias

    # # Result:
    # # channel_alias (str)
    # # The prepended url location to associate with channel names.
    # #
    # # channel_alias: https://conda.anaconda.org

    conda install GDAL -c conda-forge

    # # Result:
    # # Equals toCondainstall GDAL -c
    # # https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge

📄 .condarc示例配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
channels:
- defaults
- conda-forge

show_channel_urls: true

# Conda-forge recommended
channel_priority: strict

default_channels:
- http://mirrors.aliyun.com/anaconda/pkgs/main
- http://mirrors.aliyun.com/anaconda/pkgs/r
- http://mirrors.aliyun.com/anaconda/pkgs/msys2

custom_channels:
conda-forge: http://mirrors.aliyun.com/anaconda/cloud
msys2: http://mirrors.aliyun.com/anaconda/cloud
bioconda: http://mirrors.aliyun.com/anaconda/cloud
menpo: http://mirrors.aliyun.com/anaconda/cloud
pytorch: http://mirrors.aliyun.com/anaconda/cloud
simpleitk: http://mirrors.aliyun.com/anaconda/cloud

5. 缓存相关

🗑️ conda clean命令

参数 说明
-i
--index-cache
删除索引缓存
-t--tarballs 删除缓存的软件包压缩包
-a--all 删除索引缓存、锁定文件、未使用的缓存软件包、压缩包和日志文件
-p
--packages
从可写软件包缓存中删除未使用的软件包(注意!此模式不会检查使用符号链接返回软件包缓存安装的软件包
-f
--force-pkgs-dirs
删除所有可写的软件包缓存,此选项未包含在--all注意!此模式将破坏使用符号链接返回软件包缓存安装软件包的环境

📂 设置包缓存文件夹

我们可以使用conda configpkg_dirs 添加包缓存目录。

1
conda config --add pkgs_dirs [package_cache_path]

我们分别使用config info--describe来查看该配置。可以发现Conda自带包缓存的文件夹。

1
2
3
4
5
6
7
8
9
10
11
12
13
conda info

# # Result:
# # package cache : D:\Software\Anaconda\pkgs
# # C:\Users\lzz\.conda\pkgs
# # C:\Users\lzz\AppData\Local\conda\conda\pkgs


conda config --describe pkgs_dirs

# # Result:
# # pkgs_dirs (sequence: primitive)
# # pkgs_dirs: []

我们可以使用conda clean清空 pkgs_dirs 里面的包缓存。

1
2
conda clean --f
conda clean --force-pkgs-dirs

管理环境

1. 查询环境

我们可以通过env或者info指令查看 conda environments

1
2
3
4
5
6
7
8
9
# Next three order equals ot each other
conda env list
conda info -e
conda info --envs

# # Result:
# # conda environments:
# # base D:\Software\Anaconda
# # geo D:\Software\Anaconda\envs\geo

2. 环境管理

🆕 创建环境

我们可以create指令创建一个全新的Python虚拟环境:

1
2
3
4
5
conda create [env_name]
conda create [env_name] [python] [packages]

# Example: create env with specifying python and packages
conda create geo python=3.8 matplotlib plot

也可以根据environment.yaml来还原一个环境:

1
2
3
4
conda env create --file [env_name].yml

# Example: create env by env.yaml
conda env create --file environment.yml

🗑️ 删除环境

remove指令可以用于删除环境,也可以用于删除指定环境中的包:

1
2
3
4
5
# Delete specified env and all packages in it
conda remove --name [env_name] --all

# Delete specified package in env
conda remove --name [env_name] [package_names]

💾 导出环境配置

env指令用于环境的导入导出,注意env.yml文件中已有虚拟环境名称:

1
2
3
4
5
6
7
8
9
# Get env.yml
conda env export --name [env_name] > [env_name].yml

# Create env by env.yml
conda env create --file [env_name].yml

# Example: export and create by env.yml
conda env export --name geo > env.yml
conda env create --file env.yml

🚀 使用环境

1
2
3
4
5
conda activate [env_name]

# Next two order equals to each other
conda activate
conda deactivate

3. 包管理

📄 查询包

Conda查询包有两个指令,一个是list,其用于查询已安装的包;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# For all environments
conda list

conda list --name [env_name]

# # Result:
# # packages in environment at D:\Software\Anaconda\envs\geo:
# # Name Version Build Channel
# # ca-certificates 2024.7.2 haa95532_0
# # libffi 3.4.4 hd77b12b_1


# Special attributes
conda list --explicit --name [env_name]
conda list --show-channel-urls --name [env_name]

list还有以下参数可选,用于查看包安装的详细信息:

参数 说明
--explicit 在输出时显示包的确切版本号
--show-channel-urls 在输出时显示包的来源URL

另一个是search,其用于在 channels 中查询指定包。请注意conda search还有个查询电脑上Python环境的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
conda search [package_name]

# Fuzzy search
conda search [package_name]*

conda search [package_name] --channel [channel_name]

# Special
conda search [package_name] --info

# # Result:
# # gdal 3.6.2 py39hf6e6a5b_2
# # -------------------------
# # file name : gdal-3.6.2-py39hf6e6a5b_2.conda
# # name : gdal
# # version : 3.6.2
# # build : py39hf6e6a5b_2
# # build number: 2
# # size : 1.8 MB
# # url : [url]
# # dependencies: [dependencies]

search还有以下参数可选,用于更好的查询包:

参数 说明
--channel 指定查询的通道
--limit 限定查询结果显示个数
--info 显示查询结果的详细信息

📥 安装包

我们使用conda install安装包,我们可以在安装的时候指定包的版本、查找的channel 。有些包的下载过程中需要我们在命令行输入Y--yes可以帮我们自动输入。

1
2
3
4
5
6
7
8
9
10
conda install [package_name]

conda install [package_name] --name [env_name]

# Specified attributes
conda install [package_name]=[version]
conda install [package_name] --channel [channel_name]

# Auto check yes
conda install [package_name] --yes

这里还需要补充在使用时需要注意的几个参数:

参数 说明
--force-reinstall 确保请求安装的包卸载并重新安装
--freeze-installed--no-update-deps 不要更新或更改已安装的依赖项

还需要注意的一点是:Conda只支持在官方通道和第三方社区通道安装包,如果要安装.wheel格式的包,请使用pip安装,这时候需要注意之前提到的环境污染问题。

🗑️ 卸载包

我们使用conda uninstall卸载包,需要注意conda uninstall默认同时删除包的依赖如果使用--force,则不会删除其依赖

1
2
3
4
5
6
7
8
9
10
conda uninstall [package_name]

conda uninstall [package_name] --name [env_name]

# Auto check yes
conda uninstall [package_name] --yes

# Maybe go into broken
conda uninstall [package_name] --force
conda uninstall [package_name] --force-remove

我们可以使用conda uninstall --help查看Conda--force的描述。不要轻易使用--force这会使我们的环境变得破碎不稳定

1
2
3
4
# # --force-remove, --force
# # Forces removal of a package without removing packages that depend on it.
# # Using this option will usually leave your environment in a broken and
# # inconsistent state.

♻️ 更新包

我们使用如下指令更新指定包到最新版本,如果要更新到指定版本,请使用功能更强大的conda install

1
conda update [package_name] --name [env_name]