Skip to content

bebump/bbmp_interop

Repository files navigation

About

bbmp_interop is an automatic code-generator for pybind11 and a corresponding CMake module.

It aims to reduce the user written boilerplate to an absolute minimum, when exporting C++ functions to a Python extension module. If you have a target foo written in C++, adding the following line to your build will create a shared library target, i.e. a Python extension module, called pyfoo.

bbmp_add_python_module(pyfoo LINK_LIBRARIES foo)

The module is entirely autogenerated, and will expose any function in foo that was annotated with the EXPORT_TO_PYTHON definition.

The original library target foo will remain unchanged. It does not need to depend on Python as pybind11 can convert between many C++ STL and Python types. Moreover bbmp_interop can convert between Numpy ndarray parameters and a thin wrapper type that has no dependency on Python.

The pybind11 library is included, so the only dependency you need is Python 3.6.

Usage

You can use the library either by installing it and then using

find_package(bbmp_interop 0.1 REQUIRED)

or by placing it into your project and using add_subdirectory.

You will see examples for both usages in tests/test_export_import.py, although the projects are constructed during runtime in a temporary directory, so it's easier to begin with the CMake project inside the tests directory.

Adding the package will add the bbmp_types (or bbmp::bbmp_types in case of installing) target to your project.

Merely by adding the library to your project will not create a dependency on Python. You can link your libraries against the bbmp_types target if you wish to use the bbmp::OwnedChannelData<T> type. This type can refer to Numpy ndarrays, but using them is optional.

Calling bbmp_add_python_module will create three targets: extern_pybind11, bbmp_python_conversions and the Python extension module, the name of which is the first argument of bbmp_add_python_module. Generally you shouldn't be concerned with the first two.

The function calls CMake's FindPython find module internally. Specify Python_ROOT_DIR or Python_VERSION if you want to influence its result.

The library you want to export functions from need not depend on Python. You can use standard types that pybind11 understands. In case you want to have a Numpy ndarray as a parameter, you can use the bbmp::OwnedChannelData<T> type.

Inside the autogenerated Python module types of bbmp::OwnedChannelData<T> will be translated to parameters of Numpy ndarray. The bbmp::OwnedChannelData<T> parameter of your function will have ownership over the ndarray created in Python, so you can safely keep it even after the exported function returns.

Running tests

The CMake project uses CTest. After generating the build you can run ctest --verbose from inside the build directory to run all tests.

I have tested them on Windows 10 (with Visual Studio 2017 and NMake generators) and Ubuntu 20 and GCC.

In-source dependencies

The extern directory contains code that's part of pybind11.

pybind11 version v2.5.0 from the stable branch. https://github.com/pybind/pybind11 Copyright (c) 2016 Wenzel Jakob [email protected], All rights reserved. Licensed under the 3-clause BSD license.

About

Python extension module generator for pybind11

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published