第4章 Conda环境管理与软件安装
生物信息学最让人头疼的事,我猜就是装软件了。
你想想看,一个项目下来,BWA要某个版本,GATK要Java 8,Python脚本又要3.7,系统自带的Python可能是3.10。手动搞?我试过一两次,光解决依赖冲突就能耗掉半天。后来我彻底转向Conda,一个命令建一个独立环境,干干净净。
4.1 为什么选Conda?
Conda不是唯一的选择,但我个人觉得它最省心。尤其当你需要同时管理R、Python、C++编译的二进制工具时,Conda的包管理器能把它们都捏到一起。
| 特性 | Conda | pip + virtualenv | 手动编译 |
|---|---|---|---|
| 跨语言包 | 支持(Python/R/C/Java) | 仅Python | 需要自己折腾 |
| 二进制分发 | 预编译,即装即用 | 需要编译工具链 | 手动编译 |
| 环境隔离 | 完整隔离 | 隔离但依赖系统库 | 全局安装 |
| 版本回退 | 轻松 | 麻烦 | 重装 |
说白了,Conda就是给生物信息学量身定做的。我早期项目里用pip装htslib,结果系统缺zlib,排错排了两天……后来全换成Conda,五分钟搞定。
4.2 安装Miniconda
不建议装完整的Anaconda,太大。Miniconda就够用。
# Linux x86_64
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh -b -p ~/miniconda3
~/miniconda3/bin/conda init
注意:-b 是无交互安装,-p 指定路径。安装完成后重新登录shell,或者 source ~/.bashrc。
/opt/conda或者/tools下,方便多用户共享。但如果你只有一个人用,放home目录最省事。
4.3 配置国内镜像源
不配镜像?下载速度会让你怀疑人生。我曾经等一个GATK安装包等了半小时,后来换成清华源,十几秒就完事。
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --set show_channel_urls yes
4.4 创建独立环境
每个项目一个环境,这是铁律。我见过太多人所有包塞在base里,升级一个包崩掉另一个,最后只能重装。
# 创建名为bwa_gatk的环境,指定Python 3.9
conda create -n bwa_gatk python=3.9
# 激活环境
conda activate bwa_gatk
# 退出环境
conda deactivate
4.5 安装BWA和GATK
BWA可以直接从conda-forge装。GATK有点特殊,它需要Java 8,且官方推荐用bioconda渠道。
conda activate bwa_gatk
# 安装BWA(版本0.7.17)
conda install -c bioconda bwa=0.7.17
# 安装GATK4(版本4.2.6.1)
conda install -c bioconda gatk4=4.2.6.1
# 验证安装
bwa 2>&1 | head -5
gatk --version
为什么指定版本? 我在生产环境吃过亏:默认装最新版,结果BWA新版改了索引格式,旧版bwakit不兼容,跑了一半报错。所以,锁定版本号是保命操作。
Unsupported major.minor version。我那时花了一小时排查,最后发现Conda其实会自动拉Java 8的依赖,但如果你在激活环境之前已经设了JAVA_HOME,环境变量会冲突。解决方案:在激活环境后重新设置JAVA_HOME指向Conda内的Java:
export JAVA_HOME=$(dirname $(dirname $(which java)))
4.6 环境清单与导出
项目交付或换机器时,环境复现是关键。我会把环境导出为YAML文件,放在项目根目录。
# 导出当前环境的所有包(含版本)
conda env export -n bwa_gatk > environment.yaml
# 从YAML重建一模一样的环境
conda env create -f environment.yaml
但要注意:conda env export会带上系统特定的依赖(比如linux-64的包),跨平台可能不兼容。我建议用--from-history参数,只记录你手动安装的包:
conda env export -n bwa_gatk --from-history > environment_minimal.yaml
这样别人在macOS或Windows上也能直接建环境。
4.7 常用管理命令速查
| 操作 | 命令 |
|---|---|
| 列出所有环境 | conda env list |
| 删除环境 | conda remove -n bwa_gatk --all |
| 克隆环境 | conda create -n bwa_gatk_v2 --clone bwa_gatk |
| 更新某个包 | conda update gatk4 |
| 搜索可用版本 | conda search bwa |
| 清理缓存 | conda clean -a |
# 快速清理,释放空间(Conda缓存经常占几个G)
conda clean -afy
4.8 环境结构可视化
下面这个图是我自己画的环境管理流程,每次带新人我都贴出来。
4.9 常见问题与避坑
- 安装包失败:先检查网络,再检查渠道顺序。我遇到过bioconda和conda-forge顺序反了,导致旧版包被覆盖。建议bioconda放在最前面。
- 环境创建卡住:用
conda clean -i清理索引缓存再试。如果仍然慢,手动指定--no-channel-priority跳过解析。 - 解压错误:磁盘空间不足。用
df -h检查,Conda临时目录默认在/tmp,如果/tmp空间小,可以设置TMPDIR到有足够空间的目录。
# 设置临时目录到大数据盘
export TMPDIR=/data/tmp
conda install -c bioconda bwa
- 每个项目建立一个独立的
project_root/environment.yaml,连带README写清楚创建命令。 - 使用
conda list --revisions可以查看历史操作,万一手残删了包,可以conda install --revision N回退。 - Conda 环境可以放在项目目录下:
conda create -p ./env,这样环境跟项目走,换机器直接删掉重建。