3. 环境配置
咱们先别急着写代码。搭 Pipeline 的第一步,是把「工作台」收拾干净。我刚开始做生信分析时,遇到的最头疼的问题不是算法调参,而是环境冲突。一个项目需要 Python 3.6,另一个要 3.8;这个工具依赖旧版 NumPy,那个又要新版。各种依赖搅在一起,拆都拆不开。
后来我遇到了 Conda,这玩意儿说白了就是把你的软件环境隔离开来。每个项目一个独立的小房间,互不干扰,清爽得很。再加上 Bioconda,生信领域的软件基本都能一键安装。
3.1 为什么需要环境隔离
你想想看,一个完整的宏基因组流程,涉及多少个软件?FastQC、Trimmomatic、KneadData、MetaPhlAn、HUMAnN...每个都有自己的依赖版本要求。如果全装在一个系统环境里,很容易出现「装完 A,B 不能用了」的情况。
我遇到过最惨的一次:在服务器上装了一个新版本的 Python,结果系统自带的 yum 命令直接罢工。因为 yum 依赖的是旧版 Python。从那以后,我就养成了一个习惯——所有生信项目,全部用 Conda 环境,绝不碰系统 Python。
sudo pip install 往系统 Python 里装东西。一旦把系统环境搞乱了,重装系统可不是闹着玩的。
3.2 Conda:环境的「管理员」
Conda 是一个开源的包管理和环境管理系统。它能帮你做两件事:装软件 和 管隔离。
- 包管理: 安装、更新、卸载各种软件包,自动处理依赖关系。
- 环境管理: 创建多个独立的虚拟环境,每个环境有自己的一套软件包,互不干扰。
我一般会给每个项目建一个独立环境。比如做宏基因组分析,就建一个 metagenomics_env;做转录组分析,再建一个 rnaseq_env。项目做完了,直接把整个环境删掉,干净利落,不留后患。
3.3 安装 Miniconda
Conda 有两个主流发行版:Anaconda 和 Miniconda。Anaconda 自带了大量科学计算包,安装包很大(几百 MB)。Miniconda 只带最基本的 Python 和 Conda 核心,轻量小巧,需要什么包再装什么包。
我个人强烈推荐 Miniconda。为什么?因为生信软件更新很快,Anaconda 自带的那些包很多用不上,还容易版本冲突。从零开始安装,反而更可控。
3.3.1 Linux 系统安装
在服务器上操作,一般是 Linux 系统。下载安装脚本并运行:
# 下载 Miniconda 安装脚本(选择 Python 3.9 版本)
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
# 运行安装脚本
bash Miniconda3-latest-Linux-x86_64.sh
安装过程中,会提示你阅读许可协议,按 Enter 翻页,然后输入 yes 同意。接下来是选择安装路径,我习惯默认 ~/miniconda3,这样每个用户都有自己独立的 Conda,不会互相影响。
最后一步:
# 安装程序会问要不要自动初始化 Conda,选 yes
Do you wish the installer to initialize Miniconda3
by running conda init? [yes|no]
[no] >>> yes
选 yes 的话,Conda 会自动把相关路径加入你的 ~/.bashrc,下次登录终端时就能直接用了。
3.3.2 macOS 系统安装
Mac 用户操作类似,只是下载脚本名称略有不同:
# macOS 版本
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh
# 运行安装
bash Miniconda3-latest-MacOSX-x86_64.sh
3.3.3 验证安装
安装完成后,关掉终端重新打开,或者执行 source ~/.bashrc 让配置生效。然后运行:
conda --version
如果能看到类似 conda 23.10.0 的版本号,恭喜,安装成功了。
3.4 配置 Bioconda 频道
Conda 默认的下载源(叫做「频道」)主要是针对通用 Python 包的。生信软件大多放在 Bioconda 这个频道里。所以我们需要把 Bioconda 相关的频道加到 Conda 的配置中。
频道的优先级很重要。Bioconda 官方推荐的添加顺序是:
conda config --add channels defaults
conda config --add channels bioconda
conda config --add channels conda-forge
为什么是这个顺序?conda-forge 频道包罗万象,bioconda 专注生信。把 conda-forge 放在最前面,能让它优先提供依赖。我曾经遇到过一次奇怪的报错,就是因为频道顺序搞反了,导致某个库的版本死活对不上。
配置完成后,可以用这个命令查看当前频道:
conda config --show channels
输出应该类似:
channels:
- conda-forge
- bioconda
- defaults
3.5 创建项目专用环境
环境和频道都准备好了,现在来给咱们的宏基因组流程搭一个专用环境。
# 创建新环境,指定 Python 版本为 3.9
conda create -n metagenomics_env python=3.9
-n metagenomics_env 给环境起了个名字,叫做 metagenomics_env。你可以按项目自由取名,我习惯用 项目名_env 的格式,好记。
创建过程中,Conda 会计算依赖关系,然后列出一堆需要安装的包。确认后输入 y 继续。
激活环境:
conda activate metagenomics_env
激活后,终端的命令提示符前面会出现 (metagenomics_env) 字样,代表你现在处于这个隔离环境中。在这里面安装的任何软件,都不会影响系统或者其他环境。
退出环境:
conda deactivate
3.6 安装核心生信工具
环境有了,现在装一个咱们流程里马上要用到的软件试试手。以 FastQC 为例:
# 先确保环境已激活
conda activate metagenomics_env
# 安装 FastQC
conda install -c bioconda fastqc
你可能会好奇:不是已经在配置里加过频道了吗?为什么这里还要写 -c bioconda?-c 是 --channel 的缩写,指定本次安装的频道。其实不写也行,因为我们已经设置了频道顺序。但有时候显式指定频道可以避免某些奇怪的版本解析问题,算是一个好习惯。
安装完成后,你可以验证一下:
fastqc --version
如果正常输出版本号,说明安装成功。同样的方式,你可以安装 Trimmomatic、KneadData 等工具,但咱们不一次装太多,用到哪个装哪个。这样做的好处是:万一某个软件出了兼容性问题,只影响它自身,不会牵连其他工具。
3.7 常用 Conda 命令速查
我整理了一个表格,把日常最常用的几个命令列出来。以后在终端里想不起来怎么操作,直接回来看一眼就行。
| 命令 | 说明 |
|---|---|
conda create -n 环境名 python=3.x |
创建一个新环境,并指定 Python 版本 |
conda activate 环境名 |
激活指定环境 |
conda deactivate |
退出当前环境 |
conda list |
列出当前环境下所有已安装的包 |
conda install 包名 |
安装包(会自动处理依赖) |
conda remove 包名 |
卸载包 |
conda env list |
列出所有环境 |
conda env remove -n 环境名 |
删除整个环境 |
3.8 环境配置的「避坑」指南
这几年我用 Conda 踩过的坑,说多不多,说少不少。挑几个最有代表性的,分享给你:
- 安装超慢? 这是 Bioconda 频道的通病,因为服务器在国外。解决方案是换国内镜像,比如清华源。在
~/.condarc文件里配置即可。代码实现我放到课程附件里,手打太长了。 - 装完软件提示「command not found」? 八成是你忘记激活环境了。运行
conda activate 环境名再试试。 - 两个环境的包版本怎么也调不对? 我建议为每个独立项目单独建一个环境,不要图省事把所有东西塞到一个环境里。环境是轻量级的,多建几个不碍事。
- 硬盘空间报警? Conda 依赖的缓存文件会越积越多。运行
conda clean --all清理缓存,能释放不少空间。
conda env export > environment.yml 把当前环境的依赖列表导出成一个 YAML 文件。之后换到新机器上,只需要 conda env create -f environment.yml 就能一键复原,省心省力。