为什么 Snakemake 更喜欢使用 script 指令调用脚本而不是从 shell 调用?

ska*_*beg 2 python bioinformatics python-3.x snakemake

标准化工作流程中的 Snakemake 规则使用指令运行 Python 脚本script,例如此模板规则:

rule XXXXX:
    input:
        ...,
    output:
        ....,
    params:
        ...,
    conda:
        "../envs/python.yaml"
    script:
        "../scripts/XXXX.py"
Run Code Online (Sandbox Code Playgroud)

然后在脚本中,可以使用snakemake对象。然而,脚本与该规则紧密耦合,这似乎是一个很大的缺点。

为什么这种方法比使用调用脚本的 shell 的方法更受青睐,例如在本规则中?

rule XXXXX:
    input:
        ...,
    output:
        ....,
    params:
        absolute_script_path = ..., # get
        argument1 = ..., 
    conda:
        "../envs/python.yaml"
    shell:
        "python {params.absolute_script_path} {input} {params.argument1} > {output}"
Run Code Online (Sandbox Code Playgroud)

在这种方法中,python 脚本与 Snakemake 规则解耦。而且它看起来更有凝聚力,因为调用的参数在规则中很清楚,而不是隐藏在脚本中。我刚刚开始编写 Snakemake 工作流程,所以我只是一个初学者。我不明白为什么第一种方法比第二种方法更受青睐(或在标准化 Snakemake 工作流程中使用)?我错过了什么吗?第二种方法有问题吗?非常感谢您的解答!

Sul*_*yev 5

就脚本可以通过 和其他指令访问的对象而言,该script方法更加灵活params

如果您遵循该shell方法,您可能会发现(重新)定义argparse或其他方法来正确考虑通过 传递的参数很麻烦shell。它主要是样板文件,但可能会变得有些乏味。

notebook指令在需要交互式复制/开发的场景中可能很有用。

总而言之,没有硬性规则,对于给定的工作流程,一种方法可能比其他方法更合适/更方便。