2017-03-01 792 views

回答

2

您的问题的答案确实有两个部分:一个关于从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.htmlhttp://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"; 
} 

输出, 分别。