delete-file - 文件丢失时 SnakeMake 是否可以强制重新运行规则

标签 delete-file snakemake

当删除管道中较早创建的文件时,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相反,只有规则 BC会被重新运行。

为什么会发生这种情况?

如果我没记错的话,snakemake 会检测文件是否需要通过其 utime 重建。所以如果你有一个版本的 testA1.txttestB1.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/

相关文章:

python - Snakemake 中用于多输入和单输出的多个参数。 ConbineGVCFs gatk 问题

file - 根据文件是否包含字符串进行搜索然后删除

android - 如何删除cloudinary镜像到Android端?

windows-services - 卸载后无法删除服务可执行文件

google-apps-script - 自动从 Google Drive 垃圾箱中删除文件

build - 构建 conda 配方时如何修复 conda "ResolvePackageNotFound"

snakemake - 如何根据可用内核数设置线程?

wildcard - 在snakemake中,如何在分散-聚集过程中使用通配符?

java - 尝试在成功 deleteIfExists 后立即创建目录引发 AccessDenied 异常

snakemake - 如何在输入和输出中正确使用通配符