Snakemake使用--force重运行步骤后,依赖步骤未触发重运行问题
Snakemake重跑上游规则后下游未自动触发的解决方法
问题场景
在两步工作流中,完整运行后用--force重跑上游规则(realoutput),再次执行完整工作流时,下游规则(runall)未自动触发——即使上游输出文件的修改时间(mtime)晚于下游文件,添加--rerun-triggers=mtime参数也无法解决。
最小复现示例
Snakefile(bad.snakefile)
rule runall: input: "bye.txt" output: "hello.txt" shell: "echo hello > {output}" rule realoutput: output: "bye.txt" shell: "echo bye > {output}"
操作步骤
- 首次执行完整工作流:
两个规则均成功运行。snakemake --snakefile bad.snakefile --cores 1 - 用
--force重跑上游规则:
操作完成,snakemake --snakefile bad.snakefile --cores 1 --force realoutputbye.txt的mtime已更新。 - 再次执行完整工作流,系统提示所有任务已完成,但
runall本应因上游文件更新而重跑。执行--summary可见时间戳符合预期,但未触发更新:
输出:snakemake --snakefile bad.snakefile --cores 1 --summaryBuilding DAG of jobs... output_file date rule log-file(s) status plan hello.txt Thu Sep 19 11:25:20 2024 runall ok no update bye.txt Thu Sep 19 11:30:04 2024 realoutput ok no update
问题原因
--force参数仅强制重新生成目标文件,但不会更新Snakemake内部的规则执行状态记录。Snakemake默认的依赖检查逻辑会结合文件mtime和自身的执行日志(存储在.snakemake/目录),即使文件mtime更新,只要内部记录中上游规则的完成状态未标记为“已更新”,下游规则就不会触发重跑。--rerun-triggers=mtime仅改变触发重跑的条件,但无法覆盖Snakemake对规则执行状态的判断。
解决方法
方法1:改用--forcerun重跑上游规则
重跑上游规则时,使用--forcerun替代--force,该参数会强制执行规则并更新Snakemake的内部执行记录:
snakemake --snakefile bad.snakefile --cores 1 --forcerun realoutput
之后再次执行完整工作流,Snakemake会检测到上游规则已重新执行,自动触发下游的runall规则。
方法2:在规则中指定rerun_triggers为mtime
修改Snakefile,为下游规则添加rerun_triggers: mtime,让Snakemake仅根据输入文件的mtime判断是否重跑:
rule runall: input: "bye.txt" output: "hello.txt" rerun_triggers: mtime shell: "echo hello > {output}" rule realoutput: output: "bye.txt" shell: "echo bye > {output}"
修改后,无论用--force还是其他方式更新bye.txt的mtime,再次执行完整工作流时runall都会自动触发。
方法3:手动触发下游规则(应急方案)
如果仅需单次触发下游规则,可直接指定重跑下游规则,无需强制全量执行:
snakemake --snakefile bad.snakefile --cores 1 --forcerun runall
内容的提问来源于stack exchange,提问作者Fonnae
相关产品推荐
相关产品推荐

