次のことを試みることができます
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=['*'])])
この変更により、ほぼ同じファイル名のリストが得られます。唯一の違いは、それらが表示される順序です。