nf-python is a Nextflow plugin enabling seamless integration between Nextflow and Python scripts. Python scripts can be invoked as part of your Nextflow workflow, and arguments and outputs will be serialized back-and-forth automatically, making them available as native pythonic objects.
To use the plugin in your Nextflow data pipelines, simply include it by writing include { pyFunction } from 'plugin/nf-python'
and it will be downloaded and installed. For all setup options, please refer to the Nextflow plugins documentation.
nf-python
requires a working python installation in the execution environment. By default, the python
in path will be used.
It is also possible to specify a path to a specific python executable or a conda environment. Either in the configuration file:
nf_python {
// Option 1
executable = '/usr/bin/python'
// Option 2
conda_env = ''
}
The supported values for the conda_env
option are the same ones supported by Nextflow's native conda support, and is using the same configuration options. Here are a few options:
- A list of required packages (e.g.
conda_env = 'numpy biopython'
) - A conda configuration file (e.g.
conda_env = '/opt/task-env.yml'
) - A path to an existing conda environment (e.g.
conda_env = '/home/user/.conda/envs/my-env'
)
It is also possible to specify different environments on a per-function basis:
pyFunction(script: "", x: 1, y: 2, _executable: "/usr/bin/python")
pyFunction(script: "", x: 1, y: 2, _conda_env: "matplotlib")
To use a python script as part of your Nextflow pipeline, import pyFunction
from the nf-python
plugin:
include { pyFunction } from 'plugin/nf-python'
pyFunction('my_other_script.py', foo: 'too')
Usage inside python is easy:
- Arguments (like
foo
) are passed asnf_python.nf.args
. - To return results to nextflow, use
nf_python.nf.output(...)
- All major native data types (lists, dicts, etc.) are supported.
# example_script.py
from nf_python import nf
# Access arguments and options
print(nf.args)
print(nf.opts)
# Assign output
nf.output(result=nf.args[0] + 1)
pyFunction
also support inline code. Here is an example:
result = pyFunction("""
# Code is automatically de-indented correctly
# `nf_python.nf` is accessible as `nf`
nf.output(arg1=123, arg2='abc')
""")
assert result == [arg1: 123, arg2: 'abc']
result = pyFunction("""
nf.output(arg1=123, arg2='abc', arg3=nf.args['foo'])
""", foo: 1)
assert result == [arg1: 123, arg2: 'abc', arg3: 1]
Contributions and feedback are welcome! This project is in a preliminary exploration stage and lots of possible functionality remains to be added.
If you want to build and run this plugin from source, you can use this method:
git clone [email protected]:royjacobson/nf-python.git && cd nf-python
make buildPlugins
export VER="0.1.3" # Change appropriately
cp -r build/plugins/nf-python-${VER} ~/.nextflow/plugins/
export NXF_OFFLINE=true
nextflow my_flow.nf -plugins "nf-python@${VER}"
See COPYING
for license information.
The layout of the project is based on the nf-hello project, licensed under the Apache License 2.0.