Python からカスタムの DLL を利用する
ここでは Windows 上で利用できる簡単な DLL を作成して、その中の関数を Python スクリプトから呼び出す方法を紹介します。
Windows での DLL の作り方についてはこのページでもソースコードは紹介しますが、「単純な DLL の作成 なども参考にしてください。
Python から自前の C 関数を呼べるようになれば、多くの Windows API を簡単に利用できるようになるので、Python でのプログラミングの幅が広がりますね。
Windows での DLL の作成方法
Windows SDK をインストールすると開発ツールや必要なヘッダファイルやライブラリが揃います。次の手順で DLL を作成してください。
次の内容を testdll1.cpp として保存します。
void foo1(int* i) {
*i += 1;
return;
}
次の内容を testdll1.h として保存します。
#pragma once
void foo1(int* i);
次の内容を testdll1.def として保存します。
LIBRARY testdll1
EXPORTS
foo1
次の内容を makefile とします。
TARGETNAME=testdll1
DEFFILE=testdll1
OUTDIR=.\chk
ALL : "$(OUTDIR)\$(TARGETNAME).dll"
"$(OUTDIR)" :
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
CPP_PROJ=\
/MT\
/W4\
/Fo"$(OUTDIR)\\"\
/Fd"$(OUTDIR)\\"\
/c
LINK32=link.exe
LINK32_FLAGS=\
/subsystem:windows\
/pdb:"$(OUTDIR)\$(TARGETNAME).pdb"\
/debug\
/RELEASE\
/out:"$(OUTDIR)\$(TARGETNAME).dll"\
/DLL\
/DEF:$(DEFFILE).def
LINK32_OBJS= \
"$(OUTDIR)\$(TARGETNAME).obj"
"$(OUTDIR)\$(TARGETNAME).dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
$(LINK32) $(LINK32_FLAGS) $(LINK32_OBJS)
.cpp{$(OUTDIR)}.obj::
$(CPP) $(CPP_PROJ) $<
Windows SDK のコマンドプロンプトから nmake とすることで、testdll1.dll が作成できるはずです。
開発環境の設定等については、Windows プログラミング入門 などを参考にしてください。
DLL を Python から利用する
上記で作成した testdll1.dll を次の Python スクリプト ctype2.py と同じフォルダに配置します。
from ctypes import *
mydll = cdll.testdll1
i = c_void_p(10)
print i.value
mydll.foo1(byref(i))
print i.value
実行結果は次の通り。
> python ctypes2.py 10 11
上で作成した関数 foo1 では int のポインタを受け取って、値をインクリメントしています。
Python スクリプトからポインタを渡すために、c_void_p のインスタンスを作成して、それを byref を用いて関数に渡しています。
関数へ整数を参照渡ししているので、関数の中で値がインクリメントされたことが確認できました。