Snakemake执行时出现MissingInputException报错求助
运行Snakemake时遭遇MissingInputException报错的排查与解决
初始Snakefile脚本
import os import glob import yaml ##load config file configfile: "config/config.yaml" ##ref and query locations referance = config["reference_loc"] query = config["query_loc"] ##output file location output = config["output"] ##sample file name suffix = [".fsa", ".fasta", ".fa", ".fna", ".fas"] sample_file = glob.glob(query+"*"+str(suffix)) sample1 = [item.removeprefix(query) for item in sample_file] sample2 = [item.removesuffix(".fasta") for item in sample1] sample3 = [item.removesuffix(".fas") for item in sample2] sample4 = [item.removesuffix(".fsa") for item in sample3] sample5 = [item.removesuffix(".fna") for item in sample4] sample = [item.removesuffix(".fa") for item in sample5] ##referance file name ref_file = glob.glob(referance+"*"+str(suffix)) ref1 = [item.removeprefix(referance) for item in ref_file] ref2 = [item.removesuffix(".fasta") for item in ref1] ref3 = [item.removesuffix(".fas") for item in ref2] ref4 = [item.removesuffix(".fsa") for item in ref3] ref5 = [item.removesuffix(".fna") for item in ref4] ref = [item.removesuffix(".fa") for item in ref5] ##rules rule all: input: expand(output+"final/{ref}_merged.csv", ref = ref) rule blast: input: expand(output+'{sample}_{ref}.txt', sample = sample, ref = ref)
相关规则定义
blast规则
rule blast: input: query=query+'{sample}'+str(suffix), ref=referance+'{ref}'+str(suffix) output: output+'{sample}_{ref}.txt' threads: workflow.cores conda: 'envs/blast.yaml' shell: "blastp -subject {input.ref} -query {input.query} -outfmt '6 qacc sacc pident length qcovs evalue mismatch gaps qseq sseq qlen slen sstart send' -out {output} -num_threads {threads}"
merge_data规则
rule merge_data: input: rules.blast.output output: output+"final/{ref}_merged.csv" conda: 'envs/pandas.yaml' scripts: ../scripts/pd_blastresults.py'
报错信息
执行all规则时的报错
snakemake --cores 14 --use-conda all Building DAG of jobs... MissingInputException in line 39 of /home/user/Desktop/newtest/workflow/Snakefile: Missing input files for rule all: affected files: /home/user/Desktop/data/results/final/GlpTReferenceNC_000913.3_merged.csv
执行blast规则时的报错
snakemake --cores 14 --use-conda blast Building DAG of jobs... MissingInputException in line 43 of /home/user/Desktop/newtest/workflow/Snakefile: Missing input files for rule blast: affected files: /home/user/Desktop/data/results/GlpTCP014497.1_GlpTReferenceNC_000913.3.txt /home/user/Desktop/data/results/GlpTCP063774.1_GlpTReferenceNC_000913.3.txt /home/user/Desktop/data/results/GlpTCP014488_GlpTReferenceNC_000913.3.txt /home/user/Desktop/data/results/GlpTCP103710.1_GlpTReferenceNC_000913.3.txt /home/user/Desktop/data/results/GlpTCP014522.1_GlpTReferenceNC_000913.3.txt
已尝试的调试方法
- 不使用通配符,为每个文件单独指定路径运行,仍出现相同错误;
- 保留样本通配符,仅指定参考文件路径,问题依旧;
- 重写整个Snakefile,错误仍存在。
修改后的Snakefile代码
import os import sys import glob import yaml import pandas as pd ##load config file configfile: "config/config.yaml" ##ref and query locations referance = config["reference_loc"] query = config["query_loc"] ##output file location output = config["output"] ##sample file name suffix = [".fsa", ".fasta", ".fa", ".fna", ".fas"] sample_file = glob.glob(query+"*"+str(suffix)) sample1 = [item.removeprefix(query) for item in sample_file] sample2 = [item.removesuffix(".fasta") for item in sample1] sample = [item.removesuffix(".fa") for item in sample2] print(sample) ##rules rule all: input: expand(output+"final/{sample}_merged.csv", sample = sample) rule blast: input: query=query+'{sample}.fasta', ref=referance output: output+'{sample}.txt' threads: workflow.cores conda: 'envs/blast.yaml' shell: "blastp -subject {input.ref} -query {input.query} -outfmt '6 qacc sacc pident length qcovs evalue mismatch gaps qseq sseq qlen slen sstart send' -out {output} -num_threads {threads}" rule merge_data: input: rules.blast.output output: output1=output+"final/{sample}_merged.csv" conda: 'envs/pandas.yaml' script: "../scripts/pd_blastresults.py"
报错原因分析
- 重复定义blast规则:初始代码中先定义了一个空的
rule blast,后续又重新定义完整的blast规则,导致Snakemake解析时出现规则冲突,无法正确关联输入输出依赖。 - 文件名匹配逻辑错误:
glob.glob(query+"*"+str(suffix))将后缀列表转为字符串(如[".fsa", ".fasta", ...]),导致glob无法匹配到任何文件,最终sample和ref列表内容不符合预期;- blast规则输入中
query=query+'{sample}'+str(suffix)同样错误地将后缀列表转为字符串,生成的输入路径格式无效(如/path/sample[".fsa", ...]),Snakemake找不到对应文件。
- 规则间通配符关联失效:
merge_data规则输出为{ref}_merged.csv,但输入是rules.blast.output(格式为{sample}_{ref}.txt),通配符逻辑不匹配,导致Snakemake无法构建正确的依赖关系,判定all规则的输入文件缺失。
解决方法
- 删除重复规则定义:移除初始Snakefile中第一个空的
rule blast,仅保留完整的blast规则。 - 修复文件名匹配逻辑:
- 遍历后缀列表来匹配文件,替换错误的glob写法:
sample_file = [] for suf in suffix: sample_file.extend(glob.glob(query+"*"+suf)) - 使用正则表达式一次性去除所有可能的后缀,简化文件名处理:
import re sample = [re.sub(r'\.(fsa|fasta|fa|fna|fas)$', '', os.path.basename(f)) for f in sample_file]
- 遍历后缀列表来匹配文件,替换错误的glob写法:
- 修正blast规则输入路径:使用合法的通配符或明确后缀格式,避免将列表转为字符串:
rule blast: input: query=os.path.join(query, "{sample}.fasta"), ref=os.path.join(referance, "{ref}.fasta") # 其他配置... - 确保规则间通配符关联正确:调整
merge_data规则的输入逻辑,明确关联ref通配符:rule merge_data: input: lambda wildcards: expand(output+'{sample}_{ref}.txt', sample=sample, ref=wildcards.ref) output: output+"final/{ref}_merged.csv" # 其他配置...
内容的提问来源于stack exchange,提问作者mrtoot3
相关产品推荐
相关产品推荐

