basics.rst 7.99 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
    which exercise all features of pybind11.

Dean Moldovan's avatar
Dean Moldovan committed
63
64
65
66
67
68
69
70
71
72
73
74
75
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.

76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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

93
    #include <pybind11/pybind11.h>
Wenzel Jakob's avatar
Wenzel Jakob committed
94

95
96
97
98
    int add(int i, int j) {
        return i + j;
    }

99
    namespace py = pybind11;
100

101
    PYBIND11_PLUGIN(example) {
102
        py::module m("example", "pybind11 example plugin");
103
104
105
106
107
108

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

        return m.ptr();
    }

Dean Moldovan's avatar
Dean Moldovan committed
109
110
111
.. [#f1] In practice, implementation and binding code will generally be located
         in separate files.

112
The :func:`PYBIND11_PLUGIN` macro creates a function that will be called when an
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
``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
134
    $ c++ -O3 -shared -std=c++11 -I <path-to-pybind11>/include `python-config --cflags --ldflags` example.cpp -o example.so
135
136
137
138
139
140
141
142
143
144

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.

145
.. code-block:: pycon
146

Wenzel Jakob's avatar
Wenzel Jakob committed
147
    $ python
148
149
150
151
152
153
    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
154
    >>>
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173

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

174
.. code-block:: pycon
175
176
177
178
179
180
181

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

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

182
.. code-block:: pycon
183
184
185
186
187
188
189

    >>> help(example)

    ....

    FUNCTIONS
        add(...)
190
            Signature : (i: int, j: int) -> int
191
192
193

            A function which adds two numbers

194
195
196
A shorter notation for named arguments is also available:

.. code-block:: cpp
Wenzel Jakob's avatar
Wenzel Jakob committed
197

198
199
200
201
202
203
    // 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);

Wenzel Jakob's avatar
Wenzel Jakob committed
204
205
206
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
207
208
from the ``pybind11`` namespace except for literals.

209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
.. _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.

233
.. code-block:: pycon
234
235
236
237
238
239
240

    >>> help(example)

    ....

    FUNCTIONS
        add(...)
241
            Signature : (i: int = 1, j: int = 2) -> int
242
243
244

            A function which adds two numbers

245
246
247
The shorthand notation is also available for default arguments:

.. code-block:: cpp
Wenzel Jakob's avatar
Wenzel Jakob committed
248

249
250
251
252
253
    // 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);

Dean Moldovan's avatar
Dean Moldovan committed
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
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) can be
converted using the function ``py::cast``.

.. code-block:: cpp

    PYBIND11_PLUGIN(example) {
        py::module m("example", "pybind11 example plugin");
        m.attr("the_answer") = py::cast(42);
        m.attr("what") = py::cast("World");
        return m.ptr();
    }

These are then accessible from Python:

.. code-block:: pycon

    >>> import example
    >>> example.the_answer
    42
    >>> example.what
    'World'

280
281
282
283
284
.. _supported_types:

Supported data types
====================

Dean Moldovan's avatar
Dean Moldovan committed
285
286
287
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.