Snakemake Python包装器wildcards传递失败:taxon未定义报错
Snakemake配置参数传递失败问题修复
问题场景
作为Snakemake新手,我编写了Python包装器run_pipeline.py读取samples.txt(包含taxon、read1、read2、adapters、assembly字段),根据assembly值选择运行带组装的SNPwAssembly.smk或不带组装的Snakefile。但运行时Snakefile无法获取包装器传递的参数信息,报错name 'taxon' is not defined。
相关文件内容
samples.txt
Solatube DRR350770_1.fastq.gz DRR350770_2.fastq.gz all.fa Y
run_pipeline.py
import argparse import os parser = argparse.ArgumentParser(description="Run Snakemake pipeline with Trinity assemble or not") parser.add_argument("samples", help="path to samples.txt") args = parser.parse_args() with open(args.samples) as f: for line in f: taxon, read1, read2, adapters, assembly = [x.strip() for x in line.split()] if assembly == "Y": os.system(f"snakemake -s SNPwAssembly.smk --cores 16 --config taxon={taxon} read1={read1} read2={read2} adapters={adapters}") elif assembly == "N": os.system(f"snakemake -s SNPwoAssembly≈.smk --cores 16 --config taxon={taxon} read1={read1} read2={read2} adapters={adapters}") else: print(f"Invalid value for assembly in line: {line}")
SNPwAssembly.smk(起始部分)
import os # define rules rule all: input: expand("{taxon}.snpden", taxon = taxon) rule trinity_assembly: input: read1 = "{taxon}/{read1}", read2 = "{taxon}/{read2}", adapters = "{adapters}" output: "{taxon}/trinity_out_dir/Trinity.fasta" threads: 15 shell: ''' singularity exec -e {trinity_path} Trinity --seqType fq --max_memory 450G --left SRR12102895_1.fastq.gz --right SRR12102895_2.fastq.gz --CPU 15 --trimmomatic --quality_trimming_params "all.fa:2:30:10 SLIDINGWINDOW:4:5 LEADING:5 TRAILING:5 MINLEN:25" --output trinity_out_dir '''
报错信息
name 'taxon' is not defined
问题原因
- 配置参数引用错误:通过
--config传递的参数属于Snakemake的config对象,直接写taxon会被当作未定义变量,正确引用方式应为config.taxon。 - Shell命令硬编码输入:Trinity命令里的
--left/--right用了固定文件名,没有引用Snakefile的input变量,导致传递的read1/read2参数未生效。 - 文件名拼写错误:
SNPwoAssembly≈.smk中的≈是无效字符,会导致Snakemake找不到对应文件。
修复步骤
1. 修正Snakefile的参数引用逻辑
修改SNPwAssembly.smk,统一通过config对象访问外部参数,并替换硬编码的命令内容:
import os # define rules rule all: input: expand("{taxon}.snpden", taxon = config.taxon) rule trinity_assembly: input: read1 = f"{config.taxon}/{config.read1}", read2 = f"{config.taxon}/{config.read2}", adapters = config.adapters output: f"{config.taxon}/trinity_out_dir/Trinity.fasta" threads: 15 shell: ''' singularity exec -e {trinity_path} Trinity --seqType fq --max_memory 450G --left {input.read1} --right {input.read2} --CPU 15 --trimmomatic --quality_trimming_params "{input.adapters}:2:30:10 SLIDINGWINDOW:4:5 LEADING:5 TRAILING:5 MINLEN:25" --output {config.taxon}/trinity_out_dir '''
2. 修正Python包装器的文件名错误
将SNPwoAssembly≈.smk改为正确的文件名(比如SNPwoAssembly.smk):
elif assembly == "N": os.system(f"snakemake -s SNPwoAssembly.smk --cores 16 --config taxon={taxon} read1={read1} read2={read2} adapters={adapters}")
3. 验证参数传递逻辑
所有通过--config传递的参数,在Snakefile中必须以config.参数名的方式访问,确保参数能正确传递到各个规则中。
额外建议
- 可在Snakefile开头添加
configfile: "config.yaml",用配置文件统一管理参数,减少命令行参数传递的复杂度。 - Shell命令中优先引用
input、output、config变量,避免硬编码,提升流水线的可重复性和维护性。
内容的提问来源于stack exchange,提问作者Lauren Kirsch
相关产品推荐
相关产品推荐

