まずはctypesを利用する例。
もちろん自分でC/C++で書いた関数を呼び出すのでも構わないが、既存のCライブラリをPythonから利用したいというシチュエーションも多いため、まずはそういう例。
というわけで、形態素解析ソフトとして良く使われているmecabのライブラリをPythonから使えるようにしてみる。
ただし、実はmecabのPythonインターフェイスはmecabの開発元から配布されている事に気付いたので、ほんの触りだけ。
ctypesの使い方がなんとなく分かると思う。
要するにシェアードライブラリをそのまま読み込み、その中の関数を呼び出してくれる。
PythonとC間で引数や戻り値を正しくやりとりするために、必要に応じてその型情報を設定してやる必要がある。
ちなみにtext.txtには、インストールしてあるmecab用辞書に合わせて文字コードをUTF-8にした日本語文章が入っている。
他の文字コードの場合には適宜変換が必要になる。
また、unicode文字列を渡すことはできない。(segfaultになる)
import ctypes as C
MECAB_LIB_PATH = '/usr/lib/libmecab.so.1'
libmecab = C.CDLL(MECAB_LIB_PATH)
libmecab.mecab_sparse_tostr.restype = C.c_char_p
libmecab.mecab_version.restype = C.c_char_p
libmecab.mecab_strerror.restype = C.c_char_p
class MyMecab:
def __init__(self, option=''):
self.mecab = libmecab.mecab_new2('mecab ' + option)
def __del__(self):
libmecab.mecab_destroy(self.mecab)
def parse(self, text):
return libmecab.mecab_sparse_tostr(self.mecab, text)
def version(self):
return libmecab.mecab_version()
def error_message(self):
return libmecab.mecab_strerror(self.mecab)
if __name__ == '__main__':
filename = 'test.txt'
text = file(filename).read()
mecab = MyMecab()
result = mecab.parse(text)
print result