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

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"

报错原因分析

  1. 重复定义blast规则:初始代码中先定义了一个空的rule blast,后续又重新定义完整的blast规则,导致Snakemake解析时出现规则冲突,无法正确关联输入输出依赖。
  2. 文件名匹配逻辑错误:
    • glob.glob(query+"*"+str(suffix))将后缀列表转为字符串(如[".fsa", ".fasta", ...]),导致glob无法匹配到任何文件,最终sample和ref列表内容不符合预期;
    • blast规则输入中query=query+'{sample}'+str(suffix)同样错误地将后缀列表转为字符串,生成的输入路径格式无效(如/path/sample[".fsa", ...]),Snakemake找不到对应文件。
  3. 规则间通配符关联失效:merge_data规则输出为{ref}_merged.csv,但输入是rules.blast.output(格式为{sample}_{ref}.txt),通配符逻辑不匹配,导致Snakemake无法构建正确的依赖关系,判定all规则的输入文件缺失。

解决方法

  1. 删除重复规则定义:移除初始Snakefile中第一个空的rule blast,仅保留完整的blast规则。
  2. 修复文件名匹配逻辑:
    • 遍历后缀列表来匹配文件,替换错误的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]
      
  3. 修正blast规则输入路径:使用合法的通配符或明确后缀格式,避免将列表转为字符串:
    rule blast:
        input:
            query=os.path.join(query, "{sample}.fasta"),
            ref=os.path.join(referance, "{ref}.fasta")
        # 其他配置...
    
  4. 确保规则间通配符关联正确:调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:15:34