2011-10-25 34 views
3

私は長い間SWIGを使用してきました - 一般的に私はそれが好きです。 しかし、ctypesを使用すると、コールバック関数を(もっと)簡単に行うことができます。ctypesとswigを組み合わせる

C DLLと対話する2つの「方法」をどのように組み合わせることができますか?

最初の手順は、dllが対応するSWIGモジュールのインポートによって既にロードされた後に、ctypesオブジェクトをdllに取得する方法を知ることです。

ありがとう、
セバスチャン。

答えて

0

バッファプロトコルが最適です(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あなたのコールバックの種類。

0

x.pydはSWIGコンパイル拡張モジュールである場合は、この方法でのctypesを経由してDLLをロードすることができます

import x 
from ctypes import PyDLL 
dll = PyDLL(x.__file__) 

エクスポート関数で使用される呼び出し規約に応じて、使用する必要があるかもしれませんPyDLL、WinDLL、またはCDLL。