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}"
说明
rule all是Snakemake的总入口,通过expand生成所有需要的输出文件路径,触发rule step5为每个batch值创建独立任务。rule step5的output改为单个带{batch}通配符的路径,Snakemake会自动识别{batch}作为通配符,每个批次执行时wildcards.batch就能正确获取当前批次号。- 如果你的Snakefile中已经存在
rule all,只需把上述expand生成的所有输出路径添加到原有rule all的input中即可,无需新建。
内容的提问来源于stack exchange,提问作者user4389482342
相关产品推荐
相关产品推荐

