Snakemake如何重调度作业适配动态生成的样本配置文件
以下是两种可行的实现方案,都可以满足仅执行一次snakemake all -c即可运行完整流程的需求:
方案1:使用Snakemake checkpoint机制(推荐,完全兼容现有流程逻辑)
Snakemake的checkpoint特性就是为了解决「运行过程中生成的文件会决定后续作业的输入输出结构」的场景,你可以按以下方式修改Snakefile:
- 将原来生成
config_samples.yaml的规则改为checkpoint,输出config_samples.done标记文件即可,原有生成逻辑无需调整:
checkpoint generate_sample_config: output: "config_samples.done" script: "your_script_to_generate_config.py"
- 编写自定义函数,在checkpoint运行完成后再读取新生成的
config_samples.yaml解析样本列表:
def get_target_files(wildcards): # 等待checkpoint执行完成 checkpoint_out = checkpoints.generate_sample_config.get(**wildcards).output[0] # 读取新生成的样本配置 import yaml with open("config_samples.yaml", "r", encoding="utf-8") as f: sample_config = yaml.safe_load(f) samples = sample_config["samples"].keys() # 展开得到所有需要的输出文件 return expand("QC_raw_reads/{sample}_{direction}_fastqc.html", sample=samples, direction=["R1", "R2"])
- 修改all规则的输入,把原来的expand语句替换为自定义函数,同时保留标记文件的依赖:
rule all: input: "config_samples.done", get_target_files
该方案的优势是完全保留原有「Python脚本生成样本配置」的逻辑,不需要改动现有业务代码,DAG会在checkpoint完成后自动重新构建,适配新的样本列表。
方案2:Snakefile顶层直接生成样本配置(更简单,适合样本识别逻辑不复杂的场景)
如果你生成config_samples.yaml的逻辑仅为识别目录下的fastq文件、无复杂外部依赖,可以直接把这部分Python逻辑迁移到Snakefile的最顶部,在解析配置、定义规则之前就完成样本列表的生成:
# Snakefile最开头直接执行样本识别逻辑 import os, yaml # 直接将原本写在script中的生成config_samples.yaml的逻辑搬至此处 samples = {} for f in os.listdir("raw_data/"): if f.endswith("_R1.fastq"): sample_id = f.replace("_R1.fastq", "") samples[sample_id] = { "R1": f"{sample_id}_R1.fastq", "R2": f"{sample_id}_R2.fastq" } # 直接将样本信息写入config,无需再依赖后续生成的yaml文件 config["samples"] = samples # 后续再保留原有其他规则、configfile加载等逻辑
该方案的优势是逻辑更简洁,无checkpoint的学习成本,DAG构建阶段就已经拿到了正确的样本列表,不会出现前后版本不一致的问题。
内容的提问来源于stack exchange,提问作者Egelbets
相关产品推荐
相关产品推荐

