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 でも同じような呼び出しが可能です。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Python 入門