Snakemake运行Megahit规则时不使用directory()参数的方案咨询
报错根因
你遇到的报错本质是参数使用不匹配:megahit的-o参数要求传入输出目录路径,但你当前规则里直接把-o指向了声明的输出文件megahit/{sample}/final.contigs.fa,megahit运行时会把该路径作为目录创建,和Snakemake声明的文件类型输出冲突,才触发了类型校验报错。
无需directory()的解决方法
你可以在shell命令中新增临时目录处理逻辑,让megahit输出到临时目录,运行完成后再把需要的目标contig文件移动到规则声明的输出路径即可,完全符合Snakemake最佳实践,也避免了标记目录可能带来的文件丢失风险。
修改后的megahit规则参考:
rule megahit: input: "trimmo/{sample}/{sample}.trimmed.fastq" output: "megahit/{sample}/final.contigs.fa" params: "-m 0.7" log: "logs/megahit/{sample}.log" benchmark: "benchmarks/megahit/{sample}.megahit.benchmark.txt" threads: 10 shell: """ # 创建专属临时目录存放megahit输出 mkdir -p megahit/{wildcards.sample}_tmp megahit -r {input} -o megahit/{wildcards.sample}_tmp {params} -t {threads} # 移动目标contig文件到规则指定的输出路径 mv megahit/{wildcards.sample}_tmp/final.contigs.fa {output} # 不需要保留megahit中间文件的话可删除临时目录,需要保留就注释这行 rm -rf megahit/{wildcards.sample}_tmp """
补充说明
如果后续流程需要用到megahit生成的其他结果文件,只需要把对应文件路径加到output列表中,同时在shell逻辑里把对应文件从临时目录移动到指定路径即可,不需要对整个输出目录做标记。
内容的提问来源于stack exchange,提问作者Blackadder901
相关产品推荐
相关产品推荐

