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

如何避免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。

为什么你之前的尝试无效?

  1. ancient("b")修饰符
    ancient的作用是将标记的文件视为"永远最新",但仅适用于已存在的旧文件。当你删除b后重新生成它时,新b的修改时间会晚于已存在的c,此时Snakemake仍会判定c的输入(新b)比输出(旧c)更新,因此依然会触发rule c的重跑。

  2. --rerun-triggers code参数
    该参数仅在规则代码本身发生变更(比如shell命令、输入输出定义修改)时才触发重跑。而你遇到的场景是输入文件b被重新生成,属于输入文件的时间戳变更,不在该参数的触发范围内,因此rule c仍会因输入更新被执行。

其他可选临时方案

  • 临时修改rule all:暂时将rule all输入中的'c'移除,运行后再恢复,但灵活性不如指定目标文件。
  • 手动更新c的时间戳:运行Snakemake前执行touch c,让c的修改时间晚于即将生成的b,Snakemake会判定c已处于最新状态,不会重跑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:38:29