Snakemake多文件夹结果合并报错求助:MissingInputException
问题解决方案
核心问题分析
你的代码存在两个关键问题:
- 输入输出路径脱节:
rule program_on_single_folder的输出是{folder}/program_result目录,但rule all中声明的single_folder_results指向test/{folder}/result_folder/quality_report.tsv,两者路径完全不匹配,导致Snakemake无法关联规则,找不到所需的输入文件。 - 规则依赖逻辑错误:
results_collate直接引用rules.all.input.single_folder_results作为输入,这是Snakemake的目标集合而非实际生成的文件,且没有任何规则负责生成这些quality_report.tsv文件。
修正后的代码
# 先定义你的文件夹列表,示例: dirs_list = ["dirA", "dirB", "dirC"] n_threads = 4 rule all: input: # 确保路径和program_on_single_folder的输出完全一致 expand("test/{folder}/program_result/quality_report.tsv", folder=dirs_list), "result_total.tsv" rule program_on_single_folder: input: # 若{file}是通配符,需补充明确的文件名规则,比如指定固定文件名或用expand genome = "test/{folder}/genome.fasta" output: # 明确指定程序生成的具体文件,这是Snakemake追踪的核心 report = "test/{folder}/program_result/quality_report.tsv", # 可选:确保输出目录存在(若程序不会自动创建) outdir = directory("test/{folder}/program_result") threads: n_threads shell: """ # 替换为你的实际命令,确保输出到指定路径 your_program --input {input.genome} --output-dir {output.outdir} """ rule results_collate: input: # 直接生成所有待合并的文件列表,和rule all中的路径对齐 all_results = expand("test/{folder}/program_result/quality_report.tsv", folder=dirs_list) output: "result_total.tsv" shell: # 用>而非>>避免重复追加内容,按需保留uniq去重 "cat {input.all_results} | uniq > {output}"
关键修改点说明
- 统一路径规则:让
rule all和program_on_single_folder的文件路径完全一致,让Snakemake能明确每个quality_report.tsv是由program_on_single_folder生成的。 - 明确输出文件:在
program_on_single_folder中直接声明程序生成的quality_report.tsv作为输出——Snakemake是基于文件的工作流,必须追踪具体文件的生成状态,仅声明目录无法建立有效依赖。 - 修正合并规则输入:在
results_collate中直接用expand生成输入文件列表,而非引用rules.all.input,避免依赖链混乱。 - 修复shell命令:将
>>改为>,防止每次运行时重复追加内容;不需要去重可直接去掉| uniq。
额外注意事项
- 如果
{file}是通配符,需补充wildcard_constraints或用expand明确输入文件,比如genome=expand("test/{folder}/{file}", folder=dirs_list, file=["genome.fasta"]),否则Snakemake无法解析该通配符。 - 若程序不会自动创建输出目录,保留
directory输出项可让Snakemake自动创建目录(需Snakemake版本≥5.10)。
内容的提问来源于stack exchange,提问作者Mabri
相关产品推荐
相关产品推荐

