您的问题实际上有两个方面:一个是关于从C++调用Python函数,另一个是关于嵌入解释器。
在pybind11中调用函数只需要将该函数放入一个
pybind11::object
变量中,您可以调用
operator()
来尝试调用该对象。 (它不一定是一个函数,但必须是可调用的内容:例如,它也可以是一个具有
__call__
方法的对象)。例如,要从C++代码调用
math.sqrt(2)
,您可以使用以下代码:
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找到。