当删除管道中早期创建的文件时,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行为。它有时可能是期望的行为,但有时您可能希望它检测并重建丢失的文件。如何才能做到这一点?
我刚才发现这个thread关于可能提供信息的--forcerun
/ -R
参数。
最终,如果您想要重新生成该中间文件而没有针对它的单独规则或将其作为目标包含在内,则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
重建,以确保一切都是最新的。因此,除非你以某种方式更改文件的utimes,否则你不能轻易地重建testA1.txt
而不构建所有后续文件。
我没有试过这个,但这可以用snakemakes --touch
参数完成。如果您设法仅运行规则A
然后运行snakemake -R B -t
,它接触规则B
及其后的所有输出文件,您可以获得有效的工作流状态而无需实际重新运行其间的所有步骤。