我想将每个snakemake作业执行的shell命令保存到日志文件中。
使用--printshellcmds
我可以在提交时打印到stdout shell命令,但我想将它们保存到单个文件中。例如,这个脚本:
samples= ['a', 'b', 'c']
rule all:
input:
expand('{sample}.done', sample= samples),
rule do_stuff:
output:
'{sample}.done'
shell:
"""
echo {wildcards.sample} > {output}
"""
将执行3个作业:
echo a > a.done
echo c > c.done
echo b > b.done
我想将其中的每一个保存到以通配符(或其他)命名的单独文件中。像:
rule do_stuff:
output:
'{sample}.done'
log_shell: < save shell command
'{sample}.cmd.log' <
shell:
"""
echo {wildcards.sample} > {output}
"""
这可能吗?谢谢!
答案 0 :(得分:0)
在摆弄其他issues时,我想出了这个解决方案。将run
指令与shell
函数组合,首先将命令写入文件,然后执行命令本身。例如:
rule do_stuff:
output:
'{sample}.done'
log:
cmd= 'my/logs/{sample}.log'
run:
cmd= """
echo hello > {output}
"""
shell("sort --version > {log.cmd} || true") # Log version
shell("cat <<'EOF' >> {log.cmd}" + cmd) # Log command
shell(cmd) # Exec command
对于每个{sample}
,您会收到一个如下所示的文件my/logs/{sample}.log
:
sort (GNU coreutils) 5.93
Copyright (C) 2005 Free Software Foundation, Inc.
echo hello > a.done
这就是诀窍。但是,它会使代码更加混乱,并且您实际上会丢失--printshellcmds
选项。