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

Nextflow DSL2进程输出作为其他进程输入的问题排查

Nextflow DSL2进程间输入输出/通道逻辑问题及修复

问题描述

我搞不懂Nextflow DSL2里把一个进程的输出作为另一个进程输入时,通道、输入和输出的组织逻辑。现有文件对/some/path/to/filepair{1,2}.fastq.gz,我想先在一个进程里把它们复制到新路径,再传递到下一个进程解压,写了如下代码:

#!/usr/bin/env nextflow

nextflow.enable.dsl=2

reads_ch=Channel.fromPath('/some/path/to/filepair{1,2}.fastq.gz')
workflow {
  doMove(reads_ch)
  doUnzip(doMove.out)
}

process doMove {
  input: 
    path reads_ch
    
  output:
    path(moved)
  script:
    """
    cp '${filepairs}' /some/new/path/
    """
    
}

process doUnzip {
  input: 
    path(moved)
    
  output:
    stdout
  script:
    """
    gunzip $moved
    """
    
}

运行后出现错误:

Error executing process > 'doMove (21)'

Caused by:
  Missing output file(s) `moved` expected by process `doMove (21)`

Command executed:

  cp '/some/path/to/filepair1.fastq.gz' /some/new/path/

Command exit status:
  0

Command output:
  (empty)

Work dir:
  /some/new/path/work/ce/f93032ae5ac36481e4452440440eab

Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run`

错误原因分析

  1. 变量名不匹配:doMove进程输入定义的变量是reads_ch,但脚本里用了未定义的${filepairs},会导致复制操作异常。
  2. 输出路径未明确指定且脱离管控:原代码中cp到绝对路径/some/new/path/,但Nextflow会在进程的独立工作目录中查找输出文件moved,自然找不到,这是报错的核心原因。
  3. 解压逻辑不合理:gunzip默认会删除原.gz文件并生成同名非压缩文件,原代码输出stdout但未用gunzip -c输出内容,逻辑不匹配。

修正后的代码

#!/usr/bin/env nextflow

nextflow.enable.dsl=2

// 从指定路径创建通道,每个文件作为独立元素传入后续进程
reads_ch = Channel.fromPath('/some/path/to/filepair{1,2}.fastq.gz')

workflow {
    // 调用doMove处理输入文件,接收输出通道
    moved_files = doMove(reads_ch)
    // 将复制后的文件传入doUnzip进程
    doUnzip(moved_files)
}

process doMove {
    input:
        // 接收通道中的单个文件,变量名简化为reads
        path reads

    output:
        // 明确输出工作目录内new_path下的.gz文件,命名输出通道为moved
        path "new_path/*.fastq.gz", emit: moved

    script:
        // 先创建工作目录内的子目录,再复制文件(避免绝对路径脱离管控)
        """
        mkdir -p new_path
        cp "${reads}" new_path/
        """
}

process doUnzip {
    input:
        // 接收doMove输出的文件
        path moved_reads

    output:
        // 输出解压后的.fastq文件,命名输出通道为unzipped
        path "*.fastq", emit: unzipped

    script:
        // 用-k参数保留原.gz文件,直接解压生成.fastq
        """
        gunzip -k "${moved_reads}"
        """
}

核心逻辑说明

  1. 通道机制:Channel.fromPath会把匹配到的每个文件作为独立元素发送到通道,doMove会针对每个文件单独启动一次进程(默认并行处理)。
  2. 进程输入输出规范:
    • 输入用path关键字声明,Nextflow会自动将通道中的文件复制到进程的独立工作目录(staging)。
    • 输出必须明确指定文件路径,让Nextflow能追踪到输出文件;避免使用绝对路径,否则会脱离Nextflow的文件生命周期管理,导致找不到输出。
  3. 进程间数据传递:前一个进程的输出通道(如doMove.out或命名的moved)可以直接作为下一个进程的输入,Nextflow会自动处理文件的传递。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:18:09