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...