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.htmlall规则:以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
相关产品推荐
相关产品推荐

