Snakemake搭建Nanopore分析流程触发WildcardError错误解决问询
报错原因
你触发报错的核心原因是guppy_linkfastq规则的输入路径中包含{failpass}、{runid}两个未在输出路径中定义的通配符,Snakemake的通配符推导逻辑是从输出反向匹配输入的通配符取值,输出中不存在的通配符无法被自动赋值,因此抛出WildcardError。
你希望直接用glob匹配代替显式通配符的思路是可行的,但不能直接在input字段写glob语句,因为Snakemake解析Snakefile时就会执行glob,此时上游guppy碱基识别任务还未运行,目标文件不存在,匹配会为空。
解决方案
推荐使用输入函数动态匹配已生成的fastq文件,无需声明多余通配符,也能保证匹配时机正确:
- 首先在Snakefile中定义输入函数,用于匹配对应样本下所有guppy输出的fastq.gz文件:
import glob def get_guppy_fastq(wildcards): # 匹配sample对应目录下所有层级的fastq.gz文件 # 如果只需要保留质检通过的reads,可将路径改为 f"basecall/{wildcards.sample}/pass/*.fastq.gz" return glob.glob(f"basecall/{wildcards.sample}/**/*.fastq.gz", recursive=True)
- 修改
guppy_linkfastq规则如下:
rule guppy_linkfastq: input: get_guppy_fastq output: "basecall/{sample}.fastq.gz" shell: # 多文件合并为单个文件,适配后续分析流程;如果不需要合并仅做软链接,可调整shell命令逻辑 "cat {input} > {output}"
补充说明
- 不推荐给
failpass、{runid}加通配符约束的方案,该方法虽然能解决报错,但如果匹配到多个文件时Snakemake会随机选择,极易出现非预期结果。 - 如果确实需要保留软链接而非合并文件,可调整shell逻辑:先创建专属目录存放所有软链接,再将目录下的fastq.gz链接到目标路径即可。
内容的提问来源于stack exchange,提问作者HansVG
相关产品推荐
相关产品推荐

