如何阻止Snakemake重新生成指定输入文件?
解决Snakemake测试中输入文件被误判过期的问题
针对你开发的Snakemake工作流测试框架,要阻止Snakemake重新生成输入文件、仅运行指定测试规则,这里给你几个可行的落地方案:
1. 用--rules实现规则白名单
Snakemake的--rules参数可以直接指定仅运行哪些规则,完全符合你要的白名单需求。执行时Snakemake只会处理你列出的规则,以及这些规则直接依赖的已存在输入(不会触发上游规则重生成输入),如果指定规则无法生成目标(比如依赖缺失)会直接报错,刚好适配测试场景。
示例命令:
snakemake --rules test_rule1,test_rule2 --directory ./test_workdir
2. 配置--rerun-triggers避免误触发重跑
--rerun-triggers的可选值包括:mtime, checksum, input, params, wildcards, software-env, container。要避免因输入文件的时间或内容变化触发重跑,你可以把触发条件限制为仅当规则参数或通配符变化时才重跑:
示例命令:
snakemake --rules test_rule --rerun-triggers params,wildcards
这样设置后,只要输入文件对应的规则参数和通配符没变化,哪怕文件mtime更新,Snakemake也不会认为它过期。
3. 用--touch标记输入文件为最新
关于--touch的工作机制,明确两点:
- 它会更新目标文件(包括软链接)的mtime到当前时间,软链接的话更新的是链接本身的时间,不是源文件
- 同时会在
.snakemake/metadata目录中记录文件状态,标记为已更新,让Snakemake认定它是最新版本
你可以在测试前先对所有输入文件执行touch操作,彻底避免Snakemake判定输入过期:
示例命令:
snakemake --touch input_file1.txt input_file2.bam --directory ./test_workdir
优化后的完整测试流程
把上述方案结合起来,你的测试流程可以调整为:
- 创建空工作目录
- 将输入文件复制或软链接至该目录
- 标记输入文件为最新:
snakemake --touch $(echo ${INPUT_FILES[@]}) --directory ./test_workdir - 仅运行待测试规则并限制重跑触发条件:
snakemake --rules <target-rules> --rerun-triggers params,wildcards --directory ./test_workdir - 检查预期输出文件的存在性与内容一致性
内容的提问来源于stack exchange,提问作者JaredL
相关产品推荐
相关产品推荐

