Ответ на ваш вопрос состоит из двух частей: одна касается вызова функции 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 соответственно.
person
Jason Rhinelander
schedule
14.07.2017