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:将命令行参数传递给脚本。的主要内容,如果未能解决你的问题,请参考以下文章
将命令行参数传递给 package.json 中的 npm 脚本