308 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
		
		
			
		
	
	
			308 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
| 
								 | 
							
								.. _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 macOS, 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 2017** and newer are supported.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. 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 advised.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								..  _`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 that 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)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. note::
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    If you used :ref:`include_as_a_submodule` to get the pybind11 source, then
							 | 
						||
| 
								 | 
							
								    use ``$(python3-config --includes) -Iextern/pybind11/include`` instead of
							 | 
						||
| 
								 | 
							
								    ``$(python3 -m pybind11 --includes)`` in the above compilation, as
							 | 
						||
| 
								 | 
							
								    explained in :ref:`building_manually`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								For more details on the required compiler flags on Linux and macOS, see
							 | 
						||
| 
								 | 
							
								:ref:`building_manually`. 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 3.9.10 (main, Jan 15 2022, 11:48:04)
							 | 
						||
| 
								 | 
							
								    [Clang 13.0.0 (clang-1300.0.29.3)] on darwin
							 | 
						||
| 
								 | 
							
								    Type "help", "copyright", "credits" or "license" for more information.
							 | 
						||
| 
								 | 
							
								    >>> import example
							 | 
						||
| 
								 | 
							
								    >>> example.add(1, 2)
							 | 
						||
| 
								 | 
							
								    3
							 | 
						||
| 
								 | 
							
								    >>>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. _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"));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:class:`arg` 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.
							 |