hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。
05/26/2011 むう [長年日記]
■ [Py] 3 つの Python バインディング
以前 ctypes を使って sched_[gs]etaffinity の wrapper を書いた が,ctypes は libc しか使えないというわけでは全くないので,比較のために ctypes を使った C/Migemo バインディングも書いてみた. 厳密に仕様を同じにしているわけではないので細かい部分では少し違うけど.
ctypes は .dll や .so を Python の世界から使うもので,呼び出す関数の引数や返値の変換に便利なものを色々と提供してくれる. なおここでは .so を前提にしている.
ctypes を使う時に困るのは定数..so を使うものなので .h は知らん的な感じになる. どうしても使いたい場合は h2py や ctypesgen 等を使う感じになりそう.
それと厄介なのはやはりポインタの扱い. C/Migemo では migemo_query() で返ってきた文字列を migemo_release() で解放してやる必要があって,怠ると見事にメモリリークする (当たり前). migemo_query() の返値を c_char_p で定義してしまうと,migemo_query() から返ってきたものをそのまま migemo_release() に渡してもうまくいかない. そこで返値の型を POINTER(c_char) と定義した上で,文字列を取り出す時に c_char_p 型にキャストしている.
さて ctypes 版は Python そのもので,Cython 版は Python/C 中間言語で,C API 版は C そのもので書いてあるわけだけど,まあ個人的な感想としては以下のような感じ.
- ctypes
- さっと .so を使いたい時にさっと使うのにとても便利
- 込み入ったことをしようとすると結構きついこともある
- Cython
- ビルドの手間があるので .so をさっと使いたいだけな時にはハードルになるかも
- C コードが自動生成される点にきもさを感じる人には向かない
- 込み入ったことも結構あっさりできる
- C API
- 何から何まで自分で面倒見たい人向け
なお Cython と C API は別に .so を使うためのものというわけではないので他の用途も盛り沢山である,という点は誤解なきよう.
あとバインディングを作りたいと思った時に 1 度は候補に挙がるであろう SWIG というものもあるけど,こちらは使ったことないので知らない. SWIG は Python 以外も視野に入っている場合にというイメージ. 全然知らないので本当に勝手なイメージだけど.