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

时间:2020-04-22 16:23:06

标签: snakemake

我正在将某些python脚本与snakemake配合使用以自动化工作流程。这些脚本带有命令行参数,尽管我可以用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")

我的Snakefile

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

3 个答案:

答案 0 :(得分:1)

你能不能做一些简单的 if 语句来从snakemake 或命令行获取参数

就是

if snakemake in globals():
    get parameters from snakemake
else:
    get code some other way

答案 1 :(得分:0)

听起来像您需要的是在Python脚本中使用argparse。这是一个示例,其中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
  • Snakefile
rule xx:
input: "in.txt"
output: "out.txt"
shell: "python example.py -i {input} -o {output}"

PS-懒惰时,我只使用Fire库而不是argparse。 Fire只需几行代码即可轻松将函数/类暴露给命令行。

答案 2 :(得分:0)

基于@ troy-comi的评论,我一直在做以下工作-虽然有点hack-确实可以满足我的要求。我将脚本定义为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}"

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