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

如何在Snakemake中读取字典输入并解决NameError问题

Snakemake调用字典中FastQ路径时报NameError的解决方法

问题场景

我将FastQ文件路径存储在字典中,尝试在Snakemake规则里访问这些路径,但运行代码时触发NameError。

我的代码:

infile_loc = {
    "Sample1": ["/home/joshua/snakemake_works/input/Sample1_R1.fq.gz", "/home/joshua/snakemake_works/input/Sample1_R2.fq.gz"],
    "Sample2": ["/home/joshua/snakemake_works/input/Sample2_R1.fq.gz", "/home/joshua/snakemake_works/input/Sample2_R2.fq.gz"]
}

SAMPLES = infile_loc.keys()

rule print_file_name:
    input:
        expand("{sample}", sample=SAMPLES)
    params:
        read1, read2 = lambda wildcards: infile_loc[wildcards.sample]
    script:
        """
        echo {params.read1}
        echo {params.read2}
        """

运行后报错:

NameError in file /home/joshua/snakemake_works/Snakefile, line 9:
name 'read1' is not defined
  File "/home/joshua/snakemake_works/Snakefile", line 9, in <module>

错误原因

Snakemake的params块不支持直接使用read1, read2 = lambda...这种变量解构语法。这里的read1和read2在当前上下文属于未定义变量,因此触发NameError。

两种解决方法

方法1:为每个参数单独编写lambda表达式

直接给read1和read2分别指定lambda,从字典的列表值中提取对应位置的路径:

infile_loc = {
    "Sample1": ["/home/joshua/snakemake_works/input/Sample1_R1.fq.gz", "/home/joshua/snakemake_works/input/Sample1_R2.fq.gz"],
    "Sample2": ["/home/joshua/snakemake_works/input/Sample2_R1.fq.gz", "/home/joshua/snakemake_works/input/Sample2_R2.fq.gz"]
}

SAMPLES = infile_loc.keys()

rule print_file_name:
    input:
        expand("{sample}", sample=SAMPLES)
    params:
        read1=lambda wildcards: infile_loc[wildcards.sample][0],
        read2=lambda wildcards: infile_loc[wildcards.sample][1]
    script:
        """
        echo {params.read1}
        echo {params.read2}
        """

方法2:让lambda返回字典映射参数

让lambda函数返回包含read1和read2键的字典,Snakemake会自动将字典键映射为params的属性:

infile_loc = {
    "Sample1": ["/home/joshua/snakemake_works/input/Sample1_R1.fq.gz", "/home/joshua/snakemake_works/input/Sample1_R2.fq.gz"],
    "Sample2": ["/home/joshua/snakemake_works/input/Sample2_R1.fq.gz", "/home/joshua/snakemake_works/input/Sample2_R2.fq.gz"]
}

SAMPLES = infile_loc.keys()

rule print_file_name:
    input:
        expand("{sample}", sample=SAMPLES)
    params:
        lambda wildcards: {
            "read1": infile_loc[wildcards.sample][0],
            "read2": infile_loc[wildcards.sample][1]
        }
    script:
        """
        echo {params.read1}
        echo {params.read2}
        """

额外优化提示

原代码中input: expand("{sample}", sample=SAMPLES)没有指向实际文件,若规则不需要依赖输入文件可直接删除;如果需要关联FastQ文件作为输入,可改为:

input:
    expand("/home/joshua/snakemake_works/input/{sample}_R{1,2}.fq.gz", sample=SAMPLES)

内容的提问来源于stack exchange,提问作者Joshua Jebaraj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:20:03