Nextflow:如何从流程输出目录获取文件传入BLAST?
Nextflow流程问题解决思路:CONSENSUS_BUILDING到BLAST的文件传递
核心报错原因
报错No signature of method: nextflow.util.BlankSeparatedList.getParent()本质是CONSENSUS_BUILDING输出的通道包含的是fasta文件列表,而非单个文件路径,导致BLAST流程中调用fasta.getParent()方法时,因对象是列表而非单个文件路径而失败。
分步解决步骤
1. 修正CONSENSUS_BUILDING的输出模式
原输出会将匹配到的所有fasta文件打包成一个列表输出,需改为逐个输出单个文件,添加each: true参数:
process CONSENSUS_BUILDING { publishDir "${params.outdir}/consensus", mode: 'copy' input: path fastq output: path "${fastq.getSimpleName()}_ID/*.fasta", emit: consensus_fastas, each: true script: """ gunzip -f ${fastq} NGSpeciesID --ont --sample_size 10000 --consensus --racon --racon_iter 3 --fastq ${fastq.getSimpleName()}.fastq --m 650 --s 50 --outfolder ${fastq.getSimpleName()}_ID """ }
each: true会让通道将匹配到的每个fasta文件作为独立元素传递,而非打包成列表。
2. 修正BLAST流程的路径调用逻辑
现在输入的是单个fasta文件,fasta.getParent()可以正常调用,同时建议简化输出文件名避免路径拼接错误:
process BLAST { publishDir "${params.outdir}/blast", mode: 'copy' container 'docker://ncbi/blast' input: path fasta path db output: path "${fasta.baseName}.blast" script: """ # 确保db_name已定义,或替换为实际数据库名称(比如用${db.baseName}获取目录名) blastn -db ${db}/${db_name} -query ${fasta} -outfmt '6 sseqid stitle pident length mismatch gapopen qstart qend sstart send evalue bitscore' -out ${fasta.baseName}.blast """ }
3. 简化工作流的通道调用逻辑
不需要额外创建ch_forBlast通道,直接使用CONSENSUS_BUILDING输出的通道即可:
workflow { ... ch_consensus = CONSENSUS_BUILDING(ch_trimmed.fastq) ch_blast = BLAST(ch_consensus.consensus_fastas, db_dir) }
- 原代码中
Channel.fromPath("${ch_consensus.consensusDir}/*.fasta")是错误用法,因为ch_consensus是通道对象,不能直接拼接成字符串路径。
4. 验证中间输出
确认CONSENSUS_BUILDING流程的输出目录${fastq.getSimpleName()}_ID下确实生成了fasta文件,避免因上游流程无输出导致的空文件问题。
内容的提问来源于stack exchange,提问作者ramiro
相关产品推荐
相关产品推荐

