当文件丢失时,SnakeMake是否可以强制重新运行规则

问题描述 投票:3回答:2

当删除管道中早期创建的文件时,SnakeMake似乎不会考虑这个问题,只要以后的文件存在:

rule All:
    input: "testC1.txt", "testC2.txt"

rule A:
    input: "{X}{Y}.txt"
    output: "{X}A{Y}.txt"
    shell: "cp {input} {output}"

rule B:
    input: "{X}A{Y}.txt"
    output: "{X}B{Y}.txt"
    shell: "cp {input} {output}"

rule C:
    input: "{X}B{Y}.txt"
    output: "{X}C{Y}.txt"
    shell: "cp {input} {output}"

将此SnakeFile保存在test.sf中并执行以下操作:

rm testA*.txt testB*.txt testC*.txt
echo "test1" >test1.txt
echo "test2" >test2.txt
snakemake -s test.sf
# Rerun:
snakemake -s test.sf
# SnakeMake says all is up to date, which it is.
# Remove intermediate results:
rm testA1.txt
# Rerun:
snakemake -s test.sf

SnakeMake表示一切都是最新的。它没有检测到缺少testA1.txt。

我似乎记得在线SnakeMake手册中有关于此的内容,但我无法再找到它。

我认为这是预期的SnakeMake行为。它有时可能是期望的行为,但有时您可能希望它检测并重建丢失的文件。如何才能做到这一点?

delete-file snakemake
2个回答
2
投票

我刚才发现这个thread关于可能提供信息的--forcerun / -R参数。

最终,如果您想要重新生成该中间文件而没有针对它的单独规则或将其作为目标包含在内,则snakemake将强制执行整个管道。


1
投票

正如this other answer中提到的,-R参数可以提供帮助,但还有更多选择:

Force a rebuild of the whole workflow

你打电话的时候

snakemake -F

这将触发整个管道的重建。这基本上意味着,忘记所有中间文件并重新开始。这肯定会(重新)生成所有中间文件。缺点是:可能需要一些时间。

Force a specific rule

这是-R <rule>参数的领域。这将重新运行给定规则以及依赖于它的所有规则。所以在你的情况下

snakemake -R A -s test.sf

将重新运行规则A(从testA1.txt构建test.txt)和规则B,C和All,因为它们依赖于A.请注意,这将运行所需的规则A的所有副本,因此在您的示例中testA2.txt及其后续的所有内容也是重建。

如果在您的示例中,您将删除testB1.txt,则只会重新运行规则BC

Why does this happen?

如果我没记错的话,snakemake会检测文件是否需要通过utime重建。因此,如果您的testA1.txt版本比testB1.txt更年轻(如最近创建的那样),testB1.txt必须使用rule B重建,以确保一切都是最新的。因此,除非你以某种方式更改文件的utimes,否则你不能轻易地重建testA1.txt而不构建所有后续文件。

我没有试过这个,但这可以用snakemakes --touch参数完成。如果您设法仅运行规则A然后运行snakemake -R B -t,它接触规则B及其后的所有输出文件,您可以获得有效的工作流状态而无需实际重新运行其间的所有步骤。

© www.soinside.com 2019 - 2024. All rights reserved.