Snakemake中Wildcards对象报AttributeError:无'sample'属性求助
问题:Snakemake中触发
AttributeError: 'Wildcards' object has no attribute 'sample'错误 我在Snakemake平台尝试了多种解决方案都没奏效,始终搞不懂为什么会出现这个错误:AttributeError: 'Wildcards' object has no attribute 'sample'
我的实现代码如下:
import pandas as pd sample_csv = os.path.join(BASE_DIR, "samples.csv") sample_table = pd.read_csv(sample_csv).set_index('sample', drop=False) def get_fq1(wildcards): return sample_table.loc[wildcards.sample, 'fastq1'] def get_fq2(wildcards): return sample_table.loc[wildcards.sample, 'fastq2'] def get_fq_files_dict(wildcards): return { "r1" : sample_table.loc[wildcards.sample, 'fastq1'], "r2" : sample_table.loc[wildcards.sample, 'fastq2'], } rule fastp: input: unpack(get_fq_files_dict) output: expand(base_dir + "/trimmed/{sample}_trimmed.{r}.fastq.gz", sample=SAMPLES_f, # This is refined elsewhere, r=['_1','_2']) shell: """ echo {input} # This is just a decoy command """
执行代码时触发的错误:
AttributeError: 'Wildcards' object has no attribute 'sample'
问题原因与解决方案
核心原因
fastp规则的输出直接用expand()生成了所有样本的文件列表,导致规则本身没有{sample}通配符上下文。Snakemake调用输入函数get_fq_files_dict时,无法获取到对应的sample通配符值,因此报错找不到wildcards.sample。
修复方案
修改规则为单样本处理模式,用通配符定义输出,再通过顶层规则触发所有样本的任务:
rule fastp: input: unpack(get_fq_files_dict) output: r1=base_dir + "/trimmed/{sample}_trimmed._1.fastq.gz", r2=base_dir + "/trimmed/{sample}_trimmed._2.fastq.gz" shell: """ echo {input.r1} {input.r2} """ # 新增顶层规则,触发所有样本的fastp任务 rule all: input: expand(base_dir + "/trimmed/{sample}_trimmed.{r}.fastq.gz", sample=SAMPLES_f, r=['_1','_2'])
额外说明
- 直接在规则输出中使用
expand()会让规则变成"聚合型"任务,失去单个样本的通配符上下文,输入函数无法获取wildcards.sample。 - 正确的逻辑是让规则处理单个样本的任务,用通配符占位,再通过
rule all聚合所有目标文件,自动触发所有样本的对应任务。 - 使用
unpack()配合字典输入时,输出最好也用对应的键(如r1、r2),能让输入输出的对应关系更清晰,也方便在shell命令中精准引用。
内容的提问来源于stack exchange,提问作者George Odette
相关产品推荐
相关产品推荐

