我正在将某些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}"
答案 0 :(得分:1)
你能不能做一些简单的 if 语句来从snakemake 或命令行获取参数
就是
if snakemake in globals():
get parameters from snakemake
else:
get code some other way
答案 1 :(得分:0)
听起来像您需要的是在Python脚本中使用argparse。这是一个示例,其中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-懒惰时,我只使用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]
(使它们难以在此工作流程之外回收)。