什么是防止snakemake在shell / R错误时失败的优雅方法?

时间:2017-08-10 12:33:27

标签: snakemake

我希望能够让我的snakemake工作流程继续运行,即使某些规则失败。

例如,我使用各种工具来执行ChIP-seq数据的峰值调用。但是,某些程序在无法识别峰值时会发出错误。在这种情况下,我宁愿创建一个空的输出文件,而不是让snakemake失败(就像一些峰值调用者已经做过的那样)。

使用" shell"是否有类似蛇形的处理此类案件的方法并且"运行"关键字?

由于

1 个答案:

答案 0 :(得分:3)

对于shell命令,您始终可以利用条件“或”,||

rule some_rule:
    output:
        "outfile"
    shell:
        """
        command_that_errors || true
        """

# or...

rule some_rule:
    output:
        "outfile"
    run:
        shell("command_that_errors || true")

通常退出代码为零(0)表示成功,任何非零表示失败。当命令以非零退出代码退出时,包含|| true可确保成功退出(true始终返回0)。

如果需要允许特定的非零退出代码,可以使用shell或Python来检查代码。对于Python,它将类​​似于以下内容。使用shlex.split()模块,因此shell命令不需要作为参数数组传递。

import shlex

rule some_rule:
    output:
        "outfile"
    run:
        try:
           proc_output = subprocess.check_output(shlex.split("command_that_errors {output}"), shell=True)                       
        # an exception is raised by check_output() for non-zero exit codes (usually returned to indicate failure)
        except subprocess.CalledProcessError as exc: 
            if exc.returncode == 2: # 2 is an allowed exit code
                # this exit code is OK
                pass
            else:
                # for all others, re-raise the exception
                raise

在shell脚本中:

rule some_rule:
    output:
        "outfile"
    run:
        shell("command_that_errors {output} || rc=$?; if [[ $rc == 2 ]]; then exit 0; else exit $?; fi")