Python 在规则中使用配置数据的语法
在snakemake规则中是否有充分描述配置数据使用的地方 在yaml文件的用户指南中有一个示例:Python 在规则中使用配置数据的语法,python,output,config,snakemake,Python,Output,Config,Snakemake,在snakemake规则中是否有充分描述配置数据使用的地方 在yaml文件的用户指南中有一个示例: samples: A: data/samples/A.fastq B: data/samples/B.fastq 然后,在这样的规则中使用: bam=expand("sorted_reads/{sample}.bam", sample=config["samples"]), 上面的代码似乎将{sample}替换为“data/samples/A.fastq”,而不是“A”(和“B
samples:
A: data/samples/A.fastq
B: data/samples/B.fastq
然后,在这样的规则中使用:
bam=expand("sorted_reads/{sample}.bam", sample=config["samples"]),
上面的代码似乎将{sample}替换为“data/samples/A.fastq”,而不是“A”(和“B”等),显然是这样
在输出规则中使用配置数据的正确方法是什么,例如帮助形成输出文件名?此表单不起作用:
output: "{config.dataFolder}/{ID}/{ID}.yyy"
如果我在yaml文件中定义了复杂的结构化数据,我正在寻找语法指导——如何在snake规则中使用它?何时使用Python语法,何时使用SnakeMake语法
yaml和JSON配置文件受到严重限制,因为它们不能使用文件前面定义的值来定义新值,对吗?这是设置配置参数时经常要做的事情
使用configfile的优势是什么?为什么不直接使用include:include和python文件来定义参数呢
一个有用的东西将是一个参考手册,详细描述了蛇的细节。当前的网站有点分散,需要一段时间才能找到您以前在其中某个地方看到的东西。YAML配置
这与YAML文件的嵌套有关,请参见示例
config[“samples”]请求将同时返回“A”和“B”。我是我的脑袋,我想它会返回一个列表,但我对变量类型没有把握
通过使用此处列出的配置文件:
您可以以YAML格式链接以下YAML配置文件
settings/config.yaml:
或
settings/config.yaml:
使用YAML配置访问的结果调用
蛇形档案:
虚拟示例,只是尝试举例说明不同字符串和配置变量的使用。我在fastq2bam规则中使用通配符。通常,我只使用配置变量来设置规则“all”中的内容,如果可能,这是最佳实践。我不能说shell调用是否真的适用于bwamem,但我想你已经明白我的意思了
可以看到更大版本的蛇形文件
一旦设置好配置文件,要引用其中的任何内容,请使用“config”。根据需要,它可用于深入YAML。在这里,我将下降3个假设水平,如下所示:
hypothetical_var = config["yamlVarLvl1"]["yamlVarLvl2"]["yamlVarLvl3"]
等同于(我对键入不太肯定,我认为它会转换为字符串)
如果YAML是:
yamlVarLvl1:
yamlVarLvl2:
yamlVarLvl3:
'124'
'125'
'126'
'127'
'128'
'129'
代码组织
Python和Snakemake代码,在大多数情况下可以在某些地方交错。我建议不要这样做,因为这样会使代码难以维护。由用户决定如何实现这一点。例如,使用run或shell指令可以更改访问变量的方式
YAML和JSON文件是首选的配置变量文件,因为我相信它为编辑和命令行界面提供了一些支持,而不是消除变量。如果它是使用外部导入的python变量实现的,那么它就没有那么干净了。它还帮助我的大脑,知道python文件做事情,YAML文件存储事情
YAML始终是一个外部文件,但是
这是否提供了足够的上下文?在“输出”规则中应该如何使用配置数据?我发现输出字符串不能包含{config.}值。但是,可以使用Python代码包含它们,如下所示:
output: config["OutputDir"] + "/myfile.txt"
但是,此方法不起作用(在输出:或输入:):
但是,它在“shell:”中确实起作用:
请注意,在shell cmd的[]中,OutputDir周围没有引号。在字符串中展开值的{}方法不在键周围使用引号
配置数据可以按snakefile或python定义吗?对!
参数可以在使用“configfile”包含的.yaml文件中定义,也可以通过使用“include”包含的常规Python文件定义。后者比IMHO优越,因为.yaml文件不允许定义引用以前的定义,这在所有配置文件中都很常见,但最简单的配置文件除外
要使用yaml定义上述“OutputDir”参数:
xxx.yaml:
OutputDir: DATA_DIR
蛇形档案:
configfile: 'xxx.yaml'
include: 'xxx.py'
include: 'xxx.py'
rule:
output: OutputDir + "/myfile.txt"
要使用Python将其定义为与上述内容完全兼容,请执行以下操作:
xxx.py:
config['OutputDir'] = "DATA_DIR"
OutputDir = "DATA_DIR"
蛇形档案:
configfile: 'xxx.yaml'
include: 'xxx.py'
include: 'xxx.py'
rule:
output: OutputDir + "/myfile.txt"
或者,在包含Python的配置文件中定义一个简单变量“OutputDir”,然后在规则中使用它:
xxx.py:
config['OutputDir'] = "DATA_DIR"
OutputDir = "DATA_DIR"
蛇形档案:
configfile: 'xxx.yaml'
include: 'xxx.py'
include: 'xxx.py'
rule:
output: OutputDir + "/myfile.txt"
可以通过.yaml文件和python文件轻松定义和访问多嵌套字典和列表。例如:
MACBOOK> cat cfgtest.yaml
cfgtestYAML:
A: 10
B: [1, 2, 99]
C:
nst1: "hello"
nst2: ["big", "world"]
MACBOOK> cat cfgtest.py
cfgtestPY = {
'X': -2,
'Y': range(4,7),
'Z': {
'nest1': "bye",
'nest2': ["A", "list"]
}
}
MACBOOK> cat cfgtest
configfile: "cfgtest.yaml"
include: "cfgtest.py"
rule:
output: 'cfgtest.txt'
params: YAML=config["cfgtestYAML"], PY=cfgtestPY
shell:
"""
echo "params.YAML[A]: {params.YAML[A]}" >{output}
echo "params.YAML[B]: {params.YAML[B]}" >>{output}
echo "params.YAML[B][2]: {params.YAML[B][2]}" >>{output}
echo "params.YAML[C]: {params.YAML[C]}" >>{output}
echo "params.YAML[C][nst1]: {params.YAML[C][nst1]}" >>{output}
echo "params.YAML[C][nst2]: {params.YAML[C][nst2]}" >>{output}
echo "params.YAML[C][nst2][1]: {params.YAML[C][nst2][1]}" >>{output}
echo "" >>{output}
echo "params.PY[X]: {params.PY[X]}" >>{output}
echo "params.PY[Y]: {params.PY[Y]}" >>{output}
echo "params.PY[Y][2]: {params.PY[Y][2]}" >>{output}
echo "params.PY[Z]: {params.PY[Z]}" >>{output}
echo "params.PY[Z][nest1]: {params.PY[Z][nest1]}" >>{output}
echo "params.PY[Z][nest2]: {params.PY[Z][nest2]}" >>{output}
echo "params.PY[Z][nest2][1]: {params.PY[Z][nest2][1]}" >>{output}
"""
MACBOOK> snakemake -s cfgtest
Provided cores: 1
Rules claiming more threads will be scaled down.
Job counts:
count jobs
1 1
1
rule 1:
output: cfgtest.txt
jobid: 0
Finished job 0.
1 of 1 steps (100%) done
MACBOOK> cat cfgtest.txt
params.YAML[A]: 10
params.YAML[B]: 1 2 99
params.YAML[B][2]: 99
params.YAML[C]: {'nst1': 'hello', 'nst2': ['big', 'world']}
params.YAML[C][nst1]: hello
params.YAML[C][nst2]: big world
params.YAML[C][nst2][1]: world
params.PY[X]: -2
params.PY[Y]: range(4, 7)
params.PY[Y][2]: 6
params.PY[Z]: {'nest1': 'bye', 'nest2': ['A', 'list']}
params.PY[Z][nest1]: bye
params.PY[Z][nest2]: A list
params.PY[Z][nest2][1]: list
在snakemake规则中是否有充分描述配置数据使用的地方
如果可以将配置文件解析为python对象,则可以在配置文件中输入的内容没有限制。基本上,“你的想象力就是极限”
在输出规则中使用配置数据的正确方法是什么,例如帮助形成输出文件名
我从配置中提取规则之外的东西,使用纯python
我将执行以下操作,而不是输出:“{config.dataFolder}/{ID}/{ID}.yyy”
:
data_folder = config.dataFolder
rule name_of_the_rule:
output:unction
os.path.join(data_folder, "{ID}", "{ID}.yyy")
我猜,在您尝试的情况下,snakemake在设置字符串格式时遇到了一些问题,其中包括来自通配符和其他内容的混合。但是,在Python3.6中,使用:output:f“{conf