当删除管道中较早创建的文件时,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 的预期行为。它有时可能是所需的行为,但有时您可能希望它检测并重建丢失的文件。如何才能做到这一点?
最佳答案
如 this other answer 中所述, -R
参数可以提供帮助,但还有更多选项:
强制重建整个工作流程
你打电话时
snakemake -F
这将触发整个管道的重建。这基本上意味着,忘记所有中间文件并重新开始。这肯定会(重新)生成所有中间文件。缺点是:可能需要一些时间。
强制执行特定规则
这是
-R <rule>
的境界范围。这将重新运行给定的规则和所有依赖于它的规则。所以在你的情况下snakemake -R A -s test.sf
将重新运行规则 A(从
testA1.txt
构建 test.txt
)和规则 B、C 和 All,因为它们依赖于 A。请注意,这会运行所需的规则 A 的所有副本,因此在您的示例中 testA2.txt
随之而来的一切也是重建。如果在您的示例中,您会删除
testB1.txt
相反,只有规则 B
和 C
会被重新运行。为什么会发生这种情况?
如果我没记错的话,snakemake 会检测文件是否需要通过其 utime 重建。所以如果你有一个版本的
testA1.txt
比 testB1.txt
更年轻(如最近创建的) , testB1.txt
必须使用 rule B
重建,以确保一切都是最新的。因此,您不能轻易地仅重建 testA1.txt
除非您以某种方式更改文件的 utime,否则无需构建所有后续文件。我还没有尝试过,但这可以用蛇形做
--touch
范围。如果您设法只运行规则 A
然后运行 snakemake -R B -t
,它涉及规则 B
的所有输出文件然后,您可以获得有效的工作流状态,而无需实际重新运行其间的所有步骤。
关于delete-file - 文件丢失时 SnakeMake 是否可以强制重新运行规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45989802/