python-3.x Snakemake在其他规则中重用规则的好方法

a2mppw5e  于 4个月前  发布在  Python
关注(0)|答案(1)|浏览(55)

我想在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以特定的顺序运行规则(没有明显的解决方案,使每个规则相互依赖,这不是固体请)?
bvn4nwqk

bvn4nwqk1#

我没有测试过,但我认为你可以通过滥用检查点语法来完成从另一个规则调用一个规则。将你的clean规则变成一个检查点(或添加一个依赖于clean的中间规则)。接下来,将你的re输入为这样的函数:

def re_input(wildcards):
    checkpoints.clean.get().output  # force running clean
    return ALL_INPUTS  # may be able to use rules.all.input?

字符串
检查点强制该规则首先运行,然后返回所有规则的正常输出。
对于你的第二个问题,你可以使用优先级来确保clean首先运行。你仍然需要有假的触摸文件来让一切运行,但在那之后,clean将首先运行。

相关问题