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

Snakemake工作流重命名SPAdes输出文件报错求助

解决Snakemake中SPAdes组装文件重命名的问题

核心逻辑

Snakemake靠文件依赖追踪运行,必须明确规则的输入输出文件——不能直接引用未被其他规则显式输出的文件,也不能随便把目录当输入(得用directory()标记)。

方案一:修改SPAdes规则,显式输出contigs.fasta

如果能改动原SPAdes规则,直接把contigs.fasta加到输出项里,后续规则就能直接引用:

rule spades:
    input:
        reads1="reads/{sample}_R1.fastq.gz",
        reads2="reads/{sample}_R2.fastq.gz"
    output:
        directory("{sample}_de_novo"),
        "{sample}_de_novo/contigs.fasta"  # 新增这行,显式声明这个文件是输出
    params:
        k="21,33,55"
    shell:
        "spades.py --pe1-1 {input.reads1} --pe1-2 {input.reads2} -k {params.k} -o {output.directory}"

然后写重命名规则:

rule rename_contigs:
    input:
        "{sample}_de_novo/contigs.fasta"
    output:
        "{sample}_de_novo/{sample}.fasta"
    shell:
        "mv {input} {output}"

这样Snakemake能明确追踪到contigs.fasta是SPAdes生成的,不会报MissingInputError,用mv比cp更高效,也避免了目录输入的问题。

方案二:不修改原SPAdes规则的适配方法

如果原SPAdes规则只能输出目录,就在重命名规则里用directory()标记输入目录,同时加通配符约束确保样本名匹配:

先在Snakefile开头加通配符约束(避免样本名里的下划线干扰目录名匹配):

wildcard_constraints:
    sample=r"[^_]+"  # 限定sample只能是不含下划线的字符串,比如foo

然后写重命名规则:

rule rename_contigs:
    input:
        spades_dir=directory("{sample}_de_novo")
    output:
        "{sample}_de_novo/{sample}.fasta"
    shell:
        # 先检查文件存在再重命名,避免无意义报错
        "test -f {input.spades_dir}/contigs.fasta && mv {input.spades_dir}/contigs.fasta {output}"

这里directory()告诉Snakemake输入是一个目录,只要SPAdes生成了这个目录,就会触发重命名步骤。

之前报错的原因

  • 第一种写法:直接拿{sample}_de_novo/contigs.fasta当输入,但原SPAdes规则没把这个文件列为输出,Snakemake找不到它的生成来源,所以报MissingInputError。
  • 第二种写法:用目录当输入却没加directory()标记,Snakemake没法正确识别目录的生成状态,再加上cp命令如果遇到文件不存在或权限问题,就会触发ChildIOException。

内容的提问来源于stack exchange,提问作者Sean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:10:29