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

如何在Snakemake中跳过依赖失败规则bagel2bf的后续任务?

解决Snakemake中bagel2bf规则失败不终止工作流的问题

1. 修改bagel2bf规则,允许退出码1并输出警告

在bagel2bf规则中添加exitcodes参数,明确允许退出码0和1;同时修改对应脚本,捕获退出码1的情况,打印警告信息并生成失败标记文件,方便后续规则识别该数据集的失败状态。

修改后的bagel2bf规则:

rule bagel2bf:
    input:
        "bagel2_software/",
        "bagel2/{bcomparison}/{bcomparison}.foldchange",
    output:
        bf_file="bagel2/{bcomparison}/{bcomparison}.bf",
        fail_flag="bagel2/{bcomparison}/{bcomparison}.bf.failed"  # 新增失败标记文件
    params:
        species=config["lib_info"][library]["species"],
    resources:
        runtime=config["resources"]["stats"]["time"]
    conda:
        "envs/stats.yaml"
    log:
        "logs/bagel2/bf_{bcomparison}.log"
    exitcodes: 0, 1  # 允许退出码1不触发工作流终止
    script:
        "scripts/bagel2bf.py"

修改scripts/bagel2bf.py脚本,处理失败逻辑:

import sys
import os

# 原有bagel2bf计算逻辑
try:
    # 执行bf计算的核心代码
    # ...
    # 计算成功则删除失败标记(若存在)
    if os.path.exists(snakemake.output.fail_flag):
        os.remove(snakemake.output.fail_flag)
except Exception as e:
    # 捕获退出码1的特定失败情况
    if hasattr(e, 'returncode') and e.returncode == 1:
        print(f"警告:{snakemake.wildcards.bcomparison}的bagel2bf计算失败,后续依赖规则将被跳过", file=sys.stderr)
        # 创建失败标记文件
        with open(snakemake.output.fail_flag, 'w') as f:
            f.write("failed")
        # 返回0让Snakemake认为规则执行完成
        sys.exit(0)
    # 其他错误正常抛出,终止当前规则
    else:
        raise

2. 调整依赖规则,自动跳过失败数据集

对依赖bagel2bf输出的bagel2pr、plot_bf规则,添加输入函数检查失败标记文件,若标记存在则跳过该规则执行。

修改bagel2pr规则:

import os

def check_bf_success(wildcards):
    fail_flag = f"bagel2/{wildcards.bcomparison}/{wildcards.bcomparison}.bf.failed"
    if os.path.exists(fail_flag):
        return []  # 返回空输入列表,Snakemake自动跳过规则
    return ["bagel2_software/", f"bagel2/{wildcards.bcomparison}/{wildcards.bcomparison}.bf"]

rule bagel2pr:
    input:
        check_bf_success,
    output:
        report("bagel2/{bcomparison}/{bcomparison}.pr", caption="report/bagel2.rst", category="BAGEL2")
    params:
        species=config["lib_info"][library]["species"]
    resources:
        runtime=config["resources"]["stats"]["time"]
    conda:
        "envs/stats.yaml"
    log:
        "logs/bagel2/pr_{bcomparison}.log"
    script:
        "scripts/bagel2pr.py"

修改plot_bf规则:

import os

def check_bf_plot_success(wildcards):
    fail_flag = f"bagel2/{wildcards.bcomparison}/{wildcards.bcomparison}.bf.failed"
    if os.path.exists(fail_flag):
        return []
    return [f"bagel2/{wildcards.bcomparison}/{wildcards.bcomparison}.bf"]

rule plot_bf:
    input:
        check_bf_plot_success,
    output:
        report("bagel2_plots/{bcomparison}/{bcomparison}.bf.pdf", caption="report/bagel2_plots.rst", category="BAGEL2 plots", subcategory="{bcomparison}", labels={"Comparison":"{bcomparison}", "Figure":"BF plot"})
    conda:
        "envs/stats.yaml"
    script:
        "scripts/plot_bf.py"

3. 可选补充:全局容错配置

若需要对所有规则的非致命失败保持工作流运行,可在启动Snakemake时添加--keep-going参数,但该方式不区分失败类型,优先推荐前面的精准控制方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:44:56