You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snakemake如何重调度作业适配动态生成的样本配置文件

以下是两种可行的实现方案,都可以满足仅执行一次snakemake all -c即可运行完整流程的需求:

方案1:使用Snakemake checkpoint机制(推荐,完全兼容现有流程逻辑)

Snakemake的checkpoint特性就是为了解决「运行过程中生成的文件会决定后续作业的输入输出结构」的场景,你可以按以下方式修改Snakefile:

  1. 将原来生成config_samples.yaml的规则改为checkpoint,输出config_samples.done标记文件即可,原有生成逻辑无需调整:
checkpoint generate_sample_config:
    output:
        "config_samples.done"
    script:
        "your_script_to_generate_config.py"
  1. 编写自定义函数,在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"])
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:24:02