如何避免在输入或中间输出文件更新后运行Snakemake规则

19
即使Snakemake构建的输出文件已经存在,只要我修改了第一个输入或中间输出文件,Snakemake就希望重新运行整个管道。我通过使用-n进行Snakemake干运行来找出这个问题,并得到了以下更新输入文件的报告:
Reason: Updated input files: input-data.csv

并且这条消息是更新中介文件的

reason: Input files updated by another job: intermediary-output.csv

我该如何强制Snakemake忽略文件更新?

3个回答

16
您可以使用选项--touch来标记它们为最新状态:

--touch,-t
触摸输出文件(将它们标记为最新状态而不实际更改它们),而不是运行它们的命令。这用于假装规则已执行,以欺骗未来的snakemake调用。如果文件尚不存在,则失败。

请注意,这将触摸所有文件,因此修改时间戳以将它们放回到正确的顺序。

12
除了Eric的回答,还可以看看忽略输入文件时间戳的ancient标志。
此外,请注意Unix命令touch可用于修改现有文件的时间戳并使其看起来比实际上更旧。
touch --date='2004-12-31 12:00:00' foo.txt 
ls -l foo.txt 
-rw-rw-r-- 1 db291g db291g 0 Dec 31  2004 foo.txt 

3
实际上,如果问题只出现在一个文件上,我建议使用@dariober的方法,使用Unix中的touch命令,并指定早于工作流程后续输出日期的日期。 - Eric C.

2
如果使用--touch(官方文档称需要与--force--forceall--forcerun一起使用,以强制进行“touch”操作),但并未按预期工作,则ancient不是一个选项,或者需要从工作流文件中修改太多内容,或者遇到了https://github.com/snakemake/snakemake/issues/823(当我尝试使用--force--force*时发生了这种情况)。为了解决这个问题,我做了以下几步:

  1. 我注意到有些任务不应该运行,因为我已经把文件放在了预期的路径中。
  2. 我确定了那些规则的输入和输出文件是我不想要运行的
  3. 按照执行的规则顺序,并且我不想要的规则先执行,我对输入文件和输出文件分别执行了touch操作(考虑规则的顺序!)。

就这样。由于现在时间戳根据规则顺序和输入输出文件更新,因此snakemake将不会检测到任何“更新”的文件。

这是手动方法,我认为如果其他人提到的方法不起作用或者无法使用,这可能是最后的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接