遵循Snakemake教程时wildcards使用报错求助
核心逻辑纠正
你对wildcard的理解搞反了——Snakemake是从你要生成的输出文件路径里提取wildcard值,再反向推导对应的输入文件,而不是从已有的输入文件自动推断wildcard去生成输出。
比如你有输入data/samples/{sample}.fastq,规则里定义输出为mapped/{sample}.bam,你得明确告诉Snakemake要生成哪些具体的bam文件(比如mapped/A.bam、mapped/B.bam),它才会自动把sample这个wildcard替换成A、B,然后匹配到对应的输入fastq文件。
常见错误场景及修复
未指定目标输出
只写了带wildcard的规则,但运行时没明确要生成的输出文件,Snakemake不知道该处理哪些样本。
修复方式:- 直接指定目标文件运行:
snakemake mapped/A.bam mapped/B.bam - 或者通过
rule all定义总目标,结合配置文件批量处理:
在configfile: "config.yaml" rule all: input: expand("mapped/{sample}.bam", sample=config["samples"])config.yaml里写samples: ["A", "B"],之后直接运行snakemake即可,rule all会触发所有对应样本的规则执行。
- 直接指定目标文件运行:
输入输出wildcard命名不匹配
规则里输入和输出的wildcard名称必须完全一致,比如输入用{sample},输出也得用{sample},不能一边是{id}一边是{sample},否则Snakemake无法关联输入输出。
错误示例:rule map_reads: input: "data/samples/{sample}.fastq" output: "mapped/{id}.bam" shell: "bwa mem ref.fa {input} > {output}"修复:统一wildcard名称,比如都改为
{sample}。输入路径模式与实际文件不匹配
即便文件命名正确,也要检查规则里的输入路径模式是否和实际文件完全对应。比如实际文件是data/samples/A_R1.fastq,但规则里写的是data/samples/{sample}.fastq,wildcard会匹配失败,触发MissingInputException。
验证方法
运行snakemake --dry-run mapped/A.bam,查看输出中显示的输入文件是否正确指向data/samples/A.fastq。如果路径错误,调整规则里的通配符模式;如果提示找不到输入,说明wildcard未正确关联到目标输出。
内容的提问来源于stack exchange,提问作者Alkaligrass

