2017-03-01 125 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"; 
} 

輸出, 分別。