学习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}"
关键修正点
- 正确传递样本列表:
expand函数需要接收的是字符串列表,SAM_FILES是glob_wildcards返回的特殊对象,必须用SAM_FILES.sample或者你定义的SAMPLES来获取实际样本名 - 清理未定义变量:删除或定义
STATS_DIR,确保rule all的输入路径合法 - 简化shell命令变量:输入只有单个文件,直接使用
{input}即可,无需后缀.sam
内容的提问来源于stack exchange,提问作者Theresa
相关产品推荐
相关产品推荐

