В pybind11, как вы делаете Py :: Module известным для импорта? - PullRequest
0 голосов
/ 08 октября 2019

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

Следующий пример кода компилируется без проблем, но завершается с ошибкой во время выполнения «Нет модуля с именем« application »». Так как же сделать модуль «приложение» известным 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)");
}

1 Ответ

0 голосов
/ 08 октября 2019

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);
}
...