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

Snakemake 7.22.0文件/目录更新处理机制实操疑问

Snakemake 7.22.0目录修改未触发重执行的问题

问题描述

我在使用Snakemake 7.22.0时,对其缓存及文件/目录更新机制存在疑惑,搭建了一个简单演示工作流:data目录下包含input.txt,首次执行命令snakemake -c1 report.html一切正常,重复执行时无操作符合预期。随后我修改输出目录data/dir1(执行touch data/dir1),再次运行该命令后,却未触发augmentation1及report规则的重执行;我还尝试了--touch和--rerun-trigger mtime选项,均无效果。请问这是该工具的预期行为吗?

工作流流程

工作流逻辑如下:

  • load规则:以data/input.txt为输入,生成data/dir1/和data/dir2/两个目录
  • augmentation1规则:依赖data/dir1/,生成data/dir_aug1目录
  • augmentation2规则:依赖data/dir2/,生成data/dir_aug2目录
  • report规则:依赖data/dir_aug1和data/dir_aug2,生成report.html
  • all规则:以report.html为最终目标

工作流代码

rule all:
    input:
        "report.html"

rule load:
    input:
        "data/input.txt"
    output:
        directory("data/dir1/"),
        directory("data/dir2/")
    shell:
        """
        mkdir -p {output[0]}
        mkdir -p {output[1]}
        """

rule augmentation1:
    input:
        "data/dir1/"
    output:
        directory("data/dir_aug1")
    shell:
        """
        mkdir -p {output}
        """

rule augmentation2:
    input:
        "data/dir2/"
    output:
        directory("data/dir_aug2")
    shell:
        """
        mkdir -p {output}
        """

rule report:
    input:
        "data/dir_aug1",
        "data/dir_aug2"
    output:
        "report.html"
    shell:
        "touch report.html"

解答

这是Snakemake的预期行为,核心原因在于其对目录的追踪逻辑:

  • 当用directory()声明输出目录时,Snakemake默认仅追踪目录的存在性,不会监测目录本身的修改时间(mtime)变化。touch data/dir1只是修改了目录的mtime,但目录仍存在,因此不会被判定为输入更新。
  • --rerun-trigger mtime选项默认仅作用于文件,对目录无效。除非明确配置让Snakemake追踪目录内的文件变化(比如通过glob_wildcards引用目录内文件作为输入),否则修改目录本身的mtime不会触发下游规则重执行。

若需让目录变化触发重执行,可采用以下方案调整:

  • 将目录内的具体文件作为规则输入,而非目录本身
  • 使用checkpoint配合动态文件生成,让Snakemake监测目录内容的变化
  • 临时使用--force选项强制重跑目标规则,但这并非长效解决方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:24:28