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
相关产品推荐
相关产品推荐

