Snakemake执行报错‘Target rules may not contain wildcards’求助
问题分析与解决方案
错误原因
报错核心是:目标关联的规则输出包含未明确绑定的通配符。你的generateInclude规则输出用了{reference_genome}通配符,但Snakemake无法自动推断该通配符的取值——尽管all规则指定了具体的include_hg19.bed,但默认情况下Snakemake需要明确的通配符匹配逻辑,或者规则直接使用固定值而非通配符。此外原shell脚本中的==两侧无空格,会导致shell条件判断语法错误,这也是潜在问题。
修复方案
方案一:从配置文件读取参考基因组(单基因组场景)
直接通过配置文件获取参考基因组名称,避免使用通配符,规则输出文件名固定:
# minimal example configfile: "../snakemake/config.yaml" import os rule generateInclude: input: archaic_inc=config['input']['archaic_include'], modern_inc=config['input']['modern_include'] output: all_include=f'include_{config["reference_genome"]}.bed' params: reference_genome=config['reference_genome'] shell: """ if [ {params.reference_genome} == 'hg19' ]; then bedtools intersect -a <(zcat {input.archaic_inc} | sed 's/^chr//') \ -b <(zcat {input.modern_inc} | sed 's/^chr//') > {output.all_include} else bedtools intersect -a <(zcat {input.archaic_inc}) \ -b <(zcat {input.modern_inc}) > {output.all_include} fi """ rule all: input: f'include_{config["reference_genome"]}.bed'
方案二:保留通配符(多基因组场景)
如果需要支持多个参考基因组,可通过通配符约束+动态生成目标文件的方式实现:
# minimal example configfile: "../snakemake/config.yaml" import os # 限定通配符只能是配置中允许的参考基因组 wildcard_constraints: reference_genome="|".join(config.get('reference_genomes', ['hg19', 'hg38'])) rule generateInclude: input: archaic_inc=config['input']['archaic_include'], modern_inc=config['input']['modern_include'] output: all_include='include_{reference_genome}.bed' params: reference_genome='{reference_genome}' shell: """ if [ {params.reference_genome} == 'hg19' ]; then bedtools intersect -a <(zcat {input.archaic_inc} | sed 's/^chr//') \ -b <(zcat {input.modern_inc} | sed 's/^chr//') > {output.all_include} else bedtools intersect -a <(zcat {input.archaic_inc}) \ -b <(zcat {input.modern_inc}) > {output.all_include} fi """ rule all: input: # 根据配置中的参考基因组列表,动态生成所有目标文件 [f'include_{rg}.bed' for rg in config.get('reference_genomes', ['hg19'])]
内容的提问来源于stack exchange,提问作者zhang
相关产品推荐
相关产品推荐

