|
python可以通過外接庫ctypes很方便地調(diào)用c語言編寫的dll函數(shù),若是c++語言編寫的,則首先需用c語言封裝,這是因編譯器對此兩者的函數(shù)名處理不同,而會產(chǎn)生一些差別,從而影響到后續(xù)編程。至于如何封裝,可尋找相關(guān)資料,這里略。 ctypes調(diào)用dll函數(shù)的關(guān)鍵是使函數(shù)的形參與實參的類型統(tǒng)一,若形參與實參是指針、指向數(shù)組的指針也一樣。另外,函數(shù)輸出數(shù)據(jù)的類型也需統(tǒng)一。下面舉例。 dll的c源碼: __declspec(dllexport) float summ(int len, float *p) { int i; float sum = 0; for (i = 0; i < len; i++) { sum = sum + *(p + i); } return sum; } 分析:源碼中summ()函數(shù)形參,一個整型加一個浮點型的指向數(shù)組的指針;而返回值是一個浮點型。 python3.7的編程與注釋如下: from ctypes import * # 有兩種調(diào)用方式,下面是一種,使用CDLL("PATH") dll = CDLL("dll的具體路徑") # 另一種是cdll屬性調(diào)用,如:cdll.LoadLibrary("dll的具體路徑") # 下述是python列表 aa = [1.2,2.3,5.6,2.5,8.9,5,14,15.8] # 設(shè)置函數(shù)summ輸入屬性argtypes,統(tǒng)一函數(shù)形參與實參類型 # POINTER(c_float*len(aa)是浮點型的指向數(shù)組的指針,數(shù)組長度是列表aa的長度len dll.summ.argtypes = [c_int,POINTER(c_float*len(aa))] # 設(shè)置函數(shù)summ輸出屬性restype,確定函數(shù)輸出數(shù)據(jù)類型 dll.summ.restype = c_float # 列表轉(zhuǎn)化為數(shù)組 aa_arr = (c_float*len(aa))(*aa) # 求函數(shù)值(小數(shù)點保留二位有效數(shù)字) sum1 = dll.summ(len(aa), aa_arr) print(round(sum1,2)) |
|
|