2017-03-01 76 views
0

Pybind11を使用してmain()関数を含むC++コードからPython関数を呼び出そうとしています。しかし、私は参照が非常に少ないことを発見しました。既存のドキュメントのほとんどは、逆方向、つまりPythonからC++を呼び出すことについて話しています。pybind11を使用してC++からPython関数を呼び出す

これを行う方法を示す完全な例はありますか?私が見つけた唯一の参考資料は、https://github.com/pybind/pybind11/issues/30

ですが、情報はほとんどありません。

答えて

2

あなたの質問への答えは本当に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.htmlhttp://pybind11.readthedocs.io/en/master/advanced/embedding.htmlで入手できます。それぞれ、

関連する問題