Snakemake:将命令行参数传递给脚本。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Snakemake:将命令行参数传递给脚本。相关的知识,希望对你有一定的参考价值。

我正在使用Snakemake的一些python脚本来自动化工作流程。这些脚本使用的是命令行参数,虽然我可以将它们替换为 snakemake.input[0], snakemake.output[0]等,我不愿意这样做,因为我也希望能够在Snakemake之外使用它们。

解决这个问题的一个自然方法--也就是我一直在做的--是将它们作为一个 shell 而非 script. 然而,当我这样做时,依赖图被破坏了;我更新了我的脚本,但DAG不认为任何东西需要重新运行。

有没有一种方法可以将命令行参数传递给脚本,但仍然作为脚本运行?

编辑:一个例子

我的python脚本

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-o", type=str)
args = parser.parse_args()

with open(args.o, "w") as file:
    file.write("My file output")

我的蛇形档案

rule some_rule:
    output: "some_file_name.txt"
    shell: "python my_script.py -o {output}"
答案

听起来你需要的是使用 argparse 在你的python脚本中。下面是一个例子,python脚本通过命令行接受参数。

  • Python脚本 example.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-i", "--infile", help="Filepath")
parser.add_argument("-o", "--outfile", help="Filepath")
args = parser.parse_args()

infilepath = args.infile
outfilepath = args.outfile
# blah blah code
  • 蛇形档案
rule xx:
input: "in.txt"
output: "out.txt"
shell: "python example.py -i {input} -o {output}"

PS - 当我懒惰的时候,我只用了 灭火 库而不是 argparse。Fire很容易用几行代码就把函数类暴露给命令行。

另一答案

根据 @troy-comi 的评论,我一直在做以下的事情,虽然有点黑,但却完全符合我的要求。我把脚本定义为snakemake规则的输入,这实际上也有助于提高可读性。一个典型的规则(这不是一个完整的 MWE)可能是这样的

rule some_rule:
    input:
        files=expand("path_to_files/f", f=config["my_files"]),
        script="scripts/do_something.py"
    output: "path/to/my/output.txt"
    shell: "python {input.script} -i {input.files} -o {output}"

当我修改脚本时,它会触发重新运行;它是可读的;而且它不需要我插入 snakemake.output[0] 在我的python脚本中(使它们很难在这个工作流程之外被回收)。

以上是关于Snakemake:将命令行参数传递给脚本。的主要内容,如果未能解决你的问题,请参考以下文章

将命令行参数传递给python脚本[重复]

将命令行参数传递给 package.json 中的 npm 脚本

如何将强制和可选命令行参数传递给 perl 脚本?

如何将命令行参数传递给 spark-shell scala 脚本?

将命令行参数传递给调用带有装饰器参数的装饰函数的函数

使用 argparser 将参数传递给入口点 python 脚本