有没有办法以编程方式列出Snakefile中每条规则创建的日志文件?我是否必须使用DAG,如果是,那该怎么办?
背景:我想捆绑并删除所有创建的日志文件(只有群集日志位于单独的文件夹中;某些输出文件具有相应的日志文件)。为此,我希望具体并排除可能由运行程序创建的日志文件,并且巧合地匹配日志glob。
是否有替代品,例如解析shellcmd_tracking文件会更容易吗?
谢谢, 安德烈亚斯
答案 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=['*'])])
通过这个修改,我几乎获得了相同的文件名列表。唯一不同的是它们出现的顺序。