Conda 环境管理

Conda 的环境管理是日常用得最频繁的功能。说白了,环境就是一套独立的 Python 解释器 + 包集合。每个环境互不干扰,一个项目一个环境,这是可重复计算的基础。

我刚开始用 Conda 时觉得“环境”这个概念多此一举。直到有一天,我在同一个 base 环境里装了 TensorFlow 1.x 和 2.x,结果两个版本打架,代码跑了一整天全报错……从那以后,我彻底成了“环境隔离党”。

创建环境

创建环境的命令长这样:

conda create --name myenv python=3.9

--name 后面跟环境名,你也可以用 -n 缩写。指定 Python 版本不是必须的,但我建议每次都显式写上。为什么?因为不写的话,Conda 会用当前 base 的 Python 版本,万一 base 是 3.12,你的项目却只能跑 3.8,那就会出问题。

创建时还能顺便装几个包:

conda create -n myenv python=3.9 numpy pandas matplotlib
我个人习惯在创建环境时就把项目需要的主要包写进去。这样一条命令搞定,省得后面一次次 conda install。

如果要基于已有环境创建新环境(比如复制一份做实验):

conda create --name myenv_clone --clone myenv

注意:--clone 会把旧环境的所有包和版本信息完整复制过来,速度比较慢。适合做备份。

激活与退出环境

激活环境在不同系统上命令不一样。Windows 下:

conda activate myenv

Linux / macOS 下:

conda activate myenv

嗯,你没看错,现在 Conda 4.6+ 之后跨平台统一了。早期版本 Linux 上得用 source activate myenv,不过新版本已经不用了。如果你还在用旧版,赶紧升级:conda update conda。

激活后,命令行前面会出现环境名:

(myenv) user@host:~$

退出环境:

conda deactivate

一次 deactivate 退一层。如果你在 myenv 里又激活了子环境,需要退两次才能回到 base。

我曾经犯过一个错误:在 base 环境里直接 conda deactivate,结果整个 conda 的 shell 扩展失效了。后来发现 base 不能 deactivate,只能关终端。

列出环境

查看所有环境:

conda env list

输出示例:

# conda environments:
#
base                  *  /opt/anaconda3
myenv                    /opt/anaconda3/envs/myenv
myenv2                   /opt/anaconda3/envs/myenv2

带 * 的是当前激活的环境。你也可以用 conda info --envs,效果一样。

如果你只想看环境安装的包,可以用:

conda list -n myenv

删除环境

删环境很简单:

conda env remove --name myenv

或者用 -n 缩写:

conda env remove -n myenv
删除前确认你已经不再需要这个环境,或者已经用 conda env export > environment.yml 做了备份。因为删除后不可恢复。

如果你想把环境从磁盘上彻底清理掉(包括缓存):

conda clean --all -y

但注意,conda clean 是全局清理,不是只清某个环境。我一般只在磁盘空间不够时才跑。

常用命令速查

操作 命令 说明
创建环境 conda create -n env_name python=3.9 可同时指定包
克隆环境 conda create -n new --clone old 复制全部包
激活环境 conda activate env_name 跨平台统一
退出环境 conda deactivate 一次退一层
列出环境 conda env list 带 * 当前环境
删除环境 conda env remove -n env_name 不可恢复
导出环境 conda env export -n env_name > env.yml 用于复现

避坑指南

  • 环境名不要用特殊字符:我用过一次 my-env(连字符),结果激活时 shell 把连字符当成减号,报错。建议只用字母、数字和下划线。
  • 激活失败怎么办?:先 conda init 初始化 shell,然后重新打开终端。如果还不行,检查 ~/.bashrc 或 ~/.zshrc 里有没有 conda 的初始化代码。
  • 删除 base 环境?:千万别试。base 是 Conda 自身所在的环境,删掉后连 conda 命令都没了。我亲眼看到同事 rm -rf 了 base,然后重装整台机器……
  • 环境太多怎么管理?:我习惯在项目根目录放一个 environment.yml,这样别人克隆项目后一条命令就能重建环境。具体用法后面章节会讲。
你可以用 conda rename -n old_name new_name 来重命名环境,省去克隆再删除的麻烦。

最后,用一张图总结 Conda 环境管理的完整流程:

Conda环境管理生命周期 Conda环境管理流程图 创建环境 激活环境 使用环境(运行代码) 退出环境 列出环境 删除环境 环境可并列,互不干扰

你想想看,这个流程是不是很直观?创建 -> 激活 -> 使用 -> 退出,然后根据情况选择列出或删除。把这个流程记熟了,Conda 环境管理就没什么难度了。