如何避免Snakemake中输入文件更新时重跑无关规则?
解决Snakemake仅重跑rule b而不触发rule c的问题
直接解决方案:指定目标文件为b
当你只需要重新生成b而不想触发c的重跑时,无需修改工作流代码,只需在运行Snakemake时明确指定目标为文件b,而非默认执行rule all:
snakemake -s ./test_simple.smk --cores b
这样Snakemake只会处理生成b所需的依赖链(若a已存在,则仅运行rule b),不会处理rule c——因为目标列表中未包含c。
为什么你之前的尝试无效?
ancient("b")修饰符ancient的作用是将标记的文件视为"永远最新",但仅适用于已存在的旧文件。当你删除b后重新生成它时,新b的修改时间会晚于已存在的c,此时Snakemake仍会判定c的输入(新b)比输出(旧c)更新,因此依然会触发rule c的重跑。--rerun-triggers code参数
该参数仅在规则代码本身发生变更(比如shell命令、输入输出定义修改)时才触发重跑。而你遇到的场景是输入文件b被重新生成,属于输入文件的时间戳变更,不在该参数的触发范围内,因此rule c仍会因输入更新被执行。
其他可选临时方案
- 临时修改
rule all:暂时将rule all输入中的'c'移除,运行后再恢复,但灵活性不如指定目标文件。 - 手动更新
c的时间戳:运行Snakemake前执行touch c,让c的修改时间晚于即将生成的b,Snakemake会判定c已处于最新状态,不会重跑。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

