вызвать функцию Python из c ++, используя pybind11

Я пытаюсь вызвать функцию Python из кода C ++, который содержит main() использовать функцию Pybind11, Но я нашел очень мало ссылок доступны. В большинстве существующих документов говорится об обратном направлении, то есть вызове C ++ из Python.

Есть ли полный пример, показывающий, как это сделать? Единственная ссылка, которую я нашел: https://github.com/pybind/pybind11/issues/30

Но у него очень мало информации.

0

Решение

Ответ на ваш вопрос действительно состоит из двух частей: одна о вызове Python-функции из C ++, другая о встраивании интерпретатора.

Вызов функции в pybind11 — это просто вопрос передачи этой функции в pybind11::object переменная, по которой вы можете вызвать operator() попытаться вызвать объект. (Это не обязательно должна быть функция, а просто что-то вызываемое: например, это также может быть объект с __call__ метод). Например, позвонить math.sqrt(2) из кода C ++ вы бы использовали:

auto math = py::module::import("math");
auto resultobj = math.attr("sqrt")(2);
double result = resultobj.cast<double>();

или вы могли бы сжать все это просто:

double result = py::module::import("math").attr("sqrt")(2).cast<double>();

Вторая часть вопроса касается того, как сделать это из исполняемого файла C ++. При построении исполняемого файла (т.е. когда ваш код C ++ содержит main()) вам нужно встроить интерпретатор Python в ваш двоичный файл, прежде чем вы сможете что-либо делать с Python (например, вызов функции Python).

Встроенная поддержка — это новая функция, добавленная в текущий pybind11. master ветка (которая станет выпуском 2.2). Вот базовый пример, который запускает встроенный интерпретатор Python и вызывает функцию Python (math.sqrt):

#include <pybind11/embed.h>
#include <iostream>

namespace py = pybind11;

int main() {
py::scoped_interpreter python;

auto math = py::module::import("math");
double root_two = math.attr("sqrt")(2.0).cast<double>();

std::cout << "The square root of 2 is: " << root_two << "\n";
}

Выходы:

The square root of 2 is: 1.41421

Больше примеров и документации по вызову функций и встраивания доступно на http://pybind11.readthedocs.io/en/master/advanced/pycpp/object.html а также http://pybind11.readthedocs.io/en/master/advanced/embedding.html, соответственно.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]