snakefile 中的错误 "positional argument follows keyword argument"
error "positional argument follows keyword argument" in snakefile
当我 运行 snakemake -np
它说:
SyntaxError in line 22 of /home/snakefile: positional argument follows keyword argument
好像是rule prokka
输入部分的问题,因为其他部分工作正常。
下面是我的蛇文件:
configfile:"config.yml"
id=config['id']
rule all:
input:
expand("{sample_id}/assembly/skesa/{sample_id}.fa", sample_id=id),
directory(expand("{sample_id}/annotation/prokka/", sample_id=id))
rule skesa:
output:
contigs = "{sample_id}/assembly/skesa/{sample_id}.fa"
input:
r1 = lambda wildcards: config["reads"][wildcards.sample_id]['r1'],
r2 = lambda wildcards: config["reads"][wildcards.sample_id]['r2']
params:
cpus = config['skesa']['cpus'],
memory = config['skesa']['memory']
shell:
'skesa --reads {input.r1},{input.r2} --cores {params.cpus} --memory {params.memory} > {output}'
rule prokka:
output:
faa = "{sample_id}/annotation/prokka/{sample_id}.faa",
directory("{sample_id}/annotation/prokka/{sample_id}}")
input:
contigs = rules.skesa.output.contigs
shell:
"prokka --outdir {output} --prefix {wildcards.sample_id} {params.contigs}"
问题在于:
rule prokka:
output:
faa = "{sample_id}/annotation/prokka/{sample_id}.faa",
directory("{sample_id}/annotation/prokka/{sample_id}}")
我不太清楚 snakemake 在幕后做了什么,但我认为它将每个指令(输入、输出等)的参数作为字典传递给函数。在 python 中,没有名称的函数参数 (positional) 必须位于有名称的函数参数之前。 Google positional argument follows keyword argument
了解更多。
长话短说:要么更改输出文件的顺序:
rule prokka:
output:
directory("{sample_id}/annotation/prokka/{sample_id}"),
faa = "{sample_id}/annotation/prokka/{sample_id}.faa",
或者给他们都起个名字(可能更好):
rule prokka:
output:
faa = "{sample_id}/annotation/prokka/{sample_id}.faa",
outdir= directory("{sample_id}/annotation/prokka/{sample_id}"),
...
shell:
"prokka --outdir {output.outdir} --prefix {wildcards.sample_id} ..."
另外我觉得{sample_id}}
应该是{sample_id}
当我 运行 snakemake -np
它说:
SyntaxError in line 22 of /home/snakefile: positional argument follows keyword argument
好像是rule prokka
输入部分的问题,因为其他部分工作正常。
下面是我的蛇文件:
configfile:"config.yml"
id=config['id']
rule all:
input:
expand("{sample_id}/assembly/skesa/{sample_id}.fa", sample_id=id),
directory(expand("{sample_id}/annotation/prokka/", sample_id=id))
rule skesa:
output:
contigs = "{sample_id}/assembly/skesa/{sample_id}.fa"
input:
r1 = lambda wildcards: config["reads"][wildcards.sample_id]['r1'],
r2 = lambda wildcards: config["reads"][wildcards.sample_id]['r2']
params:
cpus = config['skesa']['cpus'],
memory = config['skesa']['memory']
shell:
'skesa --reads {input.r1},{input.r2} --cores {params.cpus} --memory {params.memory} > {output}'
rule prokka:
output:
faa = "{sample_id}/annotation/prokka/{sample_id}.faa",
directory("{sample_id}/annotation/prokka/{sample_id}}")
input:
contigs = rules.skesa.output.contigs
shell:
"prokka --outdir {output} --prefix {wildcards.sample_id} {params.contigs}"
问题在于:
rule prokka:
output:
faa = "{sample_id}/annotation/prokka/{sample_id}.faa",
directory("{sample_id}/annotation/prokka/{sample_id}}")
我不太清楚 snakemake 在幕后做了什么,但我认为它将每个指令(输入、输出等)的参数作为字典传递给函数。在 python 中,没有名称的函数参数 (positional) 必须位于有名称的函数参数之前。 Google positional argument follows keyword argument
了解更多。
长话短说:要么更改输出文件的顺序:
rule prokka:
output:
directory("{sample_id}/annotation/prokka/{sample_id}"),
faa = "{sample_id}/annotation/prokka/{sample_id}.faa",
或者给他们都起个名字(可能更好):
rule prokka:
output:
faa = "{sample_id}/annotation/prokka/{sample_id}.faa",
outdir= directory("{sample_id}/annotation/prokka/{sample_id}"),
...
shell:
"prokka --outdir {output.outdir} --prefix {wildcards.sample_id} ..."
另外我觉得{sample_id}}
应该是{sample_id}