Python通过cytps调用C/C++动态库获取二维数组

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调用的问题。网上有很多教程。这里知识记录查不到的知识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值