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

2012-05-15 00:00:00 +0000

Pythonのctypesを使って共有ライブラリを呼び出す方法を紹介します。

共有ライブラリを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で共有ライブラリを使ってみるでやったのと同様に共有ライブラリを作ります。

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を使っています。

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

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

関連する記事

将棋DB2
プロ棋士からコンピューター将棋の棋譜まで観られる将棋の棋譜サービス
将棋DB iOS
将棋DB2のiOSアプリ
将棋DB Android
将棋DB2のAndroidアプリ
碁DB
プロ棋士からコンピューター囲碁の棋譜まで観られる囲碁の棋譜サービス