You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Snakemake自动生成的输出目标分配可读标签?

Snakemake规则输出冗余优化与标签分配问题

我有一个输出高度冗余的Snakemake规则(已简化):

rule redundant:
    output:
        a_x = "prefix_a_x.ext"
        b_x = "prefix_b_x.ext"
        a_y = "prefix_a_y.ext"
        b_y = "prefix_b_y.ext"
    run:
        process_1(output.a_x)
        process_2(output.a_y)
        process_3(output.b_x)
        process_4(output.b_y)

使用列表推导式可减少冗余,但会降低可读性(需通过索引访问输出,不够直观):

rule less_readable:
    output:
        [f"prefix_{a}_{b}.ext"
         for a in ["a", "b"]
         for b in ["x", "y"]]
    run:
        process_1(output[0])
        process_2(output[1])
        process_3(output[2])
        process_4(output[3])

注:不想使用expand("prefix_{a}_{b}.ext", a=["a", "b"], b=["x", "y"]),因为输出顺序很重要,担心未来Snakemake版本会改变其顺序。

尝试用字典推导式兼顾冗余减少与可读性,却触发报错:

rule more_readable:
    output:
        {f"{a}_{b}": f"prefix_{a}_{b}.ext"
         for a in ["a", "b"]
         for b in ["x", "y"]}
    run:
        process_1(output.a_x)
        process_2(output.a_y)
        process_3(output.b_x)
        process_4(output.b_y)

执行命令snakemake -j 1 prefix_a_x.ext时的报错信息:

Building DAG of jobs...
MissingRuleException:
No rule to produce prefix_a_x.ext (if you use input functions make sure that they don't raise unexpected exceptions).

解决方法

在Snakemake 7.x版本中,不能直接在output段使用字典推导式生成带标签的输出,但可以通过**字典解包(**操作符)**实现需求,既减少冗余,又保留标签可读性和顺序可控性:

方式1:提前定义输出字典

# 预先定义带标签的输出字典,确保顺序符合预期
outputs_dict = {
    f"{a}_{b}": f"prefix_{a}_{b}.ext"
    for a in ["a", "b"]
    for b in ["x", "y"]
}

rule optimized_readable:
    output:
        **outputs_dict  # 解包字典作为带标签的输出项
    run:
        process_1(output.a_x)
        process_2(output.a_y)
        process_3(output.b_x)
        process_4(output.b_y)

方式2:直接在output段内解包推导式

rule optimized_readable:
    output:
        **{
            f"{a}_{b}": f"prefix_{a}_{b}.ext"
            for a in ["a", "b"]
            for b in ["x", "y"]
        }
    run:
        process_1(output.a_x)
        process_2(output.a_y)
        process_3(output.b_x)
        process_4(output.b_y)

以上两种写法既能通过推导式消除冗余代码,又能像原始规则一样通过标签(如output.a_x)访问输出文件,同时Snakemake能正确识别每个输出文件对应的规则,避免MissingRuleException报错。

内容的提问来源于stack exchange,提问作者abukaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:57:47