Snakemake规则引用threads变量触发NameError,求助问题排查
问题
我编写了如下Snakemake规则:
rule get_coverage: input: cram=lambda wildcards: expand(config['input']['cram'][wildcards.reference_genome], #access_id = access_id[wildcards.sample_name], sample_name='{sample_name}'), bai=lambda wildcards: expand(config['input']['cram'][wildcards.reference_genome] + '.crai', #access_id = access_id[wildcards.sample_name], sample_name='{sample_name}'), ref=lambda wildcards: config['reference_genome'][wildcards.reference_genome], chrom_size=lambda wildcards: config['chrom_size'][wildcards.reference_genome] output: coverage=directory(config['output']['median_coverage']) conda: src + '/env/acc_mask.yml' threads: 19 script: """ mosdepth \ -n \ -t {threads} \ --use-median \ -f {input.ref} \ -b {input.chrom_size} \ {output.median_coverage} \ {input.cram} """
运行时出现如下错误:
RuleException: NameError in line xxx of xxx.smk: The name 'threads' is unknown in this context. Please make sure that you defined that variable. Also note that braces not used for variable access have to be ...
我原本认为threads可作为通配符在shell中替换,请问我的脚本存在什么问题?
解答
问题根源在于混淆了Snakemake中script和shell的用法:
script:关键字用于指定外部脚本文件路径(比如.py或.sh文件),不能直接写内联shell命令,其上下文无法识别规则的threads属性。- 若要编写内联shell命令,必须使用
shell:关键字,此时才能正常引用规则定义的threads、input、output等变量。
修正后的规则只需将script:替换为shell:即可:
rule get_coverage: input: cram=lambda wildcards: expand(config['input']['cram'][wildcards.reference_genome], #access_id = access_id[wildcards.sample_name], sample_name='{sample_name}'), bai=lambda wildcards: expand(config['input']['cram'][wildcards.reference_genome] + '.crai', #access_id = access_id[wildcards.sample_name], sample_name='{sample_name}'), ref=lambda wildcards: config['reference_genome'][wildcards.reference_genome], chrom_size=lambda wildcards: config['chrom_size'][wildcards.reference_genome] output: coverage=directory(config['output']['median_coverage']) conda: src + '/env/acc_mask.yml' threads: 19 shell: """ mosdepth \ -n \ -t {threads} \ --use-median \ -f {input.ref} \ -b {input.chrom_size} \ {output.median_coverage} \ {input.cram} """
补充说明:如果确实需要调用外部脚本(使用script:),则需在脚本内通过snake.threads的方式引用线程数,但你的场景是直接执行shell命令,shell:才是正确选择。
内容的提问来源于stack exchange,提问作者zhang
相关产品推荐
相关产品推荐

