Python から C のライブラリ関数を呼び出す
ctypes を利用すると C 言語のランタイムライブラリの関数を呼び出すことができます。
ここでは Windows 上の Microsoft VC++ ランタイムライブラリ (msvcrt) と Linux の C ライブラリを呼ぶ方法を紹介します。
Windows 上での C ライブラリ関数の利用
Windows での C ランタイムライブラリは msvcrt.dll です。次の Python スクリプトでは、cdll.msvcrt としてそれを読み込み、printf で文字列や整数を出力しています。
from ctypes import *
msvcrt = cdll.msvcrt
# Print string
msvcrt.printf("Hello, world!\n")
# Print int
for i in range(5):
msvcrt.printf("%d\n", i)
実行結果は次の通り。
> python ctypes1.py Hello, world! 0 1 2 3 4
cdll では .dll という拡張子を付けていないことに注意してください。また、cdll でロードした場合 cdecl の呼び出し規則を用います。stdcall が必要な場合は windll を利用します。
ちなみに、Windows ではどの DLL がどんな関数をエクスポートしているか確認するためには、 Windows SDK ツールの dumpbin などが使えます。
次のコマンドではエクスポートされた関数の中で、printf を含む関数名を表示します。
> dumpbin /EXPORTS C:\Windows\System32\msvcrt.dll | findstr printf
Linux での C ライブラリ関数の利用
Linux では C のランタイムは libc です。
Linux では拡張子をつけてロードする必要があるので、Windows の場合のような cdll を利用できません。代わりに次のように CDLL を利用します。
from ctypes import *
libc = CDLL("libc.so.6")
libc.printf("Hello, world!\n")
一度ロードできれば、Windows も Linux でも同じような呼び出しが可能です。