Python 外部函式呼叫庫ctypes簡介

發表於2016-12-05

參考資料

ctypes簡介

一直對不同語言間的互動感興趣,python和C語言又深有淵源,所以對python和c語言互動產生了興趣。
最近了解了python提供的一個外部函式庫 ctypes, 它提供了C語言相容的幾種資料型別,並且可以允許呼叫C編譯好的庫。
這裡是閱讀相關資料的一個記錄,內容大部分來自官方文件

資料型別

ctypes 提供了一些原始的C語言相容的資料型別,參見下表,其中第一列是在ctypes庫中定義的變數型別,第二列是C語言定義的變數型別,第三列是Python語言在不使用ctypes時定義的變數型別。

建立簡單的ctypes型別如下:

使用 .value 訪問和改變值:

改變指標型別的變數值:

如果需要直接操作記憶體地址的資料型別:

下面的例子演示了使用C的陣列和結構體:

建立指標例項

使用cast()型別轉換

類似於C語言定義函式時,會先定義返回型別,然後具體實現再定義,當遇到下面這種情況時,也需要這麼幹:

呼叫.so/.dll

可以簡單地將”so”和”dll”理解成Linux和windows上動態連結庫的指代,這裡我們以Linux為例。注意,ctypes提供的介面會在不同系統上有出入,比如為了載入動態連結庫, 在Linux上提供的是 cdll, 而在Windows上提供的是 windlloledll

載入動態連結庫

呼叫載入的函式

設定個性化引數

ctypes會尋找 _as_paramter_ 屬性來用作呼叫函式的引數傳入,這樣就可以傳入自己定義的類作為引數,示例如下:

指定函式需要引數型別和返回型別

argtypesrestype 來指定呼叫的函式返回型別。

這裡我只是列出了 ctypes 最基礎的部分,還有很多細節請參考官方文件。

相關文章