basics.rst 12.4 KB
Newer Older
1
2
3
4
5
6
7
.. _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
8
included set of test cases.
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24


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

25
26
27
28
   mkdir build
   cd build
   cmake ..
   make pytest -j 4
29

30
The last line will both compile and run the tests.
31
32
33
34

Windows
-------

35
36
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.
37

38
To compile and run the tests:
39

40
41
42
43
44
45
.. code-block:: batch

   mkdir build
   cd build
   cmake ..
   cmake --build . --config Release --target pytest
46

47
48
This will create a Visual Studio project, compile and run the target, all from the
command line.
49

50
.. Note::
51

52
53
54
55
    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 ..``.
56
57
58
59

.. seealso::

    Advanced users who are already familiar with Boost.Python may want to skip
60
    the tutorial and look at the test cases in the :file:`tests` directory,
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
    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

80
    #include <pybind11/pybind11.h>
Wenzel Jakob's avatar
Wenzel Jakob committed
81

82
83
84
85
    int add(int i, int j) {
        return i + j;
    }

86
    namespace py = pybind11;
87

88
    PYBIND11_PLUGIN(example) {
89
        py::module m("example", "pybind11 example plugin");
90
91
92
93
94
95

        m.def("add", &add, "A function which adds two numbers");

        return m.ptr();
    }

96
The :func:`PYBIND11_PLUGIN` macro creates a function that will be called when an
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
``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

Wenzel Jakob's avatar
Wenzel Jakob committed
118
    $ c++ -O3 -shared -std=c++11 -I <path-to-pybind11>/include `python-config --cflags --ldflags` example.cpp -o example.so
119
120
121
122
123
124
125
126
127
128

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.

129
.. code-block:: pycon
130

Wenzel Jakob's avatar
Wenzel Jakob committed
131
    $ python
132
133
134
135
136
137
    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
Wenzel Jakob's avatar
Wenzel Jakob committed
138
    >>>
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157

.. _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:

158
.. code-block:: pycon
159
160
161
162
163
164
165

    >>> import example
    >>> example.add(i=1, j=2)
    3L

The keyword names also appear in the function signatures within the documentation.

166
.. code-block:: pycon
167
168
169
170
171
172
173

    >>> help(example)

    ....

    FUNCTIONS
        add(...)
174
            Signature : (i: int, j: int) -> int
175
176
177

            A function which adds two numbers

178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
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.

193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
.. _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.

217
.. code-block:: pycon
218
219
220
221
222
223
224

    >>> help(example)

    ....

    FUNCTIONS
        add(...)
225
            Signature : (i: int = 1, j: int = 2) -> int
226
227
228

            A function which adds two numbers

229
230
231
232
233
234
235
236
237
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);

238
239
240
241
242
243
244
.. _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
Wenzel Jakob's avatar
Wenzel Jakob committed
245
as arguments and return values, refer to the section on binding :ref:`classes`.
246

Wenzel Jakob's avatar
Wenzel Jakob committed
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
+---------------------------------+--------------------------+-------------------------------+
|  Data type                      |  Description             | Header file                   |
+=================================+==========================+===============================+
| ``int8_t``, ``uint8_t``         | 8-bit integers           | :file:`pybind11/pybind11.h`   |
+---------------------------------+--------------------------+-------------------------------+
| ``int16_t``, ``uint16_t``       | 16-bit integers          | :file:`pybind11/pybind11.h`   |
+---------------------------------+--------------------------+-------------------------------+
| ``int32_t``, ``uint32_t``       | 32-bit integers          | :file:`pybind11/pybind11.h`   |
+---------------------------------+--------------------------+-------------------------------+
| ``int64_t``, ``uint64_t``       | 64-bit integers          | :file:`pybind11/pybind11.h`   |
+---------------------------------+--------------------------+-------------------------------+
| ``ssize_t``, ``size_t``         | Platform-dependent size  | :file:`pybind11/pybind11.h`   |
+---------------------------------+--------------------------+-------------------------------+
| ``float``, ``double``           | Floating point types     | :file:`pybind11/pybind11.h`   |
+---------------------------------+--------------------------+-------------------------------+
| ``bool``                        | Two-state Boolean type   | :file:`pybind11/pybind11.h`   |
+---------------------------------+--------------------------+-------------------------------+
| ``char``                        | Character literal        | :file:`pybind11/pybind11.h`   |
+---------------------------------+--------------------------+-------------------------------+
| ``wchar_t``                     | Wide character literal   | :file:`pybind11/pybind11.h`   |
+---------------------------------+--------------------------+-------------------------------+
| ``const char *``                | UTF-8 string literal     | :file:`pybind11/pybind11.h`   |
+---------------------------------+--------------------------+-------------------------------+
| ``const wchar_t *``             | Wide string literal      | :file:`pybind11/pybind11.h`   |
+---------------------------------+--------------------------+-------------------------------+
| ``std::string``                 | STL dynamic UTF-8 string | :file:`pybind11/pybind11.h`   |
+---------------------------------+--------------------------+-------------------------------+
| ``std::wstring``                | STL dynamic wide string  | :file:`pybind11/pybind11.h`   |
+---------------------------------+--------------------------+-------------------------------+
| ``std::pair<T1, T2>``           | Pair of two custom types | :file:`pybind11/pybind11.h`   |
+---------------------------------+--------------------------+-------------------------------+
| ``std::tuple<...>``             | Arbitrary tuple of types | :file:`pybind11/pybind11.h`   |
+---------------------------------+--------------------------+-------------------------------+
| ``std::reference_wrapper<...>`` | Reference type wrapper   | :file:`pybind11/pybind11.h`   |
+---------------------------------+--------------------------+-------------------------------+
| ``std::complex<T>``             | Complex numbers          | :file:`pybind11/complex.h`    |
+---------------------------------+--------------------------+-------------------------------+
| ``std::array<T, Size>``         | STL static array         | :file:`pybind11/stl.h`        |
+---------------------------------+--------------------------+-------------------------------+
| ``std::vector<T>``              | STL dynamic array        | :file:`pybind11/stl.h`        |
+---------------------------------+--------------------------+-------------------------------+
| ``std::list<T>``                | STL linked list          | :file:`pybind11/stl.h`        |
+---------------------------------+--------------------------+-------------------------------+
| ``std::map<T1, T2>``            | STL ordered map          | :file:`pybind11/stl.h`        |
+---------------------------------+--------------------------+-------------------------------+
| ``std::unordered_map<T1, T2>``  | STL unordered map        | :file:`pybind11/stl.h`        |
+---------------------------------+--------------------------+-------------------------------+
| ``std::set<T>``                 | STL ordered set          | :file:`pybind11/stl.h`        |
+---------------------------------+--------------------------+-------------------------------+
| ``std::unordered_set<T>``       | STL unordered set        | :file:`pybind11/stl.h`        |
+---------------------------------+--------------------------+-------------------------------+
| ``std::function<...>``          | STL polymorphic function | :file:`pybind11/functional.h` |
+---------------------------------+--------------------------+-------------------------------+
300
301
302
303
| ``Eigen::Matrix<...>``          | Dense Eigen matrices     | :file:`pybind11/eigen.h`      |
+---------------------------------+--------------------------+-------------------------------+
| ``Eigen::SparseMatrix<...>``    | Sparse Eigen matrices    | :file:`pybind11/eigen.h`      |
+---------------------------------+--------------------------+-------------------------------+
304
305
306
307


.. [#f1] In practice, implementation and binding code will generally be located
         in separate files.