第二章:Conda环境管理基础

很多新手一上来就问我:“老师,装个软件直接pip不就完事了吗?为啥还要搞什么环境?”

嗯,这个问题我当年也问过。直到有一次,我在一个项目里需要用Python 2.7跑一个老脚本,同时另一个项目要求Python 3.8以上。你想啊,一台机器上同时装两个Python版本,依赖包还互相打架——那场面,简直比春运还乱。

Conda环境的作用,说白了就是给每个项目一个独立的“小房间”。房间里装什么版本的Python、什么版本的R、哪些依赖包,完全你自己说了算,互不干扰。这比你强行把所有东西塞在系统里要优雅得多。

为什么需要环境隔离?

我在做生物信息分析时有个习惯:每个RNA-seq项目单独建一个环境。为什么?因为DESeq2和edgeR对依赖包版本的要求完全不同。有一次我强行在一个环境里装两个工具,结果一个要dplyr 1.0.0,另一个非要0.8.5,最后两个都跑不起来。

你想想看,要是没有环境隔离,你只能有两种选择:要么每次卸载重装,要么放弃其中一个分析。都不是什么好主意。

注意:千万别在base环境(也就是默认环境)里装太多东西。base环境是Conda自己的“家”,搞乱了可能导致整个Conda用不了。我见过有人把base环境搞得一团糟,最后只能重装Miniconda——所有环境都得重建,血的教训啊。

环境管理的核心流程

我们先看一眼Conda环境管理的全貌,后面一个个拆开细讲。

Conda环境生命周期 创建环境 激活环境 工作状态 退出环境 列出环境 删除环境 说明: 虚线箭头表示从工作状态可以执行 列出环境或删除环境操作。 删除环境前必须先退出该环境。 建议:创建环境时指定Python版本。

1. 创建环境

Conda创建环境的命令很简单,就一行:

conda create -n myenv

这里的-n后面跟的是环境名称,你可以随便起名。但我的建议是:名字要有意义。比如rna-seq、scRNA、bulk-rnaseq这种。别起什么test1、test2——到后来你自己都分不清哪个是哪个。

通常创建环境时会指定Python版本,比如:

conda create -n rnaseq python=3.9

这行命令会创建一个名为rnaseq的环境,并安装Python 3.9。如果你不指定版本,Conda会用默认版本——我个人不太推荐这么干。因为不同项目对Python版本要求不一样,明确指定最稳妥。

小技巧:创建环境时还可以一次装好多个包,比如:
conda create -n rnaseq python=3.9 pandas numpy matplotlib
省得后面一个一个装。

2. 激活与退出环境

环境建好了,得先“进去”才能用。这个过程叫激活:

conda activate rnaseq

激活后,你会看到命令行前面多了一个括号,里面是环境名:

(rnaseq) user@machine:~$

有这个括号,就说明你已经在rnaseq环境里了。这时候你装的任何包、跑的任何命令,都只对这个环境生效,不影响外面。

那怎么出来?简单:

conda deactivate

命令行的括号就没了,你又回到了base环境。

坑!我在公司培训时发现一个常见问题:很多人激活环境后,忘了退出就直接关终端。这其实没关系,下次开新终端默认是base环境。但如果你在服务器上通过SSH连接,激活环境后直接断开——下次重新连上,环境不会自动激活。你得重新conda activate一下。

3. 列出环境

时间长了,你电脑上可能有好几个环境。怎么查看都有哪些?

conda env list

或者也可以用:

conda info --envs

两个命令效果一样,输出大概长这样:

# conda environments:
#
base                  *  /home/user/miniconda3
rnaseq                   /home/user/miniconda3/envs/rnaseq
scRNA                   /home/user/miniconda3/envs/scRNA
bulk-rnaseq             /home/user/miniconda3/envs/bulk-rnaseq

注意看,base前面有个星号(*),表示当前激活的环境。如果你在rnaseq环境里执行这个命令,星号就会跳到rnaseq那一行。

我记得有一次帮同事排查问题,他死活说自己的环境里装了某个包,但我一查他实际在base环境里干活。所以啊,做事前先conda env list看一眼,确认自己在哪,能省很多麻烦。

4. 删除环境

环境不用了怎么办?删掉。

conda remove -n rnaseq --all

或者:

conda env remove -n rnaseq

两条命令完全等价,任选一条就行。

关键点:删除环境前,必须先退出那个环境。你总不能一边坐车一边拆车对吧?如果当前就在rnaseq环境里,先conda deactivate退出来,再删。

我曾经在一台共享服务器上干活,上面有上百个环境,好多都是别人废弃不用的。一个个去试哪些还能用?不现实。我的做法是先列出所有环境(conda env list),然后把名字里带test、tmp、backup这些明显是临时的环境,先确认没人用再删掉。

环境管理操作一览表

操作 命令 说明
创建环境 conda create -n 环境名 python=版本 建议指定Python版本
激活环境 conda activate 环境名 进入指定环境
退出环境 conda deactivate 返回base环境
列出环境 conda env list 显示所有环境,*表示当前
删除环境 conda env remove -n 环境名 先退出再删除

好了,Conda环境管理这块的基础操作就这些。说实话,真正用起来就是几条命令来回倒。但就是这几条命令,搞清楚了,后面装DESeq2和edgeR时就不容易出乱子。

你想想看,要是环境管理都没搞明白,装完工具发现版本不对、包冲突——到时候查起来可比现在花时间多了。所以别嫌基础,打好地基再盖楼,稳得很。