在
(一)python調用c++代碼《從C++共享鏈接庫編譯到python調用指南》
(二)ndarray(Python)與Mat(C++)數據的傳輸
兩篇文章中,我們已經講解了python中如何調用有復雜依賴關系的C++代碼,以及ndarray和Mat類型在兩個語言之間的傳入(主要針對python中opencv圖像和c++中opencv圖像數據傳輸)。
本文考慮到C++結構體也是常見數據,所以特記錄一篇.
// 定義結構體
typedef struct NLDJ_TC_Out
{
int test0;
float test1;
int test2[4];
}NLDJ_TC_Out;
extern "C"{
// 定義一個返回結構體的函數
NLDJ_TC_Out get_struct(){
// 結構體
NLDJ_TC_Out result;
result.test0=1;
result.test1=2.2;
for (int i=0;i<4;i++){
result.test2[i]=i;
}
return result; // 返回結構體
}
}
上述代碼因為不存在依賴關系,所以可以直接使用g++ -o StructCls.so -shared -fPIC StructCls.cpp
編譯成共享鏈接庫
python代碼主要完成調用函數,接收返回的結構體,主要步驟:
import ctypes
from ctypes import *
# 加載共享鏈接庫
structcls = ctypes.cdll.LoadLibrary("build/StructCls.so")
# python中將結構體定義為類
class Struct_NLDJ_TC_Out(Structure):
_fields_ = [("test0", c_int), ("test1", c_float), ("test2", c_int * 4)]
# 定義返回類型的數據類型
structcls.get_struct.restype = Struct_NLDJ_TC_Out
# result已經是轉為python中定義的Struct_NLDJ_TC_Out了
# 所以result是可以按python語法輸出
result = structcls.get_struct()
print(result.test2[1])
結果圖:
參考:Python調用c++的動態dll中數據映射(Mat類型傳遞及結構體傳遞)