如何在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
相关产品推荐
相关产品推荐

