我想从包含main()
函数的C++代码调用python函数,使用Pybind11
。但是我发现很少有参考文献可用。大多数现有的文档都提到了相反的方向,即从Python调用C++。使用pybind11从C++调用Python函数
是否有任何完整的例子显示如何做到这一点?我发现的唯一参考是:https://github.com/pybind/pybind11/issues/30
但它只有很少的信息。
我想从包含main()
函数的C++代码调用python函数,使用Pybind11
。但是我发现很少有参考文献可用。大多数现有的文档都提到了相反的方向,即从Python调用C++。使用pybind11从C++调用Python函数
是否有任何完整的例子显示如何做到这一点?我发现的唯一参考是:https://github.com/pybind/pybind11/issues/30
但它只有很少的信息。
您的问题的答案确实有两个部分:一个关于从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
)一个基本的例子:http://pybind11.readthedocs.io/en/master/advanced/pycpp/object.html和http://pybind11.readthedocs.io/en/master/advanced/embedding.html的通话功能和嵌入可
The square root of 2 is: 1.41421
更多的例子和文档:
#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";
}
输出, 分别。