有没有办法以编程方式列出 Snakefile 中每个规则创建的日志文件?我是否必须接入 DAG,如果是,如何接入?
背景:我想捆绑并删除所有创建的日志文件(只有集群日志位于单独的文件夹中;一些输出文件相应地称为日志文件)。为此,我想明确并排除可能由运行程序创建的并且恰好匹配日志全局的日志文件。
是否有其他选择,例如解析 shellcmd_tracking 文件会更容易吗?
谢谢, 安德烈亚斯
在即将发布的 3.9.0 版本中,您可以在调用snakemake --summary
.
您可以尝试执行以下操作
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']
问题是这会显示所有可能由您的蛇文件生成的日志文件,而不是那些在特定运行中实际生成的日志文件(例如,如果这次不需要执行某些规则)。
为了适应实际生成的日志文件,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=['*'])])
通过这种修改,我几乎获得了相同的文件名列表。唯一不同的是它们出现的顺序。