Spaces:
Runtime error
Runtime error
.. _basics: | |
First steps | |
########### | |
This sections demonstrates the basic features of pybind11. Before getting | |
started, make sure that development environment is set up to compile the | |
included set of test cases. | |
Compiling the test cases | |
======================== | |
Linux/MacOS | |
----------- | |
On Linux you'll need to install the **python-dev** or **python3-dev** packages as | |
well as **cmake**. On Mac OS, the included python version works out of the box, | |
but **cmake** must still be installed. | |
After installing the prerequisites, run | |
.. code-block:: bash | |
mkdir build | |
cd build | |
cmake .. | |
make check -j 4 | |
The last line will both compile and run the tests. | |
Windows | |
------- | |
On Windows, only **Visual Studio 2015** and newer are supported since pybind11 relies | |
on various C++11 language features that break older versions of Visual Studio. | |
.. Note:: | |
To use the C++17 in Visual Studio 2017 (MSVC 14.1), pybind11 requires the flag | |
``/permissive-`` to be passed to the compiler `to enforce standard conformance`_. When | |
building with Visual Studio 2019, this is not strictly necessary, but still adviced. | |
.. _`to enforce standard conformance`: https://docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance?view=vs-2017 | |
To compile and run the tests: | |
.. code-block:: batch | |
mkdir build | |
cd build | |
cmake .. | |
cmake --build . --config Release --target check | |
This will create a Visual Studio project, compile and run the target, all from the | |
command line. | |
.. Note:: | |
If all tests fail, make sure that the Python binary and the testcases are compiled | |
for the same processor type and bitness (i.e. either **i386** or **x86_64**). You | |
can specify **x86_64** as the target architecture for the generated Visual Studio | |
project using ``cmake -A x64 ..``. | |
.. seealso:: | |
Advanced users who are already familiar with Boost.Python may want to skip | |
the tutorial and look at the test cases in the :file:`tests` directory, | |
which exercise all features of pybind11. | |
Header and namespace conventions | |
================================ | |
For brevity, all code examples assume that the following two lines are present: | |
.. code-block:: cpp | |
#include <pybind11/pybind11.h> | |
namespace py = pybind11; | |
Some features may require additional headers, but those will be specified as needed. | |
.. _simple_example: | |
Creating bindings for a simple function | |
======================================= | |
Let's start by creating Python bindings for an extremely simple function, which | |
adds two numbers and returns their result: | |
.. code-block:: cpp | |
int add(int i, int j) { | |
return i + j; | |
} | |
For simplicity [#f1]_, we'll put both this function and the binding code into | |
a file named :file:`example.cpp` with the following contents: | |
.. code-block:: cpp | |
#include <pybind11/pybind11.h> | |
int add(int i, int j) { | |
return i + j; | |
} | |
PYBIND11_MODULE(example, m) { | |
m.doc() = "pybind11 example plugin"; // optional module docstring | |
m.def("add", &add, "A function which adds two numbers"); | |
} | |
.. [#f1] In practice, implementation and binding code will generally be located | |
in separate files. | |
The :func:`PYBIND11_MODULE` macro creates a function that will be called when an | |
``import`` statement is issued from within Python. The module name (``example``) | |
is given as the first macro argument (it should not be in quotes). The second | |
argument (``m``) defines a variable of type :class:`py::module <module>` which | |
is the main interface for creating bindings. The method :func:`module::def` | |
generates binding code that exposes the ``add()`` function to Python. | |
.. note:: | |
Notice how little code was needed to expose our function to Python: all | |
details regarding the function's parameters and return value were | |
automatically inferred using template metaprogramming. This overall | |
approach and the used syntax are borrowed from Boost.Python, though the | |
underlying implementation is very different. | |
pybind11 is a header-only library, hence it is not necessary to link against | |
any special libraries and there are no intermediate (magic) translation steps. | |
On Linux, the above example can be compiled using the following command: | |
.. code-block:: bash | |
$ c++ -O3 -Wall -shared -std=c++11 -fPIC `python3 -m pybind11 --includes` example.cpp -o example`python3-config --extension-suffix` | |
For more details on the required compiler flags on Linux and MacOS, see | |
For complete cross-platform compilation instructions, | |
refer to the :ref:`compiling` page. | |
The `python_example`_ and `cmake_example`_ repositories are also a good place | |
to start. They are both complete project examples with cross-platform build | |
systems. The only difference between the two is that `python_example`_ uses | |
Python's ``setuptools`` to build the module, while `cmake_example`_ uses CMake | |
(which may be preferable for existing C++ projects). | |
.. _python_example: https://github.com/pybind/python_example | |
.. _cmake_example: https://github.com/pybind/cmake_example | |
Building the above C++ code will produce a binary module file that can be | |
imported to Python. Assuming that the compiled module is located in the | |
current directory, the following interactive Python session shows how to | |
load and execute the example: | |
.. code-block:: pycon | |
$ python | |
Python 2.7.10 (default, Aug 22 2015, 20:33:39) | |
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.1)] on darwin | |
Type "help", "copyright", "credits" or "license" for more information. | |
>>> import example | |
>>> example.add(1, 2) | |
3L | |
>>> | |
.. _keyword_args: | |
Keyword arguments | |
================= | |
With a simple code modification, it is possible to inform Python about the | |
names of the arguments ("i" and "j" in this case). | |
.. code-block:: cpp | |
m.def("add", &add, "A function which adds two numbers", | |
py::arg("i"), py::arg("j")); | |
is one of several special tag classes which can be used to pass | |
metadata into :func:`module::def`. With this modified binding code, we can now | |
call the function using keyword arguments, which is a more readable alternative | |
particularly for functions taking many parameters: | |
.. code-block:: pycon | |
>>> import example | |
>>> example.add(i=1, j=2) | |
3L | |
The keyword names also appear in the function signatures within the documentation. | |
.. code-block:: pycon | |
>>> help(example) | |
.... | |
FUNCTIONS | |
add(...) | |
Signature : (i: int, j: int) -> int | |
A function which adds two numbers | |
A shorter notation for named arguments is also available: | |
.. code-block:: cpp | |
// regular notation | |
m.def("add1", &add, py::arg("i"), py::arg("j")); | |
// shorthand | |
using namespace pybind11::literals; | |
m.def("add2", &add, "i"_a, "j"_a); | |
The :var:`_a` suffix forms a C++11 literal which is equivalent to :class:`arg`. | |
Note that the literal operator must first be made visible with the directive | |
``using namespace pybind11::literals``. This does not bring in anything else | |
from the ``pybind11`` namespace except for literals. | |
.. _default_args: | |
Default arguments | |
================= | |
Suppose now that the function to be bound has default arguments, e.g.: | |
.. code-block:: cpp | |
int add(int i = 1, int j = 2) { | |
return i + j; | |
} | |
Unfortunately, pybind11 cannot automatically extract these parameters, since they | |
are not part of the function's type information. However, they are simple to specify | |
using an extension of :class:`arg`: | |
.. code-block:: cpp | |
m.def("add", &add, "A function which adds two numbers", | |
py::arg("i") = 1, py::arg("j") = 2); | |
The default values also appear within the documentation. | |
.. code-block:: pycon | |
>>> help(example) | |
.... | |
FUNCTIONS | |
add(...) | |
Signature : (i: int = 1, j: int = 2) -> int | |
A function which adds two numbers | |
The shorthand notation is also available for default arguments: | |
.. code-block:: cpp | |
// regular notation | |
m.def("add1", &add, py::arg("i") = 1, py::arg("j") = 2); | |
// shorthand | |
m.def("add2", &add, "i"_a=1, "j"_a=2); | |
Exporting variables | |
=================== | |
To expose a value from C++, use the ``attr`` function to register it in a | |
module as shown below. Built-in types and general objects (more on that later) | |
are automatically converted when assigned as attributes, and can be explicitly | |
converted using the function ``py::cast``. | |
.. code-block:: cpp | |
PYBIND11_MODULE(example, m) { | |
m.attr("the_answer") = 42; | |
py::object world = py::cast("World"); | |
m.attr("what") = world; | |
} | |
These are then accessible from Python: | |
.. code-block:: pycon | |
>>> import example | |
>>> example.the_answer | |
42 | |
>>> example.what | |
'World' | |
.. _supported_types: | |
Supported data types | |
==================== | |
A large number of data types are supported out of the box and can be used | |
seamlessly as functions arguments, return values or with ``py::cast`` in general. | |
For a full overview, see the :doc:`advanced/cast/index` section. | |