我想從包含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";
}
輸出, 分別。