memoryfolder

メモです

ctypesを使ってpythonからcのライブラリ(.dll)を読み込む

実験機器を操作するdllがあったので、それをpythonで使えるようにしたい。

ctypeを使います。

 

PY習 ctypesモジュール(1)

15.17. ctypes — A foreign function library for Python — Python 2.7.12 documentation

 

>>> from ctypes import *
>>> cdll.LoadLibrary("foo.dll")
>>> libc = CDLL("foo.dll")
>>> libc.function()

 

関数の引数と返り値の型を指定する必要があるみたいです。

.hファイルがあればそれを参照します。例えば以下のようにあったとします。

EXPNETTYPE unsigned int WINAPI Initialize(char * dir);

 

WINDEFなら、windows dllから読み込む必要もあるみたい。

>>> libc = windll.LoadLibrary("foo.dll")
>>> libc.funcion.argtypes = [c_char_p]
>>> libc.function.restype = c_uint
>>> path = "C:/mypath"
>>> ppath = c_char_p(path)
>>> libc.function(ppath)

とすればエラーなしに動いてくれました。

 

これでとりあえず関数を呼ぶことができた。まだ実験機器につなげて試してみてはないですが、これだけでpythonから使えるなら楽ですね。

 

メモ

 

ctypesを使う際の(個人的な)ポイント - Qiita

https://subversion.xor.aps.anl.gov/synApps/areaDetector/trunk/ADApp/andorSupport/ATMCD32D.h

c++ - Python using ctypes to pass a char * array and populate results - Stack Overflow

Pythonでctypesを使ってコールバック関数でchar*を返すには - Qiita