You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:54:04