| | Miscellaneous |
| | ############# |
| |
|
| | .. _macro_notes: |
| |
|
| | General notes regarding convenience macros |
| | ========================================== |
| |
|
| | pybind11 provides a few convenience macros such as |
| | :func:`PYBIND11_DECLARE_HOLDER_TYPE` and ``PYBIND11_OVERLOAD_*``. Since these |
| | are "just" macros that are evaluated in the preprocessor (which has no concept |
| | of types), they *will* get confused by commas in a template argument; for |
| | example, consider: |
| |
|
| | .. code-block:: cpp |
| |
|
| | PYBIND11_OVERLOAD(MyReturnType<T1, T2>, Class<T3, T4>, func) |
| |
|
| | The limitation of the C preprocessor interprets this as five arguments (with new |
| | arguments beginning after each comma) rather than three. To get around this, |
| | there are two alternatives: you can use a type alias, or you can wrap the type |
| | using the ``PYBIND11_TYPE`` macro: |
| |
|
| | .. code-block:: cpp |
| |
|
| | // Version 1: using a type alias |
| | using ReturnType = MyReturnType<T1, T2>; |
| | using ClassType = Class<T3, T4>; |
| | PYBIND11_OVERLOAD(ReturnType, ClassType, func); |
| |
|
| | // Version 2: using the PYBIND11_TYPE macro: |
| | PYBIND11_OVERLOAD(PYBIND11_TYPE(MyReturnType<T1, T2>), |
| | PYBIND11_TYPE(Class<T3, T4>), func) |
| |
|
| | The ``PYBIND11_MAKE_OPAQUE`` macro does *not* require the above workarounds. |
| |
|
| | .. _gil: |
| |
|
| | Global Interpreter Lock (GIL) |
| | ============================= |
| |
|
| | When calling a C++ function from Python, the GIL is always held. |
| | The classes :class:`gil_scoped_release` and :class:`gil_scoped_acquire` can be |
| | used to acquire and release the global interpreter lock in the body of a C++ |
| | function call. In this way, long-running C++ code can be parallelized using |
| | multiple Python threads. Taking :ref:`overriding_virtuals` as an example, this |
| | could be realized as follows (important changes highlighted): |
| |
|
| | .. code-block:: cpp |
| | :emphasize-lines: 8,9,31,32 |
| |
|
| | class PyAnimal : public Animal { |
| | public: |
| | /* Inherit the constructors */ |
| | using Animal::Animal; |
| |
|
| | /* Trampoline (need one for each virtual function) */ |
| | std::string go(int n_times) { |
| | /* Acquire GIL before calling Python code */ |
| | py::gil_scoped_acquire acquire; |
| |
|
| | PYBIND11_OVERLOAD_PURE( |
| | std::string, /* Return type */ |
| | Animal, /* Parent class */ |
| | go, /* Name of function */ |
| | n_times /* Argument(s) */ |
| | ); |
| | } |
| | }; |
| |
|
| | PYBIND11_MODULE(example, m) { |
| | py::class_<Animal, PyAnimal> animal(m, "Animal"); |
| | animal |
| | .def(py::init<>()) |
| | .def("go", &Animal::go); |
| |
|
| | py::class_<Dog>(m, "Dog", animal) |
| | .def(py::init<>()); |
| |
|
| | m.def("call_go", [](Animal *animal) -> std::string { |
| | /* Release GIL before calling into (potentially long-running) C++ code */ |
| | py::gil_scoped_release release; |
| | return call_go(animal); |
| | }); |
| | } |
| |
|
| | The ``call_go`` wrapper can also be simplified using the `call_guard` policy |
| | (see :ref:`call_policies`) which yields the same result: |
| |
|
| | .. code-block:: cpp |
| |
|
| | m.def("call_go", &call_go, py::call_guard<py::gil_scoped_release>()); |
| |
|
| |
|
| | Binding sequence data types, iterators, the slicing protocol, etc. |
| | ================================================================== |
| |
|
| | Please refer to the supplemental example for details. |
| |
|
| | .. seealso:: |
| |
|
| | The file :file:`tests/test_sequences_and_iterators.cpp` contains a |
| | complete example that shows how to bind a sequence data type, including |
| | length queries (``__len__``), iterators (``__iter__``), the slicing |
| | protocol and other kinds of useful operations. |
| |
|
| |
|
| | Partitioning code over multiple extension modules |
| | ================================================= |
| |
|
| | It's straightforward to split binding code over multiple extension modules, |
| | while referencing types that are declared elsewhere. Everything "just" works |
| | without any special precautions. One exception to this rule occurs when |
| | extending a type declared in another extension module. Recall the basic example |
| | from Section :ref:`inheritance`. |
| |
|
| | .. code-block:: cpp |
| |
|
| | py::class_<Pet> pet(m, "Pet"); |
| | pet.def(py::init<const std::string &>()) |
| | .def_readwrite("name", &Pet::name); |
| |
|
| | py::class_<Dog>(m, "Dog", pet /* <- specify parent */) |
| | .def(py::init<const std::string &>()) |
| | .def("bark", &Dog::bark); |
| |
|
| | Suppose now that ``Pet`` bindings are defined in a module named ``basic``, |
| | whereas the ``Dog`` bindings are defined somewhere else. The challenge is of |
| | course that the variable ``pet`` is not available anymore though it is needed |
| | to indicate the inheritance relationship to the constructor of ``class_<Dog>``. |
| | However, it can be acquired as follows: |
| |
|
| | .. code-block:: cpp |
| |
|
| | py::object pet = (py::object) py::module::import("basic").attr("Pet"); |
| |
|
| | py::class_<Dog>(m, "Dog", pet) |
| | .def(py::init<const std::string &>()) |
| | .def("bark", &Dog::bark); |
| |
|
| | Alternatively, you can specify the base class as a template parameter option to |
| | ``class_``, which performs an automated lookup of the corresponding Python |
| | type. Like the above code, however, this also requires invoking the ``import`` |
| | function once to ensure that the pybind11 binding code of the module ``basic`` |
| | has been executed: |
| |
|
| | .. code-block:: cpp |
| |
|
| | py::module::import("basic"); |
| |
|
| | py::class_<Dog, Pet>(m, "Dog") |
| | .def(py::init<const std::string &>()) |
| | .def("bark", &Dog::bark); |
| |
|
| | Naturally, both methods will fail when there are cyclic dependencies. |
| |
|
| | Note that pybind11 code compiled with hidden-by-default symbol visibility (e.g. |
| | via the command line flag ``-fvisibility=hidden`` on GCC/Clang), which is |
| | required for proper pybind11 functionality, can interfere with the ability to |
| | access types defined in another extension module. Working around this requires |
| | manually exporting types that are accessed by multiple extension modules; |
| | pybind11 provides a macro to do just this: |
| |
|
| | .. code-block:: cpp |
| |
|
| | class PYBIND11_EXPORT Dog : public Animal { |
| | ... |
| | }; |
| |
|
| | Note also that it is possible (although would rarely be required) to share arbitrary |
| | C++ objects between extension modules at runtime. Internal library data is shared |
| | between modules using capsule machinery [#f6]_ which can be also utilized for |
| | storing, modifying and accessing user-defined data. Note that an extension module |
| | will "see" other extensions' data if and only if they were built with the same |
| | pybind11 version. Consider the following example: |
| |
|
| | .. code-block:: cpp |
| |
|
| | auto data = (MyData *) py::get_shared_data("mydata"); |
| | if (!data) |
| | data = (MyData *) py::set_shared_data("mydata", new MyData(42)); |
| |
|
| | If the above snippet was used in several separately compiled extension modules, |
| | the first one to be imported would create a ``MyData`` instance and associate |
| | a ``"mydata"`` key with a pointer to it. Extensions that are imported later |
| | would be then able to access the data behind the same pointer. |
| |
|
| | .. [#f6] https://docs.python.org/3/extending/extending.html#using-capsules |
| |
|
| | Module Destructors |
| | ================== |
| |
|
| | pybind11 does not provide an explicit mechanism to invoke cleanup code at |
| | module destruction time. In rare cases where such functionality is required, it |
| | is possible to emulate it using Python capsules or weak references with a |
| | destruction callback. |
| |
|
| | .. code-block:: cpp |
| |
|
| | auto cleanup_callback = []() { |
| | // perform cleanup here -- this function is called with the GIL held |
| | }; |
| |
|
| | m.add_object("_cleanup", py::capsule(cleanup_callback)); |
| |
|
| | This approach has the potential downside that instances of classes exposed |
| | within the module may still be alive when the cleanup callback is invoked |
| | (whether this is acceptable will generally depend on the application). |
| |
|
| | Alternatively, the capsule may also be stashed within a type object, which |
| | ensures that it not called before all instances of that type have been |
| | collected: |
| |
|
| | .. code-block:: cpp |
| |
|
| | auto cleanup_callback = []() { /* ... */ }; |
| | m.attr("BaseClass").attr("_cleanup") = py::capsule(cleanup_callback); |
| |
|
| | Both approaches also expose a potentially dangerous ``_cleanup`` attribute in |
| | Python, which may be undesirable from an API standpoint (a premature explicit |
| | call from Python might lead to undefined behavior). Yet another approach that |
| | avoids this issue involves weak reference with a cleanup callback: |
| |
|
| | .. code-block:: cpp |
| |
|
| | // Register a callback function that is invoked when the BaseClass object is colelcted |
| | py::cpp_function cleanup_callback( |
| | [](py::handle weakref) { |
| | // perform cleanup here -- this function is called with the GIL held |
| |
|
| | weakref.dec_ref(); // release weak reference |
| | } |
| | ); |
| |
|
| | // Create a weak reference with a cleanup callback and initially leak it |
| | (void) py::weakref(m.attr("BaseClass"), cleanup_callback).release(); |
| |
|
| | .. note:: |
| |
|
| | PyPy (at least version 5.9) does not garbage collect objects when the |
| | interpreter exits. An alternative approach (which also works on CPython) is to use |
| | the :py:mod:`atexit` module [#f7]_, for example: |
| |
|
| | .. code-block:: cpp |
| |
|
| | auto atexit = py::module::import("atexit"); |
| | atexit.attr("register")(py::cpp_function([]() { |
| | // perform cleanup here -- this function is called with the GIL held |
| | })); |
| |
|
| | .. [#f7] https://docs.python.org/3/library/atexit.html |
| |
|
| |
|
| | Generating documentation using Sphinx |
| | ===================================== |
| |
|
| | Sphinx [#f4]_ has the ability to inspect the signatures and documentation |
| | strings in pybind11-based extension modules to automatically generate beautiful |
| | documentation in a variety formats. The python_example repository [#f5]_ contains a |
| | simple example repository which uses this approach. |
| |
|
| | There are two potential gotchas when using this approach: first, make sure that |
| | the resulting strings do not contain any :kbd:`TAB` characters, which break the |
| | docstring parsing routines. You may want to use C++11 raw string literals, |
| | which are convenient for multi-line comments. Conveniently, any excess |
| | indentation will be automatically be removed by Sphinx. However, for this to |
| | work, it is important that all lines are indented consistently, i.e.: |
| |
|
| | .. code-block:: cpp |
| |
|
| | // ok |
| | m.def("foo", &foo, R"mydelimiter( |
| | The foo function |
| |
|
| | Parameters |
| | ---------- |
| | )mydelimiter"); |
| |
|
| | // *not ok* |
| | m.def("foo", &foo, R"mydelimiter(The foo function |
| |
|
| | Parameters |
| | ---------- |
| | )mydelimiter"); |
| |
|
| | By default, pybind11 automatically generates and prepends a signature to the docstring of a function |
| | registered with ``module::def()`` and ``class_::def()``. Sometimes this |
| | behavior is not desirable, because you want to provide your own signature or remove |
| | the docstring completely to exclude the function from the Sphinx documentation. |
| | The class ``options`` allows you to selectively suppress auto-generated signatures: |
| |
|
| | .. code-block:: cpp |
| |
|
| | PYBIND11_MODULE(example, m) { |
| | py::options options; |
| | options.disable_function_signatures(); |
| |
|
| | m.def("add", [](int a, int b) { return a + b; }, "A function which adds two numbers"); |
| | } |
| |
|
| | Note that changes to the settings affect only function bindings created during the |
| | lifetime of the ``options`` instance. When it goes out of scope at the end of the module's init function, |
| | the default settings are restored to prevent unwanted side effects. |
| |
|
| | .. [#f4] http://www.sphinx-doc.org |
| | .. [#f5] http://github.com/pybind/python_example |
| |
|
| | .. _avoiding-cpp-types-in-docstrings: |
| |
|
| | Avoiding C++ types in docstrings |
| | ================================ |
| |
|
| | Docstrings are generated at the time of the declaration, e.g. when ``.def(...)`` is called. |
| | At this point parameter and return types should be known to pybind11. |
| | If a custom type is not exposed yet through a ``py::class_`` constructor or a custom type caster, |
| | its C++ type name will be used instead to generate the signature in the docstring: |
| |
|
| | .. code-block:: text |
| |
|
| | | __init__(...) |
| | | __init__(self: example.Foo, arg0: ns::Bar) -> None |
| | ^^^^^^^ |
| |
|
| |
|
| | This limitation can be circumvented by ensuring that C++ classes are registered with pybind11 |
| | before they are used as a parameter or return type of a function: |
| |
|
| | .. code-block:: cpp |
| |
|
| | PYBIND11_MODULE(example, m) { |
| |
|
| | auto pyFoo = py::class_<ns::Foo>(m, "Foo"); |
| | auto pyBar = py::class_<ns::Bar>(m, "Bar"); |
| |
|
| | pyFoo.def(py::init<const ns::Bar&>()); |
| | pyBar.def(py::init<const ns::Foo&>()); |
| | } |
| |
|