从snakemake记录执行的shell命令

时间:2018-03-29 09:16:00

标签: snakemake

我想将每个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}
        """

这可能吗?谢谢!

1 个答案:

答案 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选项。