2. Conda 基础环境管理:创建、激活、删除、克隆,环境列表查看

搞数据科学和 DevOps,Conda 环境管理是基本功。你想想看,一个项目用 Python 3.8 + TensorFlow 2.4,另一个项目要 Python 3.11 + PyTorch 2.0,如果没有隔离的工具,依赖冲突能让人崩溃。我最早用 pip 加 virtualenv,后来转到 Conda,发现它不仅能管 Python 包,连底层 C 库都能一并搞定——这一点在 Docker 镜像里特别关键。

这一章我们就把 Conda 最核心的五个操作讲透:创建、激活、删除、克隆、列表查看。别小看这些命令,我在多个项目里都吃过亏,比如不小心删错了环境,或者忘记激活环境直接 pip install 把 base 搞坏了。嗯,这里要注意一个个来。

2.1 环境创建:从零到有

创建环境的基本格式很简单:

conda create --name myenv python=3.9

这条命令会创建一个名叫 myenv 的环境,并安装 Python 3.9 以及它的核心依赖。如果你想一上来就装好常用的数据科学包,可以这样:

conda create --name ds_env python=3.10 numpy pandas scikit-learn matplotlib

为什么我建议你连 Python 版本一起指定?因为我遇到过不止一次,同事没指定 Python 版本,结果环境自动装了最新版(比如 Python 3.12),然后项目里的旧库报错。所以养成习惯——创建环境时指定 Python 版本,能省掉后边很多麻烦。

一个小技巧: 如果创建时不想弹确认提示,加 -y 参数。比如 conda create -n test_env python=3.9 -y。在 Dockerfile 里自动化构建时,这个标志特别有用。

另外,你还可以从 environment.yml 文件创建环境:

conda env create -f environment.yml

这在团队协作中很常见。文件内容大概长这样:

name: project_env
channels:
  - conda-forge
  - defaults
dependencies:
  - python=3.9
  - numpy>=1.21
  - pandas
  - scikit-learn

我个人习惯把 environment.yml 放在项目根目录,并纳入版本控制。这样任何人拉下代码,一个命令就能还原完全相同的环境。

2.2 环境激活与退出:你得进对屋子

创建完成后,要进入环境才能用。在 Linux/macOS 上:

conda activate myenv

在 Windows 上一样,前提是你已经 conda init 过。如果你用的是旧版 Conda,可能需要 source activate myenv。但我建议你升级到 Conda 4.6+,统一用 conda activate。

退出环境:

conda deactivate

嗯,这里有一个常见的坑:很多人以为 conda activate 之后,所有 pip install 都会自动装到当前环境里。其实没错,但你一定不要忘记先激活!我曾经有一次忘记激活,直接在 base 环境里 pip 安装了一个实验性库,结果把 base 里的包依赖搞坏了,最后不得不重装 Anaconda。所以我的习惯是:在终端里先看一眼 prompt 是不是显示 (myenv),确认再执行。

警告: 绝对不要在 base 环境里安装过多包。base 相当于系统环境,一旦污染,恢复成本很高。建议 base 保持干净,只装 conda 自身和必要工具。

2.3 环境列表查看:心里有数

随时想知道当前有哪些环境?

conda env list

或者简写:

conda info --envs

输出类似:

# conda environments:
#
base                  *  /opt/anaconda3
ds_env                   /opt/anaconda3/envs/ds_env
myenv                    /opt/anaconda3/envs/myenv
project_env              /opt/anaconda3/envs/project_env

带星号 (*) 的是当前激活的环境。你在 Docker 里构建镜像时,经常需要查看环境是否已存在,可以用这个命令做判断。我在 CI/CD 脚本里就写过类似逻辑:先检查环境列表,不存在才创建,避免每次构建重复耗时。

2.4 环境删除与清理:别留垃圾

废弃的环境要删掉,不然磁盘空间会悄悄被吃掉。删除命令:

conda remove --name myenv --all

注意 --all 表示删除整个环境,包括所有包。如果不加 --all,它只会移除环境名但不会删包目录,容易留下残留。我踩过这个坑:删了环境名但旧包还在 envs/ 下占用空间,后来手动 rm 才释放。所以请用 --all。

另外,如果你想删除当前激活的环境,得先 conda deactivate 退出,否则 Conda 会报错。我曾经在脚本里没处理这一步,导致自动化清理任务失败。

一键清理技巧: 有时你安装了多个版本的环境,可以用 conda clean --all 清理缓存和未使用的包。不过注意,这个命令会清理所有下载的包缓存,下次创建环境时要重新下载。建议在 Docker 构建的最后阶段执行,能显著缩小镜像层体积。

2.5 环境克隆:快速复制

当你有一个调好的环境,想基于它做变体时,克隆比重装快得多:

conda create --name new_env --clone old_env

这个命令会完全复制 old_env 里的所有包和配置到 new_env,包括 pip 安装的包。我经常在需要做 A/B 测试时用:先克隆一个环境,然后在克隆上改几个包版本,对比运行结果。

需要注意,克隆不会复制环境之外的东西,比如 Jupyter kernel 配置或系统级的环境变量。如果遇到克隆后某些包不能正常运行,检查一下是不是有硬编码路径的依赖。

还有一个用例:在 Docker 构建时,你可以先创建第一个环境,然后基于它克隆出不同 Python 版本的环境用于并行测试。比如:

conda create -n base_env python=3.9 numpy pandas -y
conda create -n py310_env --clone base_env -y
conda install -n py310_env python=3.10 -y

虽然这样会多一次 conda install,但比从零创建快很多,尤其是当基础包很大时(比如 tensorflow、pytorch)。

知识结构一览

下面这张图把五个核心操作串了起来,方便你记忆整个流程:

Conda 基础环境管理核心流程 创建环境 conda create -n myenv python=3.9 激活 / 退出 conda activate / conda deactivate 查看环境列表 conda env list / conda info --envs 克隆环境 conda create -n new --clone old 快速复制,适合A/B测试 删除环境 conda remove -n env --all 注意先 deactivate 再删除 💡 常用组合:创建 + 激活 + 装包 → 开发;克隆 + 改版本 → 测试; 删除 + 清理缓存 → 收缩 Docker 镜像层。五个命令循环即可覆盖日常。

实战中的注意事项

操作 常用命令 我的踩坑经验
创建 conda create -n myenv python=3.9 不指定 Python 版本,后面容易冲突
激活/退出 conda activate / conda deactivate 忘记激活就在 base 里装包,导致环境污染
列表查看 conda env list CI/CD 脚本里用来预检查,避免重复创建
克隆 conda create -n new --clone old 不会复制系统级配置,需要手动处理路径问题
删除 conda remove -n env --all 不加 --all 会残留文件,也不要在激活状态删除

总结一下:创建 → 激活 → 工作 → 退出一套流程很自然。需要变体就克隆,不用了就清理。我在维护一个多项目共存的开发者工作站时,就是靠这套原则——每个项目一个环境,命名遵循 项目名_日期 格式。当项目结束,环境一删,干干净净。

好了,这些基础操作熟练之后,下一层就是把这些环境「锁起来」,配合 Docker 实现可复现的部署。不过在进入锁定之前,先把这些命令练熟,尤其是克隆和删除,我在项目里用得非常频繁。