第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里搞项目依赖。
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 create开始,到指定名称和版本,再经过依赖解析和确认安装,最后可以用conda env list查看。别小看这几个步骤——做到位了,后面版本锁定、环境迁移都会轻松很多。
- 创建环境:
conda create -n 环境名 python=版本 - 查看环境:
conda env list或conda info --envs - 克隆环境:
conda create -n 新环境 --clone 旧环境
嗯,这一章的核心就这些。记住了:环境是Conda的基石,把环境管理顺手了,后面的依赖锁定、项目复用才能玩得转。动手试试,敲几条命令感受一下。