Как можно получить доступ к переменным конфигурации Snakemake внутри раздела `shell`?

В snakemake я хотел бы получить доступ к ключам из config из директивы shell:. Я могу использовать {input.foo}, {output.bar} и {params.baz}, но {config.quux} не поддерживается. Есть ли способ добиться этого?

rule do_something:
    input: "source.txt"
    output: "target.txt"
    params:
        # access config[] here. parameter tracking is a side effect
        tmpdir = config['tmpdir']
    shell:
        # using {config.tmpdir} or {config['tmpdir']} here breaks the build
        "./scripts/do.sh --tmpdir {params.tmpdir} {input} > {output}; "

Я мог бы назначить части конфигурации, которые я хочу, ключу в params, а затем использовать замену {param.x}, но это имеет нежелательные побочные эффекты (например, параметр сохраняется в метаданных snakemake (т.е. .snakemake/params_tracking). Использование run: вместо shell: будет это еще один обходной путь, но доступ к {config.tmpdir} непосредственно из блока shell был бы наиболее желательным.


person init_js    schedule 06.03.2018    source источник


Ответы (1)


"./scripts/do.sh --tmpdir {config[tmpdir]} {input} > {output}; "

должен работать здесь.

Это указано в документации: http://snakemake.readthedocs.io/en/stable/snakefiles/configuration.html#standard-configuration.

«Чтобы добавить заполнители конфигурации в команду оболочки, синтаксис форматирования строки Python требует, чтобы вы опускали кавычки вокруг имени ключа, например:»

shell:
    "mycommand {config[foo]} ..."
person Eric C.    schedule 07.03.2018
comment
Баааа. вздох. пропустил ту небольшую аннотацию к документации. Спасибо! Мне не особенно нравится асимметрия между {params.foo} и {config[foo]}, но, по крайней мере, способ есть. - person init_js; 07.03.2018