Я пытаюсь вызвать функцию Python из кода C ++, который содержит main()
использовать функцию Pybind11
, Но я нашел очень мало ссылок доступны. В большинстве существующих документов говорится об обратном направлении, то есть вызове C ++ из Python.
Есть ли полный пример, показывающий, как это сделать? Единственная ссылка, которую я нашел: https://github.com/pybind/pybind11/issues/30
Но у него очень мало информации.
Ответ на ваш вопрос действительно состоит из двух частей: одна о вызове 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, соответственно.
Других решений пока нет …