Top Related Projects
Quick Overview
pybind11 is a lightweight header-only C++ library that enables seamless interoperability between C++11 and Python. It allows you to expose C++ types in Python and vice versa, making it easy to create Python bindings for existing C++ code or to embed Python in C++ applications.
Pros
- Easy to use and requires minimal boilerplate code
- Supports modern C++ features and Python 3
- Excellent performance due to its lightweight nature
- Comprehensive documentation and active community support
Cons
- Limited support for older C++ standards (pre-C++11)
- May require additional setup for complex projects
- Learning curve for developers new to C++ and Python integration
- Some advanced features might require deeper understanding of both languages
Code Examples
- Exposing a C++ function to Python:
#include <pybind11/pybind11.h>
int add(int i, int j) {
return i + j;
}
PYBIND11_MODULE(example, m) {
m.doc() = "pybind11 example plugin";
m.def("add", &add, "A function that adds two numbers");
}
- Exposing a C++ class to Python:
#include <pybind11/pybind11.h>
class Pet {
public:
Pet(const std::string &name) : name(name) { }
void setName(const std::string &name_) { name = name_; }
const std::string &getName() const { return name; }
private:
std::string name;
};
PYBIND11_MODULE(example, m) {
pybind11::class_<Pet>(m, "Pet")
.def(pybind11::init<const std::string &>())
.def("setName", &Pet::setName)
.def("getName", &Pet::getName);
}
- Using NumPy arrays with pybind11:
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
namespace py = pybind11;
py::array_t<double> multiply_array(py::array_t<double> input1, py::array_t<double> input2) {
auto buf1 = input1.request(), buf2 = input2.request();
auto result = py::array_t<double>(buf1.size);
auto buf3 = result.request();
double *ptr1 = static_cast<double *>(buf1.ptr);
double *ptr2 = static_cast<double *>(buf2.ptr);
double *ptr3 = static_cast<double *>(buf3.ptr);
for (size_t i = 0; i < buf1.size; i++)
ptr3[i] = ptr1[i] * ptr2[i];
return result;
}
PYBIND11_MODULE(example, m) {
m.def("multiply_array", &multiply_array, "Multiply two NumPy arrays element-wise");
}
Getting Started
- Install pybind11:
pip install pybind11
-
Create a C++ file (e.g.,
example.cpp
) with your bindings. -
Compile the module:
c++ -O3 -Wall -shared -std=c++11 -fPIC $(python3 -m pybind11 --includes) example.cpp -o example$(python3-config --extension-suffix)
- Import and use the module in Python:
import example
result = example.add(3, 4)
print(result) # Output: 7
Competitor Comparisons
The most widely used Python to C compiler
Pros of Cython
- Allows writing Python-like code that compiles to C, offering a gentler learning curve
- Provides more fine-grained control over Python/C interactions
- Supports easy integration with NumPy arrays and other scientific computing libraries
Cons of Cython
- Requires a separate compilation step, which can complicate build processes
- Less straightforward for wrapping existing C++ code
- Can be more verbose when interfacing with complex C++ types
Code Comparison
Cython:
cdef extern from "example.h":
int add(int a, int b)
def py_add(a: int, b: int) -> int:
return add(a, b)
pybind11:
#include <pybind11/pybind11.h>
namespace py = pybind11;
PYBIND11_MODULE(example, m) {
m.def("add", &add, "A function that adds two numbers");
}
Both Cython and pybind11 are powerful tools for creating Python extensions, with Cython offering a more Python-like syntax and pybind11 providing a more C++-centric approach. The choice between them often depends on the specific project requirements and developer preferences.
Minimalistic GUI library for OpenGL
Pros of nanogui
- Provides a lightweight, cross-platform GUI library for OpenGL applications
- Offers a simple and intuitive API for creating user interfaces
- Includes built-in support for various widgets and layout systems
Cons of nanogui
- More specialized focus on GUI development, less versatile than pybind11
- Smaller community and ecosystem compared to pybind11
- May require more setup and configuration for non-GUI projects
Code Comparison
nanogui:
#include <nanogui/nanogui.h>
Screen *screen = new Screen(Vector2i(800, 600), "NanoGUI Test");
Window *window = new Window(screen, "Button demo");
window->setPosition(Vector2i(15, 15));
window->setLayout(new GroupLayout());
pybind11:
#include <pybind11/pybind11.h>
PYBIND11_MODULE(example, m) {
m.doc() = "pybind11 example plugin";
m.def("add", &add, "A function that adds two numbers");
}
The code snippets demonstrate the different focus areas of the two libraries. nanogui is centered around creating GUI elements, while pybind11 facilitates creating Python bindings for C++ code.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
.. figure:: https://github.com/pybind/pybind11/raw/master/docs/pybind11-logo.png :alt: pybind11 logo
pybind11 â Seamless operability between C++11 and Python
|Latest Documentation Status| |Stable Documentation Status| |Gitter chat| |GitHub Discussions| |CI| |Build status|
|Repology| |PyPI package| |Conda-forge| |Python Versions|
Setuptools example <https://github.com/pybind/python_example>
_
⢠Scikit-build example <https://github.com/pybind/scikit_build_example>
_
⢠CMake example <https://github.com/pybind/cmake_example>
_
.. start
pybind11 is a lightweight header-only library that exposes C++ types
in Python and vice versa, mainly to create Python bindings of existing
C++ code. Its goals and syntax are similar to the excellent
Boost.Python <http://www.boost.org/doc/libs/1_58_0/libs/python/doc/>
_
library by David Abrahams: to minimize boilerplate code in traditional
extension modules by inferring type information using compile-time
introspection.
The main issue with Boost.Pythonâand the reason for creating such a similar projectâis Boost. Boost is an enormously large and complex suite of utility libraries that works with almost every C++ compiler in existence. This compatibility has its cost: arcane template tricks and workarounds are necessary to support the oldest and buggiest of compiler specimens. Now that C++11-compatible compilers are widely available, this heavy machinery has become an excessively large and unnecessary dependency.
Think of this library as a tiny self-contained version of Boost.Python with everything stripped away that isn't relevant for binding generation. Without comments, the core header files only require ~4K lines of code and depend on Python (3.8+, or PyPy) and the C++ standard library. This compact implementation was possible thanks to some C++11 language features (specifically: tuples, lambda functions and variadic templates). Since its creation, this library has grown beyond Boost.Python in many ways, leading to dramatically simpler binding code in many common situations.
Tutorial and reference documentation is provided at
pybind11.readthedocs.io <https://pybind11.readthedocs.io/en/latest>
.
A PDF version of the manual is available
here <https://pybind11.readthedocs.io/_/downloads/en/latest/pdf/>
.
And the source code is always available at
github.com/pybind/pybind11 <https://github.com/pybind/pybind11>
_.
Core features
pybind11 can map the following core C++ features to Python:
- Functions accepting and returning custom data structures per value, reference, or pointer
- Instance methods and static methods
- Overloaded functions
- Instance attributes and static attributes
- Arbitrary exception types
- Enumerations
- Callbacks
- Iterators and ranges
- Custom operators
- Single and multiple inheritance
- STL data structures
- Smart pointers with reference counting like
std::shared_ptr
- Internal references with correct reference counting
- C++ classes with virtual (and pure virtual) methods can be extended in Python
- Integrated NumPy support (NumPy 2 requires pybind11 2.12+)
Goodies
In addition to the core functionality, pybind11 provides some extra goodies:
-
Python 3.8+, and PyPy3 7.3 are supported with an implementation-agnostic interface (pybind11 2.9 was the last version to support Python 2 and 3.5).
-
It is possible to bind C++11 lambda functions with captured variables. The lambda capture data is stored inside the resulting Python function object.
-
pybind11 uses C++11 move constructors and move assignment operators whenever possible to efficiently transfer custom data types.
-
It's easy to expose the internal storage of custom data types through Pythons' buffer protocols. This is handy e.g. for fast conversion between C++ matrix classes like Eigen and NumPy without expensive copy operations.
-
pybind11 can automatically vectorize functions so that they are transparently applied to all entries of one or more NumPy array arguments.
-
Python's slice-based access and assignment operations can be supported with just a few lines of code.
-
Everything is contained in just a few header files; there is no need to link against any additional libraries.
-
Binaries are generally smaller by a factor of at least 2 compared to equivalent bindings generated by Boost.Python. A recent pybind11 conversion of PyRosetta, an enormous Boost.Python binding project,
reported <https://graylab.jhu.edu/Sergey/2016.RosettaCon/PyRosetta-4.pdf>
_ a binary size reduction of 5.4x and compile time reduction by 5.8x. -
Function signatures are precomputed at compile time (using
constexpr
), leading to smaller binaries. -
With little extra effort, C++ types can be pickled and unpickled similar to regular Python objects.
Supported compilers
- Clang/LLVM 3.3 or newer (for Apple Xcode's clang, this is 5.0.0 or newer)
- GCC 4.8 or newer
- Microsoft Visual Studio 2017 or newer
- Intel classic C++ compiler 18 or newer (ICC 20.2 tested in CI)
- Cygwin/GCC (previously tested on 2.5.1)
- NVCC (CUDA 11.0 tested in CI)
- NVIDIA PGI (20.9 tested in CI)
About
This project was created by Wenzel Jakob <http://rgl.epfl.ch/people/wjakob>
_. Significant features and/or
improvements to the code were contributed by Jonas Adler, Lori A. Burns,
Sylvain Corlay, Eric Cousineau, Aaron Gokaslan, Ralf Grosse-Kunstleve, Trent Houliston, Axel
Huebl, @hulucc, Yannick Jadoul, Sergey Lyskov, Johan Mabille, Tomasz MiÄ
sko,
Dean Moldovan, Ben Pritchard, Jason Rhinelander, Boris Schäling, Pim
Schellart, Henry Schreiner, Ivan Smirnov, Boris Staletic, and Patrick Stewart.
We thank Google for a generous financial contribution to the continuous integration infrastructure used by this project.
Contributing
See the `contributing
guide <https://github.com/pybind/pybind11/blob/master/.github/CONTRIBUTING.md>`_
for information on building and contributing to pybind11.
License
~~~~~~~
pybind11 is provided under a BSD-style license that can be found in the
`LICENSE <https://github.com/pybind/pybind11/blob/master/LICENSE>`_
file. By using, distributing, or contributing to this project, you agree
to the terms and conditions of this license.
.. |Latest Documentation Status| image:: https://readthedocs.org/projects/pybind11/badge?version=latest
:target: http://pybind11.readthedocs.org/en/latest
.. |Stable Documentation Status| image:: https://img.shields.io/badge/docs-stable-blue.svg
:target: http://pybind11.readthedocs.org/en/stable
.. |Gitter chat| image:: https://img.shields.io/gitter/room/gitterHQ/gitter.svg
:target: https://gitter.im/pybind/Lobby
.. |CI| image:: https://github.com/pybind/pybind11/workflows/CI/badge.svg
:target: https://github.com/pybind/pybind11/actions
.. |Build status| image:: https://ci.appveyor.com/api/projects/status/riaj54pn4h08xy40?svg=true
:target: https://ci.appveyor.com/project/wjakob/pybind11
.. |PyPI package| image:: https://img.shields.io/pypi/v/pybind11.svg
:target: https://pypi.org/project/pybind11/
.. |Conda-forge| image:: https://img.shields.io/conda/vn/conda-forge/pybind11.svg
:target: https://github.com/conda-forge/pybind11-feedstock
.. |Repology| image:: https://repology.org/badge/latest-versions/python:pybind11.svg
:target: https://repology.org/project/python:pybind11/versions
.. |Python Versions| image:: https://img.shields.io/pypi/pyversions/pybind11.svg
:target: https://pypi.org/project/pybind11/
.. |GitHub Discussions| image:: https://img.shields.io/static/v1?label=Discussions&message=Ask&color=blue&logo=github
:target: https://github.com/pybind/pybind11/discussions
Top Related Projects
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot