我正在创建一个简单的snakemake管道,它在Snakefile中包含全局变量。在我的规则中调用的Python脚本中使用这些全局变量的推荐方法是什么?
我目前使用argparse命令行参数如下所述(snake makake:传递命令行参数到脚本),但我想知道是否有更好的方法。
传递变量
如果变量是在Snakefile中指定的,那么它可以通过params
传递。例如,
Snakefile
# global variable to use
FOO = 100
rule test:
input: "a.in"
output: "a.out"
params:
foo=FOO # pass the variable value as 'foo'
script: "scripts/test.py"
脚本/test.py
#!/usr/bin/env python
# access the variable through the `snakemake` object
print(snakemake.params.foo)
参见外部Python脚本的Snakemake文档。
附加评论
注意,通常我发现更好的做法是将上面的例子中的变量放在config.yaml
中。这有助于集中可调参数,为重用提供单点配置。尽管snakemake.config
在外部脚本中是可用的,但我仍然倾向于将配置值显式地传递为params
,以便明确哪些规则取决于哪些配置值。
例子config.yaml
foo: 100
Snakefile
configfile: "config.yaml"
rule test:
input: "a.in"
output: "a.out"
params:
foo=config["foo"]
script: "scripts/test.py"
脚本/test.py
#!/usr/bin/env python
# access the variable through the `snakemake` object
print(snakemake.params.foo)
覆盖配置参数
如果config.yaml
中提供了该值,那么还可以(可选地)在CLI中覆盖它:
snakemake --config foo=150
参见配置参数的文档。