Pythonのctypesで共有ライブラリを呼び出す

2012-05-15

共有ライブラリをPythonから呼び出す

dlopenで共有ライブラリを使ってみるではdlopenを使って 共有ライブラリの関数を呼び出しましたが、今回はPythonというスクリプト言語から呼び出す方法を紹介します。

Pythonは今やかなりメジャーな言語なのでみなさんご存知でしょう。

割と直感的にコードがかけて、ライブラリの呼び出しなども簡単なため、Blenderになどのように Python用のバインディングがあるプロジェクトも多いですね。

Pythonにはctypesというとても便利なライブラリがあって、 簡単に共有ライブラリを扱えます。

今回はこのctypesを使います。

それではさっそくはじめましょう。

Pythonをインストール

まずはPythonをインストールしましょう。

わたしはCent OSを使っているのでyumでインストールしますが、それぞれの環境に合わせてインストールしてください。

$ sudo yum install python
$ python -V
Python 2.6.6

インストール完了です。

バージョンが2.6.6と古いですが、まあいいや。

共有ライブラリを作る

[dlopenで共有ライブラリを使ってみる]({% post_url tech/2012-05-14-shared-library-with-dlopen %})でやったのと同様に共有ライブラリを作ります。

foo.cとして次の内容を保存します。

#include <stdio.h>

void foo()
{
  printf("foo called!\n");
}

"foo called!"だけ標準出力に表示する単純な関数fooを定義しています。

コンパイルします。

$ gcc -shared -fPIC -o foo.so foo.c

これで共有ライブラリfoo.soができました。

ctypesで呼び出す

それでは準備も整ったので、Pythonctypesで共有ライブラリを呼び出しましょう。

foo.pyとして次のコードを保存します。

from ctypes import *

def main():
    foo = cdll.LoadLibrary("./foo.so")
    foo.foo()

if __name__ == "__main__":
    main()

さっそく実行してみましょう。

$ python foo.py
foo called!

foo.soの関数fooが呼ばれていることがわかります。

とても簡単に呼び出すことができますね。

まとめ

今回はPythonから共有ライブラリの関数を呼び出す方法を見ていきました。

Pythonはスクリプト言語なのでコンパイルする必要がなく、気軽に共有ライブラリの関数を呼び出すことができます。

なかでもctypesは非常に強力なライブラリで、 わたしはこのためにPythonを使っています。

ぜひみなさんも使ってみて下さいね。

ご質問等、何かありましたらこちらへ。