2011-10-25 67 views
3

我一直在使用SWIG很長一段時間 - 通常我喜歡它。 但使用ctypes做回調函數似乎(很多)更容易。結合ctypes和swig

我該如何結合與C DLL交互的兩種「方式」?

第一步將知道,如何通過導入相應的SWIG模塊加載dll後,如何將ctypes對象添加到dll中。

謝謝,
塞巴斯蒂安。

回答

0

緩衝區協議可能是您最好的選擇(http://docs.python.org/c-api/buffer.html)。

從C代碼(例如swig生成的代碼)中,可以通過訪問此接口來獲取指向底層C數據的指針。

注意緩衝區接口有兩個版本,python 2.x中的ctypes對象會暴露舊的協議,在python 3.x中它們公開了新的協議。你必須下到Python C API級別,但只有一次,如果你很好地包裝了所有東西 - 例如,可能使一個%內聯函數返回一個void *支持緩衝協議的任何東西,並在類型映射中使用它爲您的回調類型。

0

如果x.pyd是痛飲編譯擴展模塊,那麼你就可以載入以這種方式通過的ctypes的dll:

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

根據被導出的函數的調用約定,您可能需要使用PyDLL,WinDLL或CDLL。