

こういうことをBoost::pythonを使ってやりたいです。

**C言語側**

[code]

    struct A{
        int x;
        int y;
    }
    struct B{
        int id;
        A a;
    }
    
[/code]

**Python側**

[code]

    b = B()
    b.a.x = 0
    b.a.y = 1
    b.id = 25
    
[/code]

Boost.pythonで試してみたところ、

[code]

    boost::python::class_<B>("B")
        .def_readwrite("id", &B::id);
    
[/code]

は動作して、上記コードスニペットでb.id = 25 にあたる部分は正常動作します。  
ですが、

[code]

    boost::python::class_<B>("B")
        .def_readwrite("a", &B::a);
    
[/code]

では、b.a までは動いても、b.a.x の呼び出しができません。

おそらく、構造体/クラスのメンバ変数にユーザ定義の構造体/クラスが含まれる場合に特別な書き方があるのだろう、と思います。  
書き方のポイントを教えていただけますでしょうか。


CC BY-SA 4.0
2018-11-27T06:21:44.107
50668
2020-04-03T10:01:10.183
2018-11-27T06:38:07.153
3060
31175
question
python boost
boost::python でユーザ定義構造体/クラスをメンバに含む構造体/クラスにアクセスする


python3.7 + pybind11 での実装ですが、以下のコードは動作しました。

**src/main.cpp**

[code]

    #include <pybind11/pybind11.h>
    
    struct A{
        int x;
        int y;
    };
    
    struct B{
        int id;
        A a;
    };
    
    namespace py = pybind11;
    
    
    PYBIND11_MODULE(example, m) {
    
      py::class_<A>(m, "A")
        .def(py::init<int, int>())
        .def_readwrite("x", &A::x)
        .def_readwrite("y", &A::y);
    
      py::class_<B>(m, "B")
        .def(py::init<int, A>())
        .def_readwrite("id", &B::id)
        .def_readwrite("a", &B::a);
    }
    
[/code]

**sample.py**

[code]

    from example import A, B
    
    a = A(1, 2)    
    b = B(1, a)
    
    b.a.x = 0
    b.a.y = 1
    b.id = 25
    
    print(b.a.x, b.a.y, b.id)
    
[/code]

[pybind11/python_example](https://github.com/pybind/python_example) の setup.py
を参考にビルドしています。

[code]

    $ pip install pybind11
    $ pip install .
    $ python sample.py
    0 1 25
    
[/code]


CC BY-SA 4.0
2018-11-28T13:06:04.673
50725
2018-11-28T13:06:04.673
5997
50668
answer