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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:37:44