Python通过cytps调用C/C++动态库获取二维数组
注意下面
如果有车载讨论需要的小伙伴,可以私信加我微信
,拉你进群,和同行业大佬交流
注意上面
前言
最近开发的Python工具有部分实现需要算法帮忙实现,找了算法同事实现了,但是因为是C++写的。只有两条路选择,要么手动改写转.py的。要么通过ctypes进行调用。为了偷懒,还是用用了后者,本篇主要记录具体实现方法,防止后面忘记
一、先把C++代码打包成DLL文件
1.C++的编译环境网上大把,先安装编译环境
2.在代码所在路径执行以下指令g++ -shared test_id.cpp test_id.h -o test.dll
,会在当前目录生成一个test.dll的动态库文件
二、Ctypes调用test.dll
1.测试CPP文件
代码如下(示例):
#include"ctypes_test.h" //头文件名称
myconfig p = (myconfig)malloc(sizeof(config));
std::vector<std::vector<int>> obj1; //构建一个vector二维整形集合
std::vector<int> obj2(1000,1); //构建一个vector一维整形集合(1000个1)
std::vector<int> obj3(999,2);
std::vector<int> obj4(1001,3);
void getdata(){
obj1.push_back(obj2); //将vector整形集合放进到二维vector集合里
obj1.push_back(obj3);
obj1.push_back(obj4);
}
myconfig retn_data(){
getdata();
p->one_len = obj1.size(); //获取二维集合里有多少个集合
for(int i=0;i<p->one_len;i++){
p->two_list[i] = obj1[i].size(); //获取二维集合里的子集合长度,并存进two_list中
}
for(int n=0;n<obj1.size();n++){ //将二维集合的数据存储到temp_data这个二维整形数组中去
for(int m=0;m<obj1[n].size();m++){
p->temp_data[n][m] = obj1[n][m];
}
}
return p;
}
2.测试h文件
代码如下(示例):
#include <vector>
#include <string>
typedef struct config{ #定义一个结构体
int temp_data[80][1100] = {0}; //用以存储vector二维数组
int two_list[100] = {0}; //二维数组中每个一位数组的长度
int one_len = {0}; //存储二维数组元素个数
}config, *myconfig;
extern "C" {
myconfig retn_data();
}
3.测试py文件
代码如下(示例):
from ctypes import *
class redata(Structure):
_fields_ = [("temp_data",c_int*1100*80), #定义一个和.h文件一样的结构体
("two_list",c_int*100),
("one_len",c_int)]
def check_data():
dll = CDLL('ctypes_test.dll', winmode=0) #加载DLL文件
dll.retn_data.restype = POINTER(redata) #确定函数返回的类型是redata类型的指针
tempdata = dll.retn_data()
onelen = tempdata.contents.one_len
print(onelen)
twolist = []
for i in range(onelen): #获取二维数组的长度
twolist.append(tempdata.contents.two_list[i])
for m in range(onelen):
templ = []
for t in range(twolist[m]): #获取二维数组的内容
templ.append(tempdata.contents.temp_data[m][t])
print(len(templ))
check_data()
重点标记!!!! Python文件中结构体类型一定要和.h文件中一致,否则会存在问题
总结
这个笔记知识描述其中一种通过结构体的方法获取dll动态数组的方法,其他ctypes调用的问题。网上有很多教程。这里知识记录查不到的知识