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}