我一直在使用SWIG很長一段時間 - 通常我喜歡它。 但使用ctypes做回調函數似乎(很多)更容易。結合ctypes和swig
我該如何結合與C DLL交互的兩種「方式」?
第一步將知道,如何通過導入相應的SWIG模塊加載dll後,如何將ctypes對象添加到dll中。
謝謝,
塞巴斯蒂安。
我一直在使用SWIG很長一段時間 - 通常我喜歡它。 但使用ctypes做回調函數似乎(很多)更容易。結合ctypes和swig
我該如何結合與C DLL交互的兩種「方式」?
第一步將知道,如何通過導入相應的SWIG模塊加載dll後,如何將ctypes對象添加到dll中。
謝謝,
塞巴斯蒂安。
緩衝區協議可能是您最好的選擇(http://docs.python.org/c-api/buffer.html)。
從C代碼(例如swig生成的代碼)中,可以通過訪問此接口來獲取指向底層C數據的指針。
注意緩衝區接口有兩個版本,python 2.x中的ctypes對象會暴露舊的協議,在python 3.x中它們公開了新的協議。你必須下到Python C API級別,但只有一次,如果你很好地包裝了所有東西 - 例如,可能使一個%內聯函數返回一個void *支持緩衝協議的任何東西,並在類型映射中使用它爲您的回調類型。
如果x.pyd是痛飲編譯擴展模塊,那麼你就可以載入以這種方式通過的ctypes的dll:
import x
from ctypes import PyDLL
dll = PyDLL(x.__file__)
根據被導出的函數的調用約定,您可能需要使用PyDLL,WinDLL或CDLL。