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

学习Snakemake遇MissingInputException:sam_to_bam规则输入文件缺失

问题分析与修复

核心错误原因

错误日志显示sample通配符被赋值为整个样本列表,导致生成了像['ERR024604_tiny', ...].sam这种无效路径。这是因为在rule all的expand函数里,错误地传入了SAM_FILES(glob_wildcards返回的对象),而非实际的样本名称列表。另外代码里还存在两处小问题:

  • STATS_DIR未定义,但rule all却引用了它
  • shell命令里误用了{input.sam}(输入只有单个文件,直接用{input}即可)

修复后的代码

SAM_DIR = "/mnt/c/Code/sam_tiny"
BAM_DIR = "/mnt/c/Code/bam"
# 如果确实需要统计文件,先定义STATS_DIR,否则删掉相关代码
# STATS_DIR = "/mnt/c/Code/stats"

# glob_wildcards返回的对象直接通过.sample属性获取样本列表
SAM_FILES = glob_wildcards(os.path.join(SAM_DIR, "{sample}.sam"))
SAMPLES = SAM_FILES.sample

rule all:
    # 如果你目标是生成BAM文件,修改为BAM_DIR的路径;如果是统计文件,确保STATS_DIR已定义
    input:
        expand(os.path.join(BAM_DIR, "{sample}.bam"), sample=SAMPLES)
        # 如果是统计文件:expand(os.path.join(STATS_DIR, "{sample}.txt"), sample=SAMPLES)

rule sam_to_bam:
    input:
        os.path.join(SAM_DIR, "{sample}.sam")
    output:
        os.path.join(BAM_DIR, "{sample}.bam")
    shell:
        "samtools view -b {input} > {output}"

关键修正点

  1. 正确传递样本列表:expand函数需要接收的是字符串列表,SAM_FILES是glob_wildcards返回的特殊对象,必须用SAM_FILES.sample或者你定义的SAMPLES来获取实际样本名
  2. 清理未定义变量:删除或定义STATS_DIR,确保rule all的输入路径合法
  3. 简化shell命令变量:输入只有单个文件,直接使用{input}即可,无需后缀.sam

内容的提问来源于stack exchange,提问作者Theresa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:10:08