程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

(三)C++結構體與python的傳輸

編輯:Python

  • 1、前言
  • 2、C++代碼
  • 3、python代碼
  • End

該系列文章:
(一)python調用c++代碼《從C++共享鏈接庫編譯到python調用指南》
(二)ndarray(Python)與Mat(C++)數據的傳輸
(三)C++結構體與python的傳輸

1、前言


(一)python調用c++代碼《從C++共享鏈接庫編譯到python調用指南》
(二)ndarray(Python)與Mat(C++)數據的傳輸
兩篇文章中,我們已經講解了python中如何調用有複雜依賴關系的C++代碼,以及ndarray和Mat類型在兩個語言之間的傳入(主要針對python中opencv圖像和c++中opencv圖像數據傳輸)。

本文考慮到C++結構體也是常見數據,所以特記錄一篇.

2、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編譯成共享鏈接庫

3、python代碼

python代碼主要完成調用函數,接收返回的結構體,主要步驟:

  1. 定義結構類(相當於映射C++中的結構)
  2. 定義返回類型的數據類型
  3. 調用
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])

結果圖:

End

參考:Python調用c++的動態dll中數據映射(Mat類型傳遞及結構體傳遞)


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved