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

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

问题原因

  1. 配置参数引用错误:通过--config传递的参数属于Snakemake的config对象,直接写taxon会被当作未定义变量,正确引用方式应为config.taxon。
  2. Shell命令硬编码输入:Trinity命令里的--left/--right用了固定文件名,没有引用Snakefile的input变量,导致传递的read1/read2参数未生效。
  3. 文件名拼写错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:25:14