スポンサーリンク

Pybind11でC++からPythonモジュールを作成

Pybind11を使ってみる。

基本

my_module_name.pyd

 

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側での引数名(指定省略可) ); }

test.py

import my_module_name

val = my_module_name.call_in_python(10,2)

print(val)

複数の値をタプルで返す

my_module_name.pyd

#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側での引数名(指定省略可)
    );
}

test.py

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");
}

test.py

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() )

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: