私は長い間SWIGを使用してきました - 一般的に私はそれが好きです。 しかし、ctypesを使用すると、コールバック関数を(もっと)簡単に行うことができます。ctypesとswigを組み合わせる
C DLLと対話する2つの「方法」をどのように組み合わせることができますか?
最初の手順は、dllが対応するSWIGモジュールのインポートによって既にロードされた後に、ctypesオブジェクトをdllに取得する方法を知ることです。
ありがとう、
セバスチャン。
私は長い間SWIGを使用してきました - 一般的に私はそれが好きです。 しかし、ctypesを使用すると、コールバック関数を(もっと)簡単に行うことができます。ctypesとswigを組み合わせる
C DLLと対話する2つの「方法」をどのように組み合わせることができますか?
最初の手順は、dllが対応するSWIGモジュールのインポートによって既にロードされた後に、ctypesオブジェクトをdllに取得する方法を知ることです。
ありがとう、
セバスチャン。
バッファプロトコルが最適です(http://docs.python.org/c-api/buffer.html)。
Cコード(swig生成コードなど)から、このインターフェイスにアクセスすることで、基礎となるCデータへのポインタを取得できます。
バッファインターフェイスには2つのバージョンがあります.pthon 2.xのctypesオブジェクトは、古いプロトコルを公開します(Python 3.xでは新しいプロトコルを公開します)。
あなたはPython C APIレベルまで下がる必要がありますが、すべてをうまくラップしている場合は一度しか必要ありません。たとえば、%inline関数をバッファプロトコルをサポートしているものに対してvoid *を返し、typemapsあなたのコールバックの種類。
x.pydはSWIGコンパイル拡張モジュールである場合は、この方法でのctypesを経由してDLLをロードすることができます
import x
from ctypes import PyDLL
dll = PyDLL(x.__file__)
エクスポート関数で使用される呼び出し規約に応じて、使用する必要があるかもしれませんPyDLL、WinDLL、またはCDLL。