なるように、なる

徒然なつぶやき、備忘録です。

C++にPythonを組み込むメモ(Boost.python)

C++からPythonを呼びたいのです。
逆に比べると大分ニーズが少ない。
以下を参考にさせて頂きました。
Embedded Python in C++ / C++からPythonスクリプトを呼び出す - Qiita
Boost.PythonでC++からPythonの関数を呼び出す
C++からPythonを叩きつつ、boost.numpyを使ってC++とPython間でndarrayをやりとりする - verilog書く人

初期化
Py_Initialize();
auto main_mod = boost::python::::import("__main__");
auto main_ns = main_mod.attr("__dict__");
スクリプトの読み込み
std::string script((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
boost::python::::exec(script.c_str(), main_ns);
関数の実行
auto func = main_ns["func"];
auto result = func(1.0);
Pythonからの値のパース
boost::python::::extract<double>(result)
例外処理
try {
//
} catch (boost::python::error_already_set) {
    PyErr_Print();
}
リスト/タプルで引数渡し
boost::python::list list_val;
list_val.append(1.0);
list_val.append(2.0);
auto result = main_mod.attr("func")(list_val);
タプルを受け取る
using input_iterator = boost::python::stl_input_iterator<double>;
input_iterator begin(result), end;

std::vector<double> vals(begin, end);
for (auto val : vals) {
    std::cout << val << std::endl;
}