snake规则中的全局变量



我正在创建一个简单的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

参见配置参数的文档。

最新更新