第2章 环境创建与管理

环境隔离是Conda的核心价值。说白了,每个项目都应该有自己的小天地——依赖互相不打架,版本随心所欲。这一章咱们就从最基础的conda create开始,把环境搭建这件事彻底讲透。

2.1 conda create:创建环境的基本姿势

创建一个新环境,最直接的命令就是conda create。我个人习惯先给环境起个名字,再决定Python版本。举个例子:

conda create --name myproject python=3.9

这条命令会创建一个叫myproject的环境,并安装Python 3.9。你想想看,如果不指定名字,Conda会默认给你一个base环境——但大家最好别直接往base里装东西。我曾经有一次在base里装了TensorFlow,结果后面所有项目的依赖都冲突了,搞得一团糟。

命令中的--name也可以简写成-n:

conda create -n ml_env python=3.10

执行之后,Conda会先解析依赖,然后列出需要下载的包。你确认一下,按y才会真正安装。嗯,这里要注意:如果网络不太好,可以加个-c conda-forge指定频道:

conda create -n myenv -c conda-forge python=3.9
小技巧:创建环境时一步到位装常用的包。比如我经常这样:
conda create -n data_analysis python=3.9 numpy pandas matplotlib
免去了后面再一个个pip install的麻烦。

2.2 指定环境名称与Python版本

环境名称最好见名知意。比如项目叫nlp_project,就别起个env1——时间一长你自己都晕。我习惯用项目名+Python版本号,比如:

conda create -n nlp_310 python=3.10

Python版本怎么选?看你的项目依赖。很多旧库(比如TensorFlow 2.5)只支持到Python 3.9,新项目则可以用3.10或3.11。Conda会帮你自动解决版本冲突:如果指定python=3.9,但你想装的某个包只支持3.8,它会报错并终止。

除了Python版本,你还可以指定其他包的版本:

conda create -n myenv python=3.9 numpy=1.21 pandas=1.3

这种写法在复现论文环境时特别有用。我在项目中遇到过某篇论文的代码要求numpy==1.19.5,如果不锁定版本,装到最新的1.24直接就报错。那时候我深刻理解了锁版本的重要性。

下面这张表列出了conda create最常用的参数:

参数 简写 说明 示例
--name -n 指定环境名称 conda create -n myenv
python=版本 — 指定Python版本 python=3.9
-c — 指定包频道 -c conda-forge
--clone — 克隆已有环境 conda create -n newenv --clone oldenv
--file — 从文本文件读取包列表 conda create -n myenv --file packages.txt

2.3 查看已有环境

环境创建多了,管理起来就得有点章法。Conda提供了两个命令来查看所有环境:

conda env list

或者

conda info --envs

两者输出完全一样。我习惯用conda env list,因为字母少敲两下。输出大概长这样:

# conda environments:
#
base                  *  /home/user/miniconda3
myproject                /home/user/miniconda3/envs/myproject
ml_env                   /home/user/miniconda3/envs/ml_env
nlp_310                  /home/user/miniconda3/envs/nlp_310

当前激活的环境前面会有一个*号。注意看base前面也有*?那说明你现在就在base环境里。赶紧切走——我前面说过,别在base里搞项目依赖。

警告:千万别直接删除正在使用的环境(比如当前激活的环境)。Conda会拒绝操作,提示“WARNING: Cannot remove current environment”。先切换到别的环境再删。

2.4 踩坑与技巧

我自己踩过的坑还真不少。分享几个典型的:

  • 环境名大小写——Conda虽然不区分大小写,但系统路径会区分。我建议全程小写,省得后面写脚本时还得回忆大小写。
  • 克隆环境时别带--name——克隆命令是conda create -n new --clone old,而不是conda clone old new。语法记错就会报错。
  • 指定Python版本时别写错号——比如python=3.1这种不存在的版本号,Conda会乖乖去搜,但根本找不到,然后报ResolvePackageNotFound。

我曾经有个项目需要Python 3.7,但Conda安装时默认选了3.9,结果有一个关键库死活装不上。折腾了半天才发现是Python版本不匹配。从那以后我每次创建环境都刻意把Python版本写在前面:

conda create -n legacy_py37 python=3.7

下面这张图把整个环境管理的核心流程串起来了:

Conda 环境管理核心流程 conda create -n 环境名 python=版本 解析依赖 & 显示待装列表 按y确认安装 conda env list 避坑提醒 1. 不要用base做项目 2. 环境名用小写 3. 先指定Python版本

图中从conda create开始,到指定名称和版本,再经过依赖解析和确认安装,最后可以用conda env list查看。别小看这几个步骤——做到位了,后面版本锁定、环境迁移都会轻松很多。

重点回顾:
  • 创建环境:conda create -n 环境名 python=版本
  • 查看环境:conda env list 或 conda info --envs
  • 克隆环境:conda create -n 新环境 --clone 旧环境

嗯,这一章的核心就这些。记住了:环境是Conda的基石,把环境管理顺手了,后面的依赖锁定、项目复用才能玩得转。动手试试,敲几条命令感受一下。