如何在Snakemake工作流中切换样本且无需从头运行?
解决Snakemake多样本切换与增量运行问题
给你几个实用方案,不用重复构建Conda环境,还能保留每个样本的运行记录:
1. 给每个样本单独建工作目录
- 为每个样本创建独立的工作文件夹,比如
sample1_work、sample2_work - 运行时用
--directory指定工作目录:
切换到第二个样本就换成snakemake --directory sample1_work --config sample=sample1sample2_work - 每个样本的
.snakemake缓存、中间文件和日志都存在各自目录里,不会互相覆盖。修改工作流后重新跑某个样本,Snakemake会自动跳过已完成的步骤,只跑修改后的部分。
2. 用配置文件指定工作路径,不用复制Snakefile
- 不用复制Snakefile,只给每个样本做单独的config文件
- 在你的Snakefile开头加一行指定工作目录来自配置:
configfile: "config.yaml" workdir: config["work_dir"] - 比如
config_sample1.yaml里写work_dir: "./sample1_work",config_sample2.yaml里写work_dir: "./sample2_work" - 运行时指定对应config文件:
这样所有样本共用同一个Snakefile,Conda环境只需要构建一次。snakemake --configfile config_sample1.yaml
3. 临时切换用自定义缓存前缀
- 如果只是临时换样本,不想建太多目录,用
--shadow-prefix指定不同的缓存目录前缀:# 跑第一个样本 snakemake --shadow-prefix .snakemake_sample1 # 跑第二个样本 snakemake --shadow-prefix .snakemake_sample2 - 两个样本的缓存分别存在
.snakemake_sample1和.snakemake_sample2里,互不干扰。修改工作流后重新跑时,指定对应的前缀就能增量运行。
4. 把工作流改成支持多样本(长期最优方案)
- 修改Snakefile,让它支持同时处理多个样本,把样本列表放在config里:
configfile: "config.yaml" SAMPLES = config["samples"] rule all: input: expand("results/{sample}/final.vcf", sample=SAMPLES) # 其他规则用{sample}通配符适配所有样本 rule align: input: "raw/{sample}.fastq" output: "bam/{sample}.bam" conda: "envs/align.yaml" shell: "bwa mem ref.fasta {input} > {output}" - 想单独跑某个样本就直接指定它的最终输出:
snakemake results/sample1/final.vcf - 每个样本的输出文件都有独立路径,Snakemake会自动追踪每个样本的运行状态,修改步骤后只会重新跑受影响的样本步骤,Conda环境只需要构建一次。
内容的提问来源于stack exchange,提问作者heiha
相关产品推荐
相关产品推荐

