Skip to main content

grpc4bmi

DOI CI Documentation Status

Purpose

This software allows you to wrap your Basic Model Interface (BMI) implementation in a server process and communicate with it via the included Python client. The communication is serialized to protocol buffers by GRPC and occurs over network ports. Can run models in isolated containers using Docker or Apptainer.

Installation

Optionally, create your virtual environment and activate it, Then, run

pip install grpc4bmi

on the client (Python) side. If your server model is implemented in Python, do the same in the server environment (e.g. docker container). If the model is implemented in R, run instead

pip install grpc4bmi[R]

If the model is implemented in Julia, run instead

pip install grpc4bmi[julia]

in the server environment. For bleeding edge version from GitHub use

pip install git+https://github.com/eWaterCycle/grpc4bmi.git#egg=grpc4bmi

Finally if the model is implemented in C or C++, clone this git repo and run

make
make install

in the cpp folder.

Usage

Model written in Python

A model should be a subclass of the Bmi class from the bmipy package.

For inspiration look at the example in the test directory.

To start a server process that allows calls to your BMI implementation, type

run-bmi-server --name <PACKAGE>.<MODULE>.<CLASS> --port <PORT> --path <PATH>

where <PACKAGE>, <MODULE> are the python package and module containing your implementation, <CLASS> is your bmi model class name, <PORT> is any available port on the host system, and optionally <PATH> denotes an additional path that should be added to the system path to make your implementation work. The name option above is optional, and if not provided the script will look at the environment variables BMI_PACKAGE, BMI_MODULE and BMI_CLASS. Similarly, the port can be defined by the environment variable BMI_PORT. This software assumes that your implementation constructor has no parameters.

Model written in C/C++ (beta)

Create an executable along the lines of cpp/run-bmi-server.cc. You can copy the file and replace the function

Bmi* create_model_instance()
{
    /* Return your new BMI instance pointer here... */
}

with the instantiation of your model BMI. The model needs to implement the csdms BMI for C, but you may also implement our more object-oriented C++ interface BmiCppExtension.

Model written in R

The grpc4bmi Python package can also run BMI models written in R if the model is a subclass of AbstractBmi See https://github.com/eWaterCycle/bmi-r for instruction on R and Docker.

Run the R model a server with

run-bmi-server --lang R [--path <R file with BMI model>] --name [<PACKAGE>::]<CLASS> --port <PORT>

For example with WALRUS use

run-bmi-server --lang R --path ~/git/eWaterCycle/grpc4bmi-examples/walrus/walrus-bmi.r --name WalrusBmi --port 55555

Models written in Julia

Instructions

The grpc4bmi Python package can also run BMI models written in Julia if the model has an implementation of the BasicModelInterface.jl.

Run the Julia model in Python with

from grpc4bmi.bmi_julia_model import BmiJulia

mymodel = BmiJulia.from_name('<package>.<model>', 'BasicModelInterface')

For example with Wflow.jl use

# Install Wflow.jl package in the Julia environment managed by the juliacall Python package.
from juliacall import Main as jl
jl.Pkg.add("Wflow")
# Create the model
from grpc4bmi.bmi_julia_model import BmiJulia
mymodel = BmiJulia.from_name('Wflow.Model', 'Wflow.bmi.BMI')

A Julia model has to be run locally. It can not be run in the default gRPC client/server Docker container mode because:

  1. Julia has no gRPC server implementation
  2. Calling Julia methods from Python gRPC server causes 100% CPU usage and no progress
  3. Calling Julia methods from C++ gRPC server causes segmentation faults

The client side

The client side has only a Python implementation. The default BMI client assumes a running server process on a given port.

from grpc4bmi.bmi_grpc_client import BmiClient
import grpc
mymodel = BmiClient(grpc.insecure_channel("localhost:<PORT>"))
print mymodel.get_component_name()
mymodel.initialize(<FILEPATH>)
...further BMI calls...

The package contains also client implementation that own the server process, either as a Python subprocess or a Docker container or a Singularity container or a Apptainer container running the run-bmi-server script. For instance

from grpc4bmi.bmi_client_subproc import BmiClientSubProcess
mymodel = BmiClientSubProcess(<PACKAGE>.<MODULE>.<CLASS>)

will automatically launch the server in a sub-process and

from grpc4bmi.bmi_client_docker import BmiClientDocker
mymodel = BmiClientDocker(<IMAGE>, <WORK DIR TO MOUNT>, input_dirs=[<INPUT DIRECTORIES TO MOUNT>])

will launch a Docker container based on supplied Docker image and will mount supplied directories to share files between the container and host.

from grpc4bmi.bmi_client_singularity import BmiClientSingularity
mymodel = BmiClientSingularity(<IMAGE>, <WORK DIR TO MOUNT>, input_dirs=[<INPUT DIRECTORIES TO MOUNT>])

will launch a singularity container on based supplied Singularity image and will mount supplied directories to share files between the container and host.

from grpc4bmi.bmi_client_apptainer import BmiClientApptainer
mymodel = BmiClientApptainer(<IMAGE>, <WORK DIR TO MOUNT>, input_dirs=[<INPUT DIRECTORIES TO MOUNT>])

will launch a Apptainer container on based supplied Apptainer image and will mount supplied directories to share files between the container and host.

For more documentation see https://grpc4bmi.readthedocs.io/.

Development: generating the gRPC code

When developers change the proto-file, it is necessary to install gRPC tools Python packages in your Python environment:

# Create virtual env
python3 -m venv .venv
. venv/bin/activate
# Make sure latest pip and wheel are install
pip install -U pip wheel
pip install -r dev-requirements.txt
# For R integration also install the R extras with
pip install -e .[R]
# For building docs (cd docs && make html) also install the docs extras with
pip install -e .[docs]

and install the C++ runtime and protoc command as described in https://github.com/google/protobuf/blob/master/src/README.md. After this, simply executing the proto_gen.sh script should do the job.

Metadata

Release files for grpc4bmi 0.6.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for grpc4bmi 0.6.1
File Size Uploaded
grpc4bmi-0.6.1.tar.gz 55.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for grpc4bmi 0.6.1
File Interpreter ABI Platform
grpc4bmi-0.6.1-py3-none-any.whl Python 3 none any Details

Total release size: 102.2 kB

Release files / grpc4bmi-0.6.1.tar.gz

Download URL grpc4bmi-0.6.1.tar.gz
Size 55.0 kB
Tags Source
SHA-256 checksum
How to use checksums
23e9a716398ed2ae73c90eb0f4aa3711506dadb5e83ba8fd0f2b2ce91bb4496a
BLAKE2b-256 checksum
How to use checksums
7902537fe294687b185c73ba70794efaab16f371a99a37f0a01f4d66d31792e3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.

Transparency log

Release files / grpc4bmi-0.6.1-py3-none-any.whl

Download URL grpc4bmi-0.6.1-py3-none-any.whl
Size 47.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0ba69dd224e02c579a2b7251e332edea26822cc7f3495fa1a2aa2968ec3fb8e4
BLAKE2b-256 checksum
How to use checksums
087bad83c67a9762cb8d84f1c0cdebe65cba9065979777324b14c410f0f5ed03
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.6.1 This release

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3

2 release files

0.2.17

2 release files

0.2.16

2 release files

0.2.15

2 release files

0.2.14

2 release files

0.2.13

2 release files

0.2.12

2 release files

0.2.11

2 release files

0.2.10

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2

2 release files

0.1.4

2 release files

0.1.3

1 release file

0.1.2

1 release file

0.1.1

1 release file

0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page