Pybind11を使ってみる。
PYBIND11_MODULE(pydファイル名, 変数名 ) {
変数名 . def (
"Python側の関数名" ,
&C++側の関数名
);
}
// 呼び出し側のPythonのバージョンのライブラリを使用する
#pragma comment(lib, "python39.lib") #include <pybind11/pybind11.h> namespace py = pybind11; int my_add_func(int a, int b) { return a + b; } // PYBIND11_MODULE(モジュール名, モジュール変数名) // 生成物はmy_module_name.pydという名前にしなければならない PYBIND11_MODULE(my_module_name, m) { m.def( "call_in_python", // Python側で呼び出す関数名 &my_add_func, // C++側の関数名 py::arg("a"), // Python側での引数名(指定省略可) py::arg("b") // Python側での引数名(指定省略可) ); }
import my_module_name val = my_module_name.call_in_python(10,2) print(val)
#pragma comment(lib, "python39.lib") #include <pybind11/pybind11.h> namespace py = pybind11;
std::tuple<int,float> my_calc_func(int a, int b) { return std::make_tuple( a + b, (float)(a) / (float)(b) ); }
// PYBIND11_MODULE(モジュール名, モジュール変数名) // 生成物はmy_module_name.pydという名前にしなければならない PYBIND11_MODULE(my_module_name, m) { m.def( "call_in_python", // Python側で呼び出す関数名 &my_calc_func, // C++側の関数名 py::arg("a"), // Python側での引数名(指定省略可) py::arg("b") // Python側での引数名(指定省略可) ); }
import my_module_name val1,val2 = my_module_name.call_in_python(10,2) print(val1) print(val2)
#pragma comment(lib, "python39.lib") #include <pybind11/pybind11.h> namespace py = pybind11;
class MyClass { std::string m_str; int value; public: MyClass(std::string str,int val) : m_str(str),value(val) {} std::string get() { return m_str + " " + std::to_string(value); } void set(std::string str) { m_str = str; } };
std::string version() { return "1.0.0"; }
// PYBIND11_MODULE(モジュール名, モジュール変数名) // 生成物はmy_module_name.pydという名前にしなければならない PYBIND11_MODULE(my_module_name, m) { // クラスを追加 pybind11::class_<MyClass>(m, "MyClassInCPP") // クラス名を指定 PythonからMyClassInCPPとしてアクセス .def(pybind11::init<std::string,int>()) // コンストラクタを指定 .def("get_str", &MyClass::get) // メンバ関数を追加。Pythonからget_strとしてアクセス .def("set_str", &MyClass::set); // 関数を追加 m.def("get_version", &version, "get version function"); }
import my_module_name ss = my_module_name.MyClassInCPP("hello",15) print("get_str " , ss.get_str() ) ss.set_str("string") print("get_str " , ss.get_str() ) print("version:" , my_module_name.get_version() )