当前规则在 Snakemake 中的名称

Current-rule's name in Snakemake

我正在使用 Snakemake,但我找不到访问当前规则名称的方法。

例如,有没有办法像这样访问:

rule job1:
    input: check_inputs(rules.current.name)
    output: ...

当每个规则的 check_inputs 函数大致相同时,这会非常有用。

当然,我做了这个并且它有效:

rule job1:
    input: check_inputs("job1")
    output: ...

但是,我想知道是否存在更多 "Snakemaker way" 来获取当前规则的名称以避免每次编写/硬编码规则名称。

我们将不胜感激任何形式的帮助或建议。

--- 编辑 1 ---
只有当 inputoutput 语句被 snakemake 解析时,规则名称才能通过 {rules.myrule.name} 访问。所以在input/output定义中不可能使用{rules.myrule.name}

例如,我们的想法是快速访问当前规则的名称 {rules.current},因为 {rules.myrule.name} 也是重复的。

我认为 rule.name 应该有效,但它看起来只是 rule,但它不能在所有情况下使用:请参阅 https://bitbucket.org/snakemake/snakemake/issues/199/rule-name-cant-be-accessed-by-rule-in

安德烈亚斯

(编辑:提出解决方法)

{rule} 可用于 shell:/运行: 指令期间的规则名称。如 op 所述,这在 input/output: 中不起作用。但是,当前模板是一种变通方法

myrule = "foo"
rule foo:
    output: touch(myrule + ".ok")
    shell:
        'echo "I am {rule}, making {output}"'

在上面的例子中,引入变量myrule是不必要的,因为它只使用一次。但是当你想在各种 snakemake 指令中多次使用规则名称时,它更有意义。它还有助于规则模板化。