Snakemake中lambda wildcards引发InputFunctionException与KeyError问题排查
Snakemake lambda wildcards 引发异常的原因及调试方法
问题重现
运行以下Snakemake规则时,触发InputFunctionException和KeyError错误:
rule tumor_with_matched_normal: normal_bam = lambda wildcards: os.path.join( "/home/bio/processed_bams/" + config[wildcards.sample]["normal"] + "." + config["ref_basename"] + ".sorted.bam")
错误原因
- KeyError的核心诱因
config[wildcards.sample]不存在:当前wildcards的sample值在config字典中无对应键config[wildcards.sample]["normal"]不存在:wildcards.sample对应的config条目存在,但缺少"normal"子键config["ref_basename"]不存在:全局config字典中没有"ref_basename"这个键
- InputFunctionException的本质
这是Snakemake对输入函数(此处的lambda)执行失败的包装异常,根源是lambda内部抛出了KeyError,进而触发该外层异常。
打印normal_bam变量的方法
方法1:替换lambda为普通函数(推荐)
将lambda换成具名函数,在函数内部添加打印逻辑,可读性和调试性更好:
import os def get_normal_bam(wildcards): # 打印关键变量排查问题 print(f"DEBUG: 当前sample wildcard值: {wildcards.sample}") print(f"DEBUG: 对应config条目: {config.get(wildcards.sample, '不存在')}") normal_sample = config[wildcards.sample]["normal"] ref_basename = config["ref_basename"] normal_bam = os.path.join("/home/bio/processed_bams/", f"{normal_sample}.{ref_basename}.sorted.bam") print(f"DEBUG: 生成的normal_bam路径: {normal_bam}") return normal_bam rule tumor_with_matched_normal: normal_bam = get_normal_bam(wildcards) # 补充规则的其他字段(input/output/params等)
方法2:临时在lambda中嵌入打印(不推荐)
如果一定要保留lambda形式,可以通过逗号表达式嵌入打印逻辑,但可读性较差:
normal_bam = lambda wildcards: ( print(f"DEBUG: sample={wildcards.sample}, normal={config[wildcards.sample].get('normal', '不存在')}, ref={config.get('ref_basename', '不存在')}"), os.path.join("/home/bio/processed_bams/", f"{config[wildcards.sample]['normal']}.{config['ref_basename']}.sorted.bam") )[1]
额外调试技巧
在Snakefile开头添加print(config),直接打印整个config字典,确认所有需要的键是否存在、对应值是否符合预期。
内容的提问来源于stack exchange,提问作者Musa Gabere
相关产品推荐
相关产品推荐

