1. Snakemake 简介与安装

1.1 Snakemake 是什么?

简单来说,Snakemake 是一个基于 Python 的工作流管理工具。它专门用来处理那些步骤多、依赖乱、数据量大的分析流程。在药物分子数据预处理里,我们经常要搞“下载→清洗→标准化→特征提取→格式转换”这一套,每一环都可能有几十个文件,人工一个一个跑,既累又容易出错。Snakemake 就是替你把这一切自动串起来的那个“导演”。

我个人觉得,Snakemake 最大的魅力在于“声明式”规则。你不需要写一坨脚本去判断哪个文件是否生成、什么时候该跑下一步;你只需要定义好 规则,告诉它输入是什么、输出是什么、用哪个 shell 命令或 Python 脚本来干活,剩下的依赖解析、并行调度、失败重试,Snakemake 全帮你搞定。说白了,它就是把你脑袋里的“流程图”变成可执行代码的神器。

我的一点经验: 五年前我第一次做化合物库的标准化处理,那时候用的是 Makefile 手动串联 R 脚本,每次改参数都要改好几处,版本更难追踪。后来换成 Snakemake,只改了 4 个配置文件,原来两天的活变成了一个命令 snakemake --cores 8,而且每一步的 log 都清清楚楚。从那以后,我再也没用过手写脚本串流程。

Snakemake 的核心理念其实非常直白:基于规则(rule)的有向无环图(DAG)执行。你定义一堆规则,每个规则声明输入文件和输出文件,Snakemake 自动分析各个规则之间的数据依赖关系,构建出 DAG,然后从最下游的输出一路回溯,按需执行所有上游规则。它会自动跳过那些已经生成且未过期的文件,大大节省重复计算的时间。

为什么药物分子数据预处理特别适合 Snakemake?因为这类流程有典型的“管道”特征:
• 原始数据格式五花八门(SDF, SMILES, CSV, MOL2…),每个步骤都需要转换。
• 中间产物繁多,一旦出错需要从断点续跑。
• 经常需要对海量分子做并行处理,Snakemake 天然支持多核和集群。
• 研究者希望可重现——一个 Snakefile + 配置文件就能复现整个预处理。

下面这张图能帮你快速建立整体印象:

Snakemake 工作流核心概念 输入文件 (input) 规则 (rule) shell / run / script 输出文件 (output) 自动解析依赖 Snakemake 从最终目标输出回溯,找出所有需要的输入和规则 只执行必要步骤,跳过已完成的文件,支持并行执行 配置文件 日志 (log) 环境模块 (conda) Snakefile 定义规则,Snakemake 自动生成 DAG 并调度执行

1.2 安装 Snakemake

安装方式有好几种,我推荐你用 Conda 或 pip 安装,因为这两者都能自动处理好 Python 依赖。如果你搞药物分子数据,很可能已经在用 Conda 管理环境了。

1.2.1 通过 Conda 安装(推荐)

Conda 安装最稳妥。我个人习惯给每个项目建独立环境,避免包冲突。

conda create -n snakemake_env -c conda-forge -c bioconda snakemake
conda activate snakemake_env

解释一下: -c conda-forge -c bioconda 指定两个渠道,conda-forge 是通用包仓库,bioconda 是生物信息学的仓库,Snakemake 的两个源都有,但 bioconda 版本通常更新更快。如果你只需要基础功能,conda-forge 就够了。

我曾经踩过的坑: 有一次我图省事,直接在 base 环境装了 snakemake,结果跟已有的 scikit-learn 版本冲突,搞了半天。从那以后我坚持每项目单独建环境,虽然硬盘多占点空间,但再没出过依赖地狱。你想想看,要是项目到一半发现某个包不兼容,那才叫欲哭无泪。

1.2.2 通过 pip 安装

如果你已经有一个 Python 环境且不想装 Conda,pip 也能装。不过要注意,Snakemake 有些底层依赖(比如 graphviz 绘图)可能需要系统库。

pip install snakemake

嗯,这里要提醒一下:如果只用 pip,建议先装好 graphviz 和 libcurl。不然跑 snakemake --dag 可视化的时候会报错。不过大部分情况下,pip 装的也能正常干活。

1.2.3 其他安装方式

除了上面两种,还有 Linux 系统包管理器(如 apt install snakemake),但版本通常比较老。还有直接从 GitHub 源码安装的方式,但那更适合开发者。对于咱们做药物分子预处理的,个人觉得 conda 或 pip 就足够了。

1.3 验证安装

装好后,第一件事就是确认它能跑。打开终端,激活环境(如果用 conda 的话),执行:

snakemake --version

能看到类似 7.32.4 的输出,就说明安装成功了。

接下来做个最简单的测试。创建一个空目录,在里面放一个 Snakefile 文件,内容就写一个空规则:

# Snakefile
rule all:
    input:
        "dummy.txt"

然后运行:

snakemake -n

-n 是 dry-run 模式,只打印计划不真执行。如果它没有报错,并且显示了类似 Job stats: count (1) 的信息,说明 Snakemake 能正确解析 Snakefile。这就代表你的基本环境是没问题的。

为什么非要跑一个 dry-run?嗯,因为我遇到过有人装完 snakemake 后 ——version 能出来,但一跑真实工作流就报错,最后发现是 graphviz 没装。所以建议你 至少做一次 dry-run,确认解析功能正常。

1.4 安装后快速上手建议

到这里,Snakemake 已经能用了。但我个人经验是,先别急着写复杂流程,用几个小规则找找手感。比如写一个“把 CSV 转成 TSV”的规则,再用 snakemake --dag 看一下依赖图——你会直观感受到“声明式”的美妙。

一个小技巧: 当你第一次用 snakemake --dag 生成图时,终端里会出现 dot 代码。你可以把它们保存成文件,再用 graphviz 渲染成 PDF:
snakemake --dag | dot -Tpdf > dag.pdf
一张清晰的工作流图就出来了。这对于向同事解释你的预处理流程特别有用。