首页 > 解决方案 > 动态分支/管道

问题描述

是否可以在蛇文件中使用动态分支/管道?

我希望执行以下操作:

A -> B -> D
or
A -> C -> D

取决于配置变量是否为真。

例如:

*(rules.B if config["deblur"] == True else rules.B),

在这种情况下,它同时运行规则 B 和 C。

我试过了

if config["deblur"] == True:
    rules.B,
else:
    rules.C,

但这给了我一个语法错误。

在下一条规则中,输入如下。

    input:
        qiime_feature_table_input = rules.qiime_deblur.output.qiime_deblur_table if config["deblur"] == "True" else rules.qiime_denoise.output.qiime_denoise_table

谢谢你的帮助!

标签: snakemake

解决方案


由于配置变量的值在运行前是已知的,因此在这种情况下无需动态修改 DAG。这是一个简单的蛇文件,a -> b -> d如果config_var为真则运行规则,a -> c -> d如果config_var为假则运行规则:

config_var = True

rule all:
    input:
        "d/out.txt",

rule a:
    output:
        "a/a.txt",
    shell:
        """
        echo 'a' > '{output}'
        """

rule b:
    input:
        rules.a.output,
    output:
        "b/b.txt",
    shell:
        """
        echo 'b' > '{output}'
        """

rule c:
    input:
        rules.a.output,
    output:
        "c/c.txt",
    shell:
        """
        echo 'c' > '{output}'
        """

rule d:
    input:
        rules.b.output if config_var else rules.c.output,
    output:
        "d/out.txt",
    shell:
        """
        cat '{input}' > '{output}'
        """

推荐阅读