2. 安装与配置:Snakemake安装、Python环境设置、验证安装

好,咱们开始动手吧。

Snakemake 这玩意,说到底是跑在 Python 上的。所以你要做的第一件事,不是装 Snakemake 本身,而是先把 Python 环境理清楚。我个人习惯,所有生物信息相关的项目,全都用 conda 管理。为什么呢?

因为干净、隔离、不打架。

我见过太多人,系统 Python 里装了一堆包,pip install 一个东西,版本冲突了,然后整个环境崩掉。你想想看,一个生信流程往往要跑几个月,中间环境出问题,那可不是闹着玩的。

2.1 Python 环境管理

先说个最简单的方案——如果你不想折腾,直接用 Miniconda。

推荐方案:Miniconda + 独立环境。

别装 Anaconda,太重了。Miniconda 够用,干净利落。

安装 Miniconda 之后,创建一个干净的 Python 3.10 环境。我个人偏好 3.10,因为兼容性最好。如果你用 3.12 或 3.13,某些旧版 Snakemake 插件可能会有兼容问题。

conda create -n snakemake_env python=3.10
conda activate snakemake_env

嗯,这里要注意。我习惯把环境名写成 snakemake_env,但你可以随便取。关键是要记住每次跑流程前,先激活这个环境。

踩坑预警:不要用 base 环境装 Snakemake。

我曾经在一个集群上干活,懒得建新环境,直接在 base 里装了 Snakemake。结果项目做到一半,需要升级 pandas,结果把 Snakemake 的依赖搞坏了。从那以后,我每个项目都是独立环境,谁也别污染谁。

装好 conda 后,确认 Python 版本。

python --version
# 输出示例
Python 3.10.12

如果版本对了,我们就继续往下走。

2.2 安装 Snakemake

Snakemake 的安装方式有好几种。最常见的是 pip 和 conda 两种。我个人建议用 pip,因为 pip 的版本更新更快。

但如果你在集群上操作,有时 conda 更方便——它会把一些底层依赖(比如 numpy、scipy)一并管理好。

方法一:pip 安装(推荐)

pip install snakemake

装完之后,你可以加一个参数验证一下版本。

snakemake --version

如果你看到类似 7.32.4 这样的数字,那就对了。

方法二:conda 安装

conda install -c bioconda -c conda-forge snakemake

这个方法的好处是,bioconda 频道会帮你处理很多生信工具依赖。但有个小问题——conda 的依赖解析有时候会很慢,尤其是你的环境已经很大了。

个人经验:如果你用 conda 安装慢,可以试试 mamba。

mamba 是 conda 的 C++ 重写版,解析依赖贼快。我一般先装 mamba,然后用 mamba 装 Snakemake。

conda install mamba -c conda-forge
mamba install snakemake -c bioconda -c conda-forge

方法三:通过 Bioconda 直接安装

这是最常出现在服务器上的方式。

conda install -c bioconda snakemake=7.32.4

指定版本号是个好习惯。我一般会锁定一个稳定版本,避免团队里其他人装的时候版本不一致导致问题。

下面我整理了一个安装方式对比表,方便你决策。

安装方式 优点 缺点 适用场景
pip install snakemake 安装快,版本新 需手动管理底层依赖 个人电脑、开发环境
conda (bioconda) 依赖全,适合生信 安装慢,解析复杂 服务器、共享环境
mamba + conda 速度快,依赖全 多装一个工具 所有场景(强烈推荐)

2.3 验证安装是否成功

装完别急着关终端。我们先跑几个命令,确认 Snakemake 能正常工作。

第一步,看版本。

snakemake --version

我的输出是 7.32.4。只要你看到数字,说明 pip/conda 安装成功了。

第二步,看帮助文档。

snakemake --help

这个命令会列出一大堆参数。你不用全看完,只要看到输出内容没有报错,就说明主程序能跑起来。

第三步,跑一个最简 Snakefile 来测试。

我一般会在一个临时目录里创建这个文件。

touch Snakefile

然后写入下面内容:

rule all:
    input:
        "test.txt"

rule generate_test:
    output:
        "test.txt"
    shell:
        "echo 'Snakemake is working!' > test.txt"

保存后,在终端执行:

snakemake -j 1

你应该会看到类似下面的输出日志:

Building DAG of jobs...
Using shell: /bin/bash
Provided cores: 1
Rules claiming more threads will be scaled down.
Job stats:
rule               count
all                    1
generate_test          1
total                  2

Select jobs to execute...
[Mon Jan 20 10:00:00 2025]
rule generate_test:
    output: test.txt
    jobid: 1
    reason: Missing output files: test.txt
    wildcards: var1=

[Mon Jan 20 10:00:01 2025]
Finished job 1.
1 of 2 steps (50%) done
Select jobs to execute...
[Mon Jan 20 10:00:01 2025]
localrule all:
    input: test.txt
    jobid: 0
    reason: Input files updated by another job: test.txt
[Mon Jan 20 10:00:01 2025]
Finished job 0.
2 of 2 steps (100%) done

看到 100% done 了吗?那就对了。Snakemake 已经可以正常执行流程了。

最后检查一下生成的文件。

cat test.txt
# 输出
Snakemake is working!

关键点:执行 snakemake -j 1 时,-j 指定并发核数。

如果这里报错说找不到 snakemake 命令,说明你的 PATH 没设置对,或者环境没激活。

如果报错说 Python 版本不对,那就回到第一步检查 conda 环境。

2.4 常见问题与踩坑记录

这里我整理了几个我实际遇到过的问题,提前给你打个预防针。

  • 问题 1:snakemake: command not found
    原因:环境没激活,或者 pip 安装到了全局路径但不在 PATH 里。
    解决:先 conda activate snakemake_env,再试一次。
  • 问题 2:安装时提示 ERROR: Failed building wheel for xx
    原因:底层 C 扩展编译失败,常见于 numpy、cython。解决方案很简单:pip install numpy cython 先装好这两个,再装 snakemake。
  • 问题 3:conda 安装速度极慢
    原因:conda 的依赖解析算法太慢。解决方案:用 mamba 替代 conda。或者换国内镜像源。
  • 问题 4:执行 Snakefile 时报 NameError: name 'rule' is not defined
    原因:你写了一个 Python 脚本,但 Snakemake 不认识。Snakefile 必须用 Snakemake 语法,不要在里面写 print() 之类的纯 Python 语句。

重要提醒:Snakemake 7.x 和 8.x 的语法有细微改动。

如果你用的是 8.x,某些旧版写法可能要调整。我建议在新项目里直接用 7.32.4 或 8.0 以上版本,别用 7.0~7.30 之间的过渡版。

下面我用一张图,总结一下安装验证的完整流程。

安装验证流程总览 1. 准备 Python 环境 2. 安装 Snakemake 3. 验证版本 4. 干跑测试 Snakefile 5. 正式执行流程 避坑提示 用 conda 创建独立环境 锁定 Snakemake 版本号

图里分成了五个阶段:从环境准备,到安装,到版本验证,到用 Snakefile 做干跑测试,最后才是正式的流程执行。每一步都踩稳了,后面才不会出问题。

2.5 小测验:你真的装好了吗?

我自己带新人时,常会让他们做一个小检查。你也可以自己测一下。

  1. which snakemake 返回了路径吗?
  2. snakemake --version 版本号大于 7.0 吗?
  3. 能不能执行一个最简单的 rule all 而不报错?

如果三个问题你都答“是”,那恭喜你,安装配置这一步你已经过关了。

我的小习惯:我一般会在项目根目录下放一个 env.yaml 文件,把 Python 版本、Snakemake 版本以及所有依赖都写进去。

下次换机器或者有新人加入,直接 conda env create -f env.yaml 就能还原一模一样的运行环境。这才是可重复分析流程的起点。