Snakemake指定输出组合调用程序报MissingInputException求解
错误原因
- 通配符匹配规则错误:你将程序的全路径作为
program通配符的匹配值,但输出文件名中仅包含program_1/program_2/program_3这类标识字符串,两者不匹配导致Snakemake找不到生成目标文件的对应规则,因此抛出缺失输入的错误(Snakemake会把找不到生成规则的目标文件当成需要提前存在的输入文件)。 - 脚本开头未导入
re库,正则相关操作会执行失败。 - 原有Shell命令直接传递fa文件路径,不符合程序要求的「读取文件内容作为参数」的逻辑。
- 未适配不同程序的额外参数需求。
修正后完整Snakefile
import re # 读取预定义输出文件列表 with open("snakemake_output_small.txt", "r") as f: out = [line.strip() for line in f if line.strip()] # 提取所有合法通配符取值 hsa_set = set([x.split('__')[0] for x in out]) nm_set = set([re.sub(r'_program_.*', '', x.split('__')[1]) for x in out]) # 输出文件名中program标识的合法值 program_tag_set = {'program_1', 'program_2', 'program_3'} # 配置程序路径和额外参数 program_config = { 'program_1': { 'path': 'full/path/to/program_1', 'extra_params': '' }, 'program_2': { 'path': 'full/path/to/program_2', 'extra_params': '-d' }, 'program_3': { 'path': 'full/path/to/program_3', 'extra_params': '-P here/a/parameter/file' } } # 严格限制通配符取值范围,避免非法匹配 wildcard_constraints: hsa = '|'.join([re.escape(x) for x in hsa_set]), nm = '|'.join([re.escape(x) for x in nm_set]), program_tag = '|'.join([re.escape(x) for x in program_tag_set]) rule all: input: out rule run_program: input: hsa_fa = 'full/path/to/dir1/{hsa}.fa', nm_fa = 'full/path/to/dir2/{nm}.fa' output: '{hsa}__{nm}_{program_tag}.txt' params: program_path = lambda wc: program_config[wc.program_tag]['path'], extra_params = lambda wc: program_config[wc.program_tag]['extra_params'] shell: r""" {params.program_path} {params.extra_params} $(cat {input.nm_fa}) $(cat {input.hsa_fa}) > {output} """
额外说明
- 如果你的预定义输出文件名里的程序标识是
programm_1(多了一个m),只要把program_tag_set和program_config的key对应改成programm_1/programm_2/programm_3即可。 - 该配置原生支持Snakemake集群调度,只需要按照你的集群调度器配置对应的集群提交参数即可正常并行执行。
内容的提问来源于stack exchange,提问作者Aux
相关产品推荐
相关产品推荐

