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 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。
列出环境
查看所有环境:
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 环境管理就没什么难度了。