| .. _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 examples, which also double as 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 |
| |
| cmake . |
| make -j 4 |
| |
| followed by |
| |
| .. code-block:: bash |
| |
| make test |
| |
| Windows |
| ------- |
| |
| On Windows, use the `CMake GUI`_ to create a Visual Studio project. Note that |
| only the 2015 release and newer versions are supported since pybind11 relies on |
| various C++11 language features that break older versions of Visual Studio. |
| After running CMake, open the created :file:`pybind11.sln` file and perform a |
| release build, which will will produce a file named |
| :file:`Release\\example.pyd`. Copy this file to the :file:`example` directory |
| and run :file:`example\\run_test.py` using the targeted Python version. |
| |
| .. _`CMake GUI`: https://cmake.org/runningcmake |
| |
| .. Note:: |
| |
| When all tests fail, make sure that |
| |
| 1. The Python binary and the testcases are compiled for the same processor |
| type and bitness (i.e. either **i386** or **x86_64**) |
| |
| 2. The Python binary used to run :file:`example\\run_test.py` matches the |
| Python version specified in the CMake GUI. This is controlled via |
| the ``PYTHON_EXECUTABLE`` ``PYTHON_INCLUDE_DIR``, and |
| ``PYTHON_LIBRARY`` variables. |
| |
| .. 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:`example` directory, |
| which exercise all features of pybind11. |
| |
| 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; |
| } |
| |
| namespace py = pybind11; |
| |
| PYBIND11_PLUGIN(example) { |
| py::module m("example", "pybind11 example plugin"); |
| |
| m.def("add", &add, "A function which adds two numbers"); |
| |
| return m.ptr(); |
| } |
| |
| The :func:`PYBIND11_PLUGIN` macro creates a function that will be called when an |
| ``import`` statement is issued from within Python. The next line creates a |
| module named ``example`` (with the supplied docstring). The method |
| :func:`module::def` generates binding code that exposes the |
| ``add()`` function to Python. The last line returns the internal Python object |
| associated with ``m`` to the Python interpreter. |
| |
| .. 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 (other than Python itself). On Windows, use the CMake |
| build file discussed in section :ref:`cmake`. On Linux and Mac OS, the above |
| example can be compiled using the following command |
| |
| .. code-block:: bash |
| |
| $ c++ -O3 -shared -std=c++11 -I <path-to-pybind11>/include `python-config --cflags --ldflags --libs` example.cpp -o example.so |
| |
| In general, it is advisable to include several additional build parameters |
| that can considerably reduce the size of the created binary. Refer to section |
| :ref:`cmake` for a detailed example of a suitable cross-platform CMake-based |
| build system. |
| |
| Assuming that the created file :file:`example.so` (:file:`example.pyd` on Windows) |
| is located in the current directory, the following interactive Python session |
| shows how to load and execute the example. |
| |
| .. code-block:: python |
| |
| $ 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 modification code, 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:: python |
| |
| >>> import example |
| >>> example.add(i=1, j=2) |
| 3L |
| |
| The keyword names also appear in the function signatures within the documentation. |
| |
| .. code-block:: python |
| |
| >>> help(example) |
| |
| .... |
| |
| FUNCTIONS |
| add(...) |
| Signature : (i: int, j: int) -> int |
| |
| A function which adds two numbers |
| |
| .. _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:: python |
| |
| >>> help(example) |
| |
| .... |
| |
| FUNCTIONS |
| add(...) |
| Signature : (i: int = 1, j: int = 2) -> int |
| |
| A function which adds two numbers |
| |
| .. _supported_types: |
| |
| Supported data types |
| ==================== |
| |
| The following basic data types are supported out of the box (some may require |
| an additional extension header to be included). To pass other data structures |
| as arguments and return values, refer to the section on binding :ref:`classes`. |
| |
| +----------------------------+--------------------------+-----------------------+ |
| | Data type | Description | Header file | |
| +============================+==========================+=======================+ |
| | int8_t, uint8_t | 8-bit integers | pybind11/pybind11.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | int16_t, uint16_t | 16-bit integers | pybind11/pybind11.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | int32_t, uint32_t | 32-bit integers | pybind11/pybind11.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | int64_t, uint64_t | 64-bit integers | pybind11/pybind11.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | ssize_t, size_t | Platform-dependent size | pybind11/pybind11.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | float, double | Floating point types | pybind11/pybind11.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | bool | Two-state Boolean type | pybind11/pybind11.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | char | Character literal | pybind11/pybind11.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | const char * | UTF-8 string literal | pybind11/pybind11.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | std::string | STL dynamic UTF-8 string | pybind11/pybind11.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | std::pair<T1, T2> | Pair of two custom types | pybind11/pybind11.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | std::tuple<....> | Arbitrary tuple of types | pybind11/pybind11.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | std::complex<T> | Complex numbers | pybind11/complex.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | std::array<T, Size> | STL static array | pybind11/stl.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | std::vector<T> | STL dynamic array | pybind11/stl.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | std::map<T1, T2> | STL ordered map | pybind11/stl.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | std::unordered_map<T1, T2> | STL unordered map | pybind11/stl.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | std::set<T> | STL ordered set | pybind11/stl.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | std::unordered_set<T> | STL unordered set | pybind11/stl.h | |
| +----------------------------+--------------------------+-----------------------+ |
| | std::function<...> | STL polymorphic function | pybind11/functional.h | |
| +----------------------------+--------------------------+-----------------------+ |
| |
| |
| .. [#f1] In practice, implementation and binding code will generally be located |
| in separate files. |
| |