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

Snakemake 7.25.0规则执行异常:参数变更后未正确重跑

Snakemake 7.25.0参数变更检测异常:Checkpoint未使用参数修改后规则不触发重跑的问题

问题复现

使用Snakemake 7.25.0时,修改checkpoint的未使用参数后出现两个异常:

  1. 修改save_number_files的参数t(如从3改为4),checkpoint会执行,但下游的create_file规则未重新运行;
  2. 无修改再次执行时,Snakemake未提示Nothing to be done,反而重新运行all规则。

最小复现代码:

rule all:
    input:
        "res.txt"

checkpoint save_number_files:
    output:
        "n.txt",
    params:
        x = 2,
        t = 3,
    shell:
        "echo {params.x} > {output}"

rule create_file:
    input:
        "n.txt",
    output:
        "out/{index}.txt"
    shell:
        "touch {output}"

def get_n(wilcards):
    with checkpoints.save_number_files.get(**wilcards).output[0].open() as f:
        return [f"out/{i}.txt" for i in range(int(f.read()))]

rule aggregate:
    input:
        get_n
    output:
        "res.txt"
    shell:
        """touch {output}"""

复现步骤:

  • 首次执行snakemake -c1,运行正常;
  • 修改save_number_files的params.t为4,重新执行,checkpoint执行但create_file不重跑;
  • 无修改再次执行,Snakemake重新运行all。

原因分析

Snakemake的规则指纹(fingerprint)计算只跟踪规则实际使用的资源:包括输入输出文件的内容/修改时间、shell命令中引用的参数、规则代码逻辑的哈希值。

在这个案例中:

  1. 参数t没有在checkpoint的shell命令、输入或输出中被引用,所以修改t不会改变checkpoint的指纹,下游规则因为输入n.txt的内容未变化,不会触发重跑;
  2. 虽然t未被使用,但Snakemake仍会记录参数的存在,修改后可能导致内部依赖跟踪的状态不一致,从而在无修改执行时误判需要重新运行all。

解决方案

方案1:让未使用参数参与规则逻辑(推荐)

如果参数t是流程中需要的配置项,必须让它在checkpoint的执行逻辑中被使用,比如写入输出文件或在shell命令中引用,这样Snakemake才能跟踪到参数变化。

修改后的代码示例:

rule all:
    input:
        "res.txt"

checkpoint save_number_files:
    output:
        "n.txt",
    params:
        x = 2,
        t = 4,  # 修改后的参数
    shell:
        # 将t写入输出文件,让Snakemake跟踪参数变化
        "echo '{params.x} {params.t}' > {output}"

rule create_file:
    input:
        "n.txt",
    output:
        "out/{index}.txt"
    shell:
        "touch {output}"

def get_n(wilcards):
    with checkpoints.save_number_files.get(**wilcards).output[0].open() as f:
        # 读取x和t的值,t可用于后续逻辑(如果需要)
        x_val, t_val = f.read().strip().split()
        return [f"out/{i}.txt" for i in range(int(x_val))]

rule aggregate:
    input:
        get_n
    output:
        "res.txt"
    shell:
        """touch {output}"""

方案2:删除无用参数

如果t是调试用的冗余参数,直接从checkpoint的params中删除,避免干扰Snakemake的依赖跟踪逻辑。

方案3:将参数嵌入输出文件名(适合多版本保留)

如果需要基于不同的t值保留不同的输出文件,可以将参数作为输出文件名的一部分:

checkpoint save_number_files:
    output:
        "n_{params.t}.txt",  # 参数t嵌入文件名
    params:
        x = 2,
        t = 4,
    shell:
        "echo {params.x} > {output}"

这种方式会让不同t值对应不同的输出文件,自然触发下游规则的重跑,但需要同步修改下游规则的输入路径。

验证

  • 修改t值后执行snakemake -c1,checkpoint会重跑,输出文件n.txt内容变化,下游create_file和aggregate规则会根据新的输入触发重跑;
  • 无修改再次执行时,Snakemake会正常提示Nothing to be done。

内容的提问来源于stack exchange,提问作者Quentin BLAMPEY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:16:24