Snakemake 7.25.0规则执行异常:参数变更后未正确重跑
Snakemake 7.25.0参数变更检测异常:Checkpoint未使用参数修改后规则不触发重跑的问题
问题复现
使用Snakemake 7.25.0时,修改checkpoint的未使用参数后出现两个异常:
- 修改
save_number_files的参数t(如从3改为4),checkpoint会执行,但下游的create_file规则未重新运行; - 无修改再次执行时,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命令中引用的参数、规则代码逻辑的哈希值。
在这个案例中:
- 参数
t没有在checkpoint的shell命令、输入或输出中被引用,所以修改t不会改变checkpoint的指纹,下游规则因为输入n.txt的内容未变化,不会触发重跑; - 虽然
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
相关产品推荐
相关产品推荐

