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

Snakemake报错:'Wildcards'对象无'batch'属性,求规则修改方法

解决Snakemake通配符(wildcards)缺失问题

问题场景

需要让rule step5为批次1-20各运行一次,Python脚本内部的批次逻辑正常,但在Snakemake规则中用expand填充output后,报错提示Wildcards对象没有batch属性。

原规则代码

OUTDIR="my_dir/"
nBATCHES = 20
BATCHES = list(range(1,21)) # [1,2,3 ..20] list

[...]

rule step5:
    input:
        ids = expand('{IDLIST}', IDLIST=IDLIST)
    output:
        type1 = expand('{OUTDIR}/resources/{batch}_output_type1.csv.gz', OUTDIR=OUTDIR, batch=BATCHES),
        type2 = expand('{OUTDIR}/resources/{batch}_output_type2.csv.gz', OUTDIR=OUTDIR, batch=BATCHES),
        type3 = expand('{OUTDIR}/resources/{batch}_output_type3.csv.gz', OUTDIR=OUTDIR, batch=BATCHES)
    shell:
        "./some_script.py --outdir {OUTDIR} --idlist {input.ids}  --total_batches {nBATCHES} --current_batch {wildcards.batch}"

报错信息

RuleException in rule step5  in line 241 of Snakefile:

AttributeError: 'Wildcards' object has no attribute 'batch', when formatting the following:

./somescript.py --outdir {OUTDIR} --idlist {input.idlist}  --totalbatches {nBATCHES} --current_batch {wildcards.batch}

手动执行验证

单批次脚本可正常运行,命令示例:

./somescript.py --outdir my_dir/ --idlist ids.csv --total_batches 20 --current_batch 1

错误原因

你当前的写法中,rule step5的output用expand直接生成了所有20个批次的文件列表,Snakemake会把这个规则当成单个任务执行,而不是拆分成20个独立任务。规则内部没有定义{batch}通配符,自然无法通过wildcards.batch获取批次号。

解决方案

要让每个批次对应独立任务,需要让规则本身支持{batch}通配符,再通过外部的expand触发所有批次的任务,而不是在规则内部的output里用expand。

修改后的规则代码

OUTDIR="my_dir/"
nBATCHES = 20
BATCHES = list(range(1,21)) # [1,2,3 ..20] list
IDLIST = "ids.csv" # 替换为你的实际ID列表文件路径

# 定义总目标任务,触发所有批次的step5执行
rule all:
    input:
        expand('{OUTDIR}/resources/{batch}_output_type1.csv.gz', OUTDIR=OUTDIR, batch=BATCHES),
        expand('{OUTDIR}/resources/{batch}_output_type2.csv.gz', OUTDIR=OUTDIR, batch=BATCHES),
        expand('{OUTDIR}/resources/{batch}_output_type3.csv.gz', OUTDIR=OUTDIR, batch=BATCHES)

rule step5:
    input:
        ids = IDLIST
    output:
        type1 = '{OUTDIR}/resources/{batch}_output_type1.csv.gz',
        type2 = '{OUTDIR}/resources/{batch}_output_type2.csv.gz',
        type3 = '{OUTDIR}/resources/{batch}_output_type3.csv.gz'
    shell:
        "./some_script.py --outdir {OUTDIR} --idlist {input.ids} --total_batches {nBATCHES} --current_batch {wildcards.batch}"

说明

  1. rule all是Snakemake的总入口,通过expand生成所有需要的输出文件路径,触发rule step5为每个batch值创建独立任务。
  2. rule step5的output改为单个带{batch}通配符的路径,Snakemake会自动识别{batch}作为通配符,每个批次执行时wildcards.batch就能正确获取当前批次号。
  3. 如果你的Snakefile中已经存在rule all,只需把上述expand生成的所有输出路径添加到原有rule all的input中即可,无需新建。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 22:10:31