Как в pybind11 сделать py :: module известным для импорта?

Во встроенной программе C ++ в pybind11 я определяю модуль python для использования в качестве контейнера для нескольких объектов python, которые я не хочу предоставлять глобальному пространству имен. Затем я хочу импортировать этот модуль по мере необходимости. Но похоже, что просто определить модуль через py::module('mymodule') недостаточно.

Следующий пример кода компилируется без проблем, но завершается с ошибкой времени выполнения «Нет модуля с именем« приложение »». Итак, как мне сделать модуль «приложение» известным Python?

#include <pybind11/embed.h>

namespace py = pybind11;

int main(int argc, char *argv[])
{
    py::scoped_interpreter guard{};

    // Construct python wrappers for them
    py::module m("application");

    // Define some objects in the module
    m.add_object("pet", py::cast("dog"));

    // Import the module and access its objects
    py::exec("import application\n"
             "print(application.pet)");
}

person Dov Grobgeld    schedule 08.10.2019    source источник


Ответы (1)


Pybind определяет макрос PYBIND11_EMBEDDED_MODULE для создания встроенных модулей.

https://pybind11.readthedocs.io/en/stable/advanced/embedding.html#adding-embedded-modules

#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);
}
person Sergei    schedule 08.10.2019
comment
Это не отвечает на вопрос, поскольку я прямо спрашивал, как сделать py::module m доступным для импорта. Не как создать модуль другим способом. - person Dov Grobgeld; 09.10.2019
comment
Я дал ответ на основании того, что вы спросили. Правда, могу ошибиться. Вы можете обновить вопрос, чтобы он был понятен (не только для меня, но и для других, чтобы получить более точные ответы). Вам действительно нужно создавать модуль динамически? Почему статический метод с макросом вам не подходит? В любом случае, я думаю, что это можно сделать с помощью python c api, но я сомневаюсь, что это доступно через pybind11. - person Sergei; 10.10.2019