123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- .. _embedding:
- Embedding the interpreter
- #########################
- While pybind11 is mainly focused on extending Python using C++, it's also
- possible to do the reverse: embed the Python interpreter into a C++ program.
- All of the other documentation pages still apply here, so refer to them for
- general pybind11 usage. This section will cover a few extra things required
- for embedding.
- Getting started
- ===============
- A basic executable with an embedded interpreter can be created with just a few
- lines of CMake and the ``pybind11::embed`` target, as shown below. For more
- information, see :doc:`/compiling`.
- .. code-block:: cmake
- cmake_minimum_required(VERSION 3.0)
- project(example)
- find_package(pybind11 REQUIRED) # or `add_subdirectory(pybind11)`
- add_executable(example main.cpp)
- target_link_libraries(example PRIVATE pybind11::embed)
- The essential structure of the ``main.cpp`` file looks like this:
- .. code-block:: cpp
- #include <pybind11/embed.h> // everything needed for embedding
- namespace py = pybind11;
- int main() {
- py::scoped_interpreter guard{}; // start the interpreter and keep it alive
- py::print("Hello, World!"); // use the Python API
- }
- The interpreter must be initialized before using any Python API, which includes
- all the functions and classes in pybind11. The RAII guard class `scoped_interpreter`
- takes care of the interpreter lifetime. After the guard is destroyed, the interpreter
- shuts down and clears its memory. No Python functions can be called after this.
- Executing Python code
- =====================
- There are a few different ways to run Python code. One option is to use `eval`,
- `exec` or `eval_file`, as explained in :ref:`eval`. Here is a quick example in
- the context of an executable with an embedded interpreter:
- .. code-block:: cpp
- #include <pybind11/embed.h>
- namespace py = pybind11;
- int main() {
- py::scoped_interpreter guard{};
- py::exec(R"(
- kwargs = dict(name="World", number=42)
- message = "Hello, {name}! The answer is {number}".format(**kwargs)
- print(message)
- )");
- }
- Alternatively, similar results can be achieved using pybind11's API (see
- :doc:`/advanced/pycpp/index` for more details).
- .. code-block:: cpp
- #include <pybind11/embed.h>
- namespace py = pybind11;
- using namespace py::literals;
- int main() {
- py::scoped_interpreter guard{};
- auto kwargs = py::dict("name"_a="World", "number"_a=42);
- auto message = "Hello, {name}! The answer is {number}"_s.format(**kwargs);
- py::print(message);
- }
- The two approaches can also be combined:
- .. code-block:: cpp
- #include <pybind11/embed.h>
- #include <iostream>
- namespace py = pybind11;
- using namespace py::literals;
- int main() {
- py::scoped_interpreter guard{};
- auto locals = py::dict("name"_a="World", "number"_a=42);
- py::exec(R"(
- message = "Hello, {name}! The answer is {number}".format(**locals())
- )", py::globals(), locals);
- auto message = locals["message"].cast<std::string>();
- std::cout << message;
- }
- Importing modules
- =================
- Python modules can be imported using `module::import()`:
- .. code-block:: cpp
- py::module sys = py::module::import("sys");
- py::print(sys.attr("path"));
- For convenience, the current working directory is included in ``sys.path`` when
- embedding the interpreter. This makes it easy to import local Python files:
- .. code-block:: python
- """calc.py located in the working directory"""
- def add(i, j):
- return i + j
- .. code-block:: cpp
- py::module calc = py::module::import("calc");
- py::object result = calc.attr("add")(1, 2);
- int n = result.cast<int>();
- assert(n == 3);
- Modules can be reloaded using `module::reload()` if the source is modified e.g.
- by an external process. This can be useful in scenarios where the application
- imports a user defined data processing script which needs to be updated after
- changes by the user. Note that this function does not reload modules recursively.
- .. _embedding_modules:
- Adding embedded modules
- =======================
- Embedded binary modules can be added using the `PYBIND11_EMBEDDED_MODULE` macro.
- Note that the definition must be placed at global scope. They can be imported
- like any other module.
- .. code-block:: cpp
- #include <pybind11/embed.h>
- namespace py = pybind11;
- PYBIND11_EMBEDDED_MODULE(fast_calc, m) {
- // `m` is a `py::module` which is used to bind functions and classes
- m.def("add", [](int i, int j) {
- return i + j;
- });
- }
- int main() {
- py::scoped_interpreter guard{};
- auto fast_calc = py::module::import("fast_calc");
- auto result = fast_calc.attr("add")(1, 2).cast<int>();
- assert(result == 3);
- }
- Unlike extension modules where only a single binary module can be created, on
- the embedded side an unlimited number of modules can be added using multiple
- `PYBIND11_EMBEDDED_MODULE` definitions (as long as they have unique names).
- These modules are added to Python's list of builtins, so they can also be
- imported in pure Python files loaded by the interpreter. Everything interacts
- naturally:
- .. code-block:: python
- """py_module.py located in the working directory"""
- import cpp_module
- a = cpp_module.a
- b = a + 1
- .. code-block:: cpp
- #include <pybind11/embed.h>
- namespace py = pybind11;
- PYBIND11_EMBEDDED_MODULE(cpp_module, m) {
- m.attr("a") = 1;
- }
- int main() {
- py::scoped_interpreter guard{};
- auto py_module = py::module::import("py_module");
- auto locals = py::dict("fmt"_a="{} + {} = {}", **py_module.attr("__dict__"));
- assert(locals["a"].cast<int>() == 1);
- assert(locals["b"].cast<int>() == 2);
- py::exec(R"(
- c = a + b
- message = fmt.format(a, b, c)
- )", py::globals(), locals);
- assert(locals["c"].cast<int>() == 3);
- assert(locals["message"].cast<std::string>() == "1 + 2 = 3");
- }
- Interpreter lifetime
- ====================
- The Python interpreter shuts down when `scoped_interpreter` is destroyed. After
- this, creating a new instance will restart the interpreter. Alternatively, the
- `initialize_interpreter` / `finalize_interpreter` pair of functions can be used
- to directly set the state at any time.
- Modules created with pybind11 can be safely re-initialized after the interpreter
- has been restarted. However, this may not apply to third-party extension modules.
- The issue is that Python itself cannot completely unload extension modules and
- there are several caveats with regard to interpreter restarting. In short, not
- all memory may be freed, either due to Python reference cycles or user-created
- global data. All the details can be found in the CPython documentation.
- .. warning::
- Creating two concurrent `scoped_interpreter` guards is a fatal error. So is
- calling `initialize_interpreter` for a second time after the interpreter
- has already been initialized.
- Do not use the raw CPython API functions ``Py_Initialize`` and
- ``Py_Finalize`` as these do not properly handle the lifetime of
- pybind11's internal data.
- Sub-interpreter support
- =======================
- Creating multiple copies of `scoped_interpreter` is not possible because it
- represents the main Python interpreter. Sub-interpreters are something different
- and they do permit the existence of multiple interpreters. This is an advanced
- feature of the CPython API and should be handled with care. pybind11 does not
- currently offer a C++ interface for sub-interpreters, so refer to the CPython
- documentation for all the details regarding this feature.
- We'll just mention a couple of caveats the sub-interpreters support in pybind11:
- 1. Sub-interpreters will not receive independent copies of embedded modules.
- Instead, these are shared and modifications in one interpreter may be
- reflected in another.
- 2. Managing multiple threads, multiple interpreters and the GIL can be
- challenging and there are several caveats here, even within the pure
- CPython API (please refer to the Python docs for details). As for
- pybind11, keep in mind that `gil_scoped_release` and `gil_scoped_acquire`
- do not take sub-interpreters into account.
|