python使用ctypes與C混合程式設計

2021-08-20 12:27:16 字數 1388 閱讀 3270

python作為膠水,可以非常方便地和其他語言進行混合程式設計,當然和c混合程式設計的方式也有很多種,如使用cyptes、cython、boost、swig等等。使用混合程式設計的好處在於可以理由各個語言優勢,完成整個功能,如c語言的效率就明顯高於python語言。ctypes的方式,主要流程是將c源**通過編譯生成動態鏈結庫dll或so檔案,然後在python中使用ctypes動態鏈結庫匯入功能。

呼叫方式示例

#目前支援的dll方式也有多重如pydll\cdll\oledll\windll等;

from ctypes import *

exampledll = cdll('example.dll')

exampledll.func.restype = c_bool #設定ctypes模組中對應的型別

exampledll.func.argtypes = [type1, ...] #設定ctypes模組中對應的型別

exampledll.func()

資料型別對應關係

cyptes模組的基本的型別格式與c語言的資料型別對應關係如下,這些基礎型別都可以進行初始化,如c_int(0)。而指標資料型別,修改時,改變了它們指向的位址位置,而非原來位址中修改相應值。

指標傳遞方式可以使用pointer和byref,在python中無需使用pointer物件時建議使用byref函式。當c和python之間傳遞結構體和聯合型別時,需要從ctypes中的structure和union繼承得來,需要定義_fields_屬性,該屬性為二元組(名,type)的方式,亦即_fields_ = [ ("name1",type1), (name2,type2), ...],其中的型別定義為ctypes模組中的型別,結構體中支援巢狀結構體的複雜方式。cytpes中可以採用class _pack_(int)方式來實現c中的位址對齊方式。當定義結構體位元域時,可以在_fields_屬性中採用三元組方式(「name」, type, 位元數)。陣列定義的推薦方式 型別*個數。指標pointer的使用,var = type(value) , pointervalue = pointer(var);pinter的contents屬性可以得到指向的型別及其值。sizeof可以檢視占用儲存空間大小,而resize()可以用來重新定義變數大小。ctypes中的array具有_length_及_type_屬性。

指定函式引數及返回值型別

返回值的表示方式函式.restype = cytpes.型別;函式引數的表示方式函式.argtypes = [cytpes.型別,...] 然後進行函式呼叫或者直接類似型別強轉方式使用函式func(ctypes.型別(),...)。

python中ctypes的使用

window下,python銜接c語言程式設計 本地安裝64位的python3.5,visual studio 2017 step1 安裝visual studio 2017,提供c語言編譯器 即msvc版本,另一版本是linux下的gcc step2 選擇x64的命令列 step3 輸入pip i...

python使用ctypes呼叫 c

不多bb,非常簡單。簡單來說,c c完整的 段只需要編譯輸出到dll程度,就可以被python呼叫了。python呼叫dll的方法,就是用ctypes裡面的方法。1 先把完整 段寫成.c cpp,放好備用。2 然後用msvc編譯這個,輸出dll。找不到msvc?如果你安裝了visual studio...

python 與 C 的互動 ctypes庫使用

python 與 c 的互動 ctypes庫使用 ctypes是python的乙個外部庫,可以使用python語言呼叫已經編譯好的c語言函式以及資料型別並進行資料交換等。ctypes的官方文件在 1.生成c語言函式 step 1 test.c include int add int a,int b ...