我想在Snakefile中创建一个可以调用其他规则的规则。
例如,我想创建一个规则re
,它调用clean
及其之后的all
。
以下是Makefile版本:
.PHONY=all clean re
all: toto.txt
toto.txt:
touch toto.txt
clean:
rm toto.txt
re: clean all
字符串
在这个Makefile中,re
导致创建的文件完全重新生成。
我在Snakemake中寻找了很多方法,我没有找到一个愉快的方法。
以下是我的研究结果:
- 在shell部分调用snakemake(不可能,坏主意)
- 复制
re
中的规则内容(不可能,我的真实的案例对此来说太复杂了)。 - 我们可以访问输入和输出中的“rules”参数。我没有找到一种方法来“调用”其他规则。你有什么想法吗?
- 我们可以把
touch("rule.done")
放在被调用规则的输出中,然后在“re”规则中调用它们。这些文件在文档中称为Flag文件。问题是,规则完成后会留下一些文件,所以我发现... - 我们可以把
temp("filename")
放在被调用规则的输出中,让Snakefile在运行后删除它们。
因此,我的snakefiler最终是这样的:
rule all:
input: toto.txt
output: temp(touch("all.done"))
rule generate_toto:
output: toto.txt
shell: touch toto.txt
rule clean:
output: temp(touch("clean.done"))
shell: rm toto.txt
rule re:
input: "all.done", "clean.done"
型
但它不起作用,因为Snakemake启动规则的顺序是:
generate_toto > clean > all
这会导致超时,因为作业all
等待toto.txt的创建。我没有找到一种方法告诉Snakemake在执行all
之前只执行clean
。
看起来这是一个小问题,但它只是一个例子,而不是我的真实的情况:我想all
调用一个启动脚本的规则,但我不能这样做。我的.PHONY在哪里?:'(
所以继续说:
- 我们如何从一个规则中调用其他规则?
- 我们怎么能让Snakemake以特定的顺序运行规则(没有明显的解决方案,使每个规则相互依赖,这不是固体请)?
1条答案
按热度按时间bvn4nwqk1#
我没有测试过,但我认为你可以通过滥用检查点语法来完成从另一个规则调用一个规则。将你的clean规则变成一个检查点(或添加一个依赖于clean的中间规则)。接下来,将你的
re
输入为这样的函数:字符串
检查点强制该规则首先运行,然后返回所有规则的正常输出。
对于你的第二个问题,你可以使用优先级来确保
clean
首先运行。你仍然需要有假的触摸文件来让一切运行,但在那之后,clean将首先运行。