我正在开发一个使用自定义模块的 Nextflow 管道。该模块包含一个script_1.py
位于嵌套文件夹 中的 Python 脚本 ( ) <module-dir>/resources/usr/bin
。script_1.py
已设置为可执行文件,并且已在文件中nextflow.enable.moduleBinaries
设置为。但是,当我尝试运行该管道时,出现找不到 Python 脚本的错误。true
./nextflow.config
模块目录结构
modules/
└── local/
└── mymodule/
├── environment.yml
├── main.nf
├── resources/
│ └── usr/
│ └── bin/
│ └── script_1.py
└── work/
错误信息
这是我在运行管道时遇到的错误:
Caused by:
Process `MyProcess (1)` terminated with an error exit status (2)
Command executed:
python script_1.py
cat <<-END_VERSIONS > versions.yml
"MyProcess":
python: $(python --version 2>&1 | sed 's/Python //g')
END_VERSIONS
Command exit status:
2
Command output:
(empty)
Command error:
python: can't open file 'script_1.py': [Errno 2] No such file or directory
我尝试过
在我的 中main.nf
,我有以下内容:
#!/usr/bin/env nextflow
include { MyProcess } from './modules/local/mymodule/main.nf'
在我的 中./modules/local/mymodule/main.nf
,我有以下内容:
#!/usr/bin/env nextflow
process MyProcess{
conda "${moduleDir}/environment.yml"
input:
path(input_folder)
output:
path("data.csv")
path "versions.yml" , emit: versions
script:
"""
python script_1.py ${input_folder}
cat <<-END_VERSIONS > versions.yml
"${task.process}":
python: \$(python --version 2>&1 | sed 's/Python //g')
END_VERSIONS
"""
}
但script_1.py
始终找不到,并且过程失败。
我的问题
这是在 Nextflow 管道中的模块中引用此类脚本的正确方法吗?
我怀疑这是因为您没有像文档中建议的那样将 python 脚本视为二进制文件。
使用
python script_1.py
,它告诉进程使用 Python 在本地查找脚本,而不是将脚本作为二进制文件调用。相反,您应该使用 将脚本视为二进制文件script_1.py
,但要确保脚本中的 shebang 指向正确的解释器。我通常直接将脚本作为值通道读取,因为这样更方便,而且你不需要在 GCP/AWS 上使用 wave-containers,所以这个答案只是我对文档的解读。希望它能有效。