python通過ctypes呼叫c動態鏈結庫dll

2021-10-18 16:16:33 字數 3817 閱讀 5793

python端的**如下:

customdll = cp.cdll.loadlibrary(r"d:\project_code\cppproject\cpp_utils\x64\release\_getnozerolabelidindex.dll")

batchsizeloaddata = customdll._batchsizeloaddata

batchsizeloaddata.argtypes = [cp.c_uint, cp.pointer(cp.c_char_p)]

batchsizeloaddata.restype = cp.c_bool

def setparameters(strparamlist):

numparams = len(strparamlist)

strarraytype = cp.c_char_p * numparams

strarray = strarraytype()

for i, param in enumerate(strparamlist):

strarray[i] = param.encode("ascii")

batchsizeloaddata(numparams, strarray)

if __name__ == "__main__":

list = ["1111", "dadsadas"]

setparameters(list)

c標頭檔案**:

extern "c" _declspec(dllexport) bool _batchsizeloaddata(unsigned int count, char **params);
c原始檔**如下:

bool _batchsizeloaddata(unsigned int count,  char **params) 

return true;

}

python檔案:

def load_data_ctypes(batch_size, path_list, data_array, label_array):

customdll = cp.cdll.loadlibrary(r"d:\project_code\cppproject\cpp_utils\x64\release\_getnozerolabelidindex.dll")

batchsizeloaddata = customdll._batchsizeloaddata

batchsizeloaddata.argtypes = [cp.c_uint, cp.pointer(cp.c_char_p),

np.ctypeslib.ndpointer(dtype=np.float32, ndim=1, flags='contiguous'),

np.ctypeslib.ndpointer(dtype=np.uint8, ndim=1, flags='contiguous')

]batchsizeloaddata.restype = cp.c_bool

str_array_type = cp.c_char_p * batch_size

str_array = str_array_type()

for i in range(batch_size):

str_array[i] = path_list[i].encode("ascii")

batchsizeloaddata(batch_size, str_array, data_array, label_array)

c介面宣告:

extern "c" _declspec(dllexport) bool _batchsizeloaddata(unsigned int unbatchsize, char **pchparams, float *pshdata, unsigned char * puchlabel);
c語言中float是32bit,所以python引數也應該是32bit浮點型別

python呼叫c++介面傳參時引數型別(所佔位元組數)必須一致,如python中的np.float64對應的市c中的double型別,float32對應c中float型別,使用c中sizeof函式來檢視c中資料型別所佔位元組數,參照下表c資料型別表。

資料型別

描述bool_

布林(true或false),儲存為乙個位元組

int_

預設整數型別(與clong相同;通常是int64或int32)

intc

與cint(通常為int32或int64)相同

intp

用於索引的整數(與cssize_t相同;通常是int32或int64)

int8

位元組(-128至127)

int16

整數(-32768至32767)

int32

整數(-2147483648至2147483647)

int64的

整數(-9223372036854775808至9223372036854775807)

uint8

無符號整數(0到255)

uint16

無符號整數(0到65535)

uint32

無符號整數(0到4294967295)

uint64

無符號整數(0到18446744073709551615)

float_

float64的簡寫。

float16

半精度浮點:符號位,5位指數,10位尾數

float32

單精度浮點數:符號位,8位指數,23位尾數

float64

雙精度浮點:符號位,11位指數,52位尾數

complex_

complex128的簡寫。

complex64

複數,由兩個32位浮點數(實部和虛部)

complex128

複數,由兩個64位浮點數(實部和虛部)

下表列出了關於標準整數型別的儲存大小和值範圍的細節:

型別儲存大小

值範圍char

1 位元組

-128 到 127 或 0 到 255

unsigned char

1 位元組

0 到 255

signed char

1 位元組

-128 到 127

int2 或 4 位元組

-32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647

unsigned int

2 或 4 位元組

0 到 65,535 或 0 到 4,294,967,295

short

2 位元組

-32,768 到 32,767

unsigned short

2 位元組

0 到 65,535

long

4 位元組

-2,147,483,648 到 2,147,483,647

unsigned long

4 位元組

0 到 4,294,967,295

下表列出了關於標準浮點型別的儲存大小、值範圍和精度的細節:

型別儲存大小

值範圍精度

float

4 位元組

1.2e-38 到 3.4e+38

6 位小數

double

8 位元組

2.3e-308 到 1.7e+308

15 位小數

long double

16 位元組

3.4e-4932 到 1.1e+4932

19 位小數

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模組用法

目錄 簡要說明 開發環境 封裝資料結構 陣列 結構體 指標 列舉 函式傳遞結構體引數 備註 ctypes是python的外部函式庫。它提供c相容的資料型別,並允許在dll或共享庫中呼叫函式,它可以用於在純python中包裝這些庫。cdll 載入使用標準cdecl呼叫約定匯出函式的庫,而windll庫...

python使用ctypes呼叫 c

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