如何调用将在 Nextflow 脚本中创建的变量的值转发到值输出通道?

How to call a forward the value of a variable created in the script in Nextflow to a value output channel?

我有一个生成值的过程。我想将这个值转发到一个值输出通道中。但我似乎无法让它一次性运行 - 我总是必须为输出生成一个文件,然后从第一个开始定义一个新通道:

process calculate{

input:
file div from json_ch.collect()
path "metadata.csv" from meta_ch

output:
file "dir/file.txt" into inter_ch


script:
"""
echo ${div} > alljsons.txt
mkdir dir
python3 $baseDir/scripts/calculate.py alljsons.txt metadata.csv dir/
"""

}

ch = inter_ch.map{file(it).text}

ch.view()

我该如何解决这个问题?

谢谢!

最佳,t.

如果您的脚本执行重要的计算,那么像您所做的那样将结果写入文件绝对没问题 - 这种方法并没有什么错。但是,由于 'inter_ch' 通道已经发出文件(或路径),您可以简单地使用:

ch = inter_ch.map { it.text }

这里的 objective 是什么并不完全清楚。如果希望减少创建的频道数量,请考虑改用新的 DSL 2。这不会让您避免将计算结果写入文件,但这可能意味着您可以避免使用中间渠道。

另一方面,如果您的 Python 脚本实际上做了一些相当微不足道的事情并且可以重构,则可以分配一个(全局)变量(在 script: 关键字下方)这样它就可以在您的输出声明中引用,例如下面示例中的 x = ... 行:

Valid output values are value literals, input value identifiers, variables accessible in the process scope and value expressions. For example:

process foo {

  input:
  file fasta from 'dummy'

  output:
  val x into var_channel
  val 'BB11' into str_channel
  val "${fasta.baseName}.out" into exp_channel

  script:
  x = fasta.name
  """
  cat $x > file
  """
}

除此之外,您的选择是有限的。您可能已经考虑过使用 env output qualifier,但这只是在运行时向您的 shell 脚本添加了一些语法糖,这样仍然会创建一个输出文件:

test.nf 的内容:

process test {

    output:
    env myval into out_ch

    script:
    '''
    myval=$(calc.py)
    '''
}

out_ch.view()

bin/calc.py 的内容 (chmod +x):

#!/usr/bin/env python
print('foobarbaz')

运行 与:

$ nextflow run test.nf 
N E X T F L O W  ~  version 21.04.3
Launching `test.nf` [magical_bassi] - revision: ba61633d9d
executor >  local (1)
[bf/48815a] process > test [100%] 1 of 1 ✔
foobarbaz

$ cat work/bf/48815aeefecdac110ef464928f0471/.command.sh 
#!/bin/bash -ue
myval=$(calc.py)

# capture process environment
set +u
echo myval=$myval > .command.env