あなたの質問への答えは本当に2つの部分を持っています:1つはC++のPython関数を呼び出すこと、もう1つはインタプリタを埋め込むことです。
pybind11で関数を呼び出すのは、その関数をpybind11::object
変数に渡すだけです。この関数では、operator()
を呼び出してオブジェクトの呼び出しを試みることができます。 (関数でなくても呼び出し可能なものだけでなく、たとえば__call__
メソッドを持つオブジェクトでもかまいません)。
auto math = py::module::import("math");
auto resultobj = math.attr("sqrt")(2);
double result = resultobj.cast<double>();
またはあなただけにすべてを凝縮できます:たとえば、C++コードからmath.sqrt(2)
を呼び出すために、あなたは使用すると思い
が
double result = py::module::import("math").attr("sqrt")(2).cast<double>();
質問の後半部分からこれを行う方法を必要としますC++実行可能ファイル。実行可能ファイル(例えば、C++コードにmain()
が含まれている)をビルドするときは、バイナリに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で入手できます。それぞれ、