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

问题描述 投票:0回答:1

我正在使用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}"
snakemake
1个回答
0
投票

听起来你需要的是使用 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很容易用几行代码就把函数类暴露给命令行。


0
投票

根据 @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脚本中(使它们很难在这个工作流程之外被回收)。

© www.soinside.com 2019 - 2024. All rights reserved.