ошибка «позиционный аргумент следует за аргументом ключевого слова» в файле snakefile

#python-3.x #workflow #snakemake

Вопрос:

Когда я бегу 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}"
 

Ответ №1:

Проблема в том, что:

 rule prokka:
    output:
        faa = "{sample_id}/annotation/prokka/{sample_id}.faa",
        directory("{sample_id}/annotation/prokka/{sample_id}}")
 

Я точно не знаю, что делает snakemake под капотом, но я думаю, что он передаст аргументы каждой директивы (ввод, вывод и т. Д.) В Качестве словаря Функции. В python аргументы функций без имени (позиционные) должны стоять перед аргументами с именем. Погуглите 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}

Комментарии:

1. Тх много! Я предпочитаю 2-й метод (дал название «outdir»), и он сработал. Кроме того, спасибо, что напомнили о дублированном «}»