访问由snakemake规则创建的日志文件

时间:2016-11-15 05:49:12

标签: python glob snakemake

有没有办法以编程方式列出Snakefile中每条规则创建的日志文件?我是否必须使用DAG,如果是,那该怎么办?

背景:我想捆绑并删除所有创建的日志文件(只有群集日志位于单独的文件夹中;某些输出文件具有相应的日志文件)。为此,我希望具体并排除可能由运行程序创建的日志文件,并且巧合地匹配日志glob。

是否有替代品,例如解析shellcmd_tracking文件会更容易吗?

谢谢, 安德烈亚斯

2 个答案:

答案 0 :(得分:3)

使用即将发布的版本3.9.0,您可以在调用snakemake --summary时查看所有输出文件的相应日志文件。

答案 1 :(得分:1)

您可以尝试执行以下操作

onsuccess:
    for rulename in dir(rules):
        the_rule = getattr(rules, rulename)
        if hasattr(the_rule, "log"):
            print(rulename, ":\t", getattr(the_rule, "log"))

同样在onerror

如果规则的日志文件中有一些通配符,则可以将其放入展开状态,以生成真实的日志文件名。

我刚试过这个:

LETTERS = ["A", "B"]
NUMS = ["1", "2"]


rule all:
    input:
        expand("combined_{letter}.txt", letter=LETTERS)

rule generate_text:
    output:
    "text_{letter}_{num}.txt"
    log:
        "text_{letter}_{num}.log"
    shell:
        """
        echo "test" > {output} 2> {log}
        """

rule combine_text:
    input:
        expand("text_{{letter}}_{num}.txt", num=NUMS)
    output:
        "combined_{letter}.txt"
    shell:
        """
        cat {input} > {output}
        """

onsuccess:
    for rulename in dir(rules):
        the_rule = getattr(rules, rulename)
        if hasattr(the_rule, "log"):
            print(rulename, ":\t", expand(getattr(the_rule, "log"), letter=LETTERS, num=NUMS))

我最后获得了以下输出:

all :    []
combine_text :   []
generate_text :  ['text_A_1.log', 'text_B_1.log', 'text_A_2.log', 'text_B_2.log']

问题是,这会显示您的snakefile可能生成的所有日志文件,而不是特定运行中实际生成的日志文件(例如,如果某些规则不需要这次执行)。

编辑:扩展日志文件名的另一种方法

onsuccess(或onerror)事情可以不同方式完成,以适应实际生成的日志文件:

import glob
onsuccess:
    for rulename in dir(rules):
        the_rule = getattr(rules, rulename)
        if hasattr(the_rule, "log"):
            print(rulename, ":\t", *[glob.glob(pattern) for pattern in expand(getattr(the_rule, "log"), letter=['*'], num=['*'])])

通过这个修改,我几乎获得了相同的文件名列表。唯一不同的是它们出现的顺序。