Snakemake中如何直接引用某规则的输出作为下一规则的输入
Snakemake跨规则引用输出的正确实现方案
你写法失效的核心原因是缺少Snakemake内置的rules命名空间前缀,引用其他规则的输出时需要加上此前缀才能被正确解析。
基础场景修正示例
rule A: input: in_file = "path/to/in_file" output: out_file = "path/to/out_file" shell: "...." rule B: input: # 加上rules.前缀即可正常引用规则A的输出 in_file = rules.A.output.out_file output: # 注意不要和上游规则的输出路径完全重复,避免冲突 out_file = "path/to/final_output_file" shell: "...."
注意事项
- 规则定义顺序要求:被引用的规则必须定义在引用它的规则之前,否则Snakemake解析工作流时会找不到对应规则对象
- 该引用方式天然支持带通配符的批量工作流场景,Snakemake会自动匹配对应通配符的上游输出路径,无需手动拼接
带通配符的批量场景示例
# 总目标规则,定义要生成的所有最终文件 rule all: input: expand("variants/{sample}.vcf", sample=["sample1", "sample2", "sample3"]) # 上游序列比对规则 rule align: input: "raw_data/{sample}.fastq" output: bam = "aligned/{sample}.sorted.bam" shell: "bwa mem reference.fasta {input} | samtools sort -o {output.bam}" # 下游变异检测规则,直接引用上游规则的输出 rule call_variant: input: bam = rules.align.output.bam output: vcf = "variants/{sample}.vcf" shell: "gatk HaplotypeCaller -R reference.fasta -I {input.bam} -O {output.vcf}"
内容的提问来源于stack exchange,提问作者nhaus
相关产品推荐
相关产品推荐

