Snakemake下游params函数读取上游生成文件提示不存在如何解决
问题根因
Snakemake启动后会先构建完整的有向无环图(DAG),这个阶段会提前计算所有规则的input、params、output取值。你当前直接把get_hla_types函数赋值给params字段,该函数会在DAG构建阶段就执行,此时上游规则还未运行,hla_types.txt自然不存在,因此触发文件不存在报错。
可行解决方法
方案1:将待读取文件加入input,在执行阶段读取(最符合Snakemake设计逻辑)
把上游生成的文件加到当前规则的input中,Snakemake会自动保证上游规则执行完成、文件生成后才运行当前规则,你直接在shell或run块中读取文件即可。
rule antigen_garnish: input: # 新增hla文件作为输入,声明依赖关系 hla_file = "{path}{patient}/{timepoint}/hla_types.txt", ... # 保留原有其他输入 output: ... # 保留原有输出 shell: ''' # shell中直接读取文件内容到变量使用 HLA_TYPES=$(cat {input.hla_file}) # 后续原有命令直接调用$HLA_TYPES即可 ... '''
如果用run块写逻辑,写法更灵活:
rule antigen_garnish: input: hla_file = "{path}{patient}/{timepoint}/hla_types.txt", ... output: ... run: with open(input.hla_file, "r") as f: hla_types = f.read().strip() # 后续直接用hla_types变量处理逻辑 ...
方案2:params延迟求值
如果一定要把文件内容放在params里调用,可以在外面包一层lambda表达式,lambda会在规则执行前、所有上游依赖完成后才求值:
def get_hla_types(wildcards): with open(f"{path}{wildcards.patient}/{wildcards.timepoint}/hla_types.txt", "r") as f: return f.read().strip() rule antigen_garnish: input: # 必须还是要把hla文件加入input,否则Snakemake不知道要先执行上游规则生成文件 hla_file = "{path}{patient}/{timepoint}/hla_types.txt", ... output: ... params: # 包一层lambda实现延迟调用 hla_types = lambda wildcards: get_hla_types(wildcards), ... shell: "your_command --hla {params.hla_types} ..."
注意事项
不要直接把读取文件的函数放到input区块,普通input函数和原来的params函数一样,都是在DAG构建阶段执行,仍然会触发文件不存在报错。
内容的提问来源于stack exchange,提问作者nhaus
相关产品推荐
相关产品推荐

