Python调用C++动态库(dll)进行测试----pybind11

    Python与C++之间互相调用有很多方法,比如著名的boost.python、pybind11等。本次的需求是使用Python调用C++封装好的动态库进行大规模测试,调研的方式为pybind11。

任务目的:测试几个dll文件。

技术路线:使用VS+pybind11生成.pyd文件,Python调用.pyd进行结果分析。

1.安装环境

    参照博客https://blog.csdn.net/thisisfangsheng/article/details/75610558进行环境的安装。公司使用的编译环境为VS2015和PY3.7,所以省略了这部分环境的安装。

   但是需要安装pybind11。安装很简单,从GitHub下载https://github.com/pybind/pybind11.git代码。放到本地目录即可。

2.生成中间文件

    按照博客https://www.jianshu.com/p/9619f8f02891内容搭建VS2015工程,工程名称就是后面测试时Python模块的名称。设置include路径、lib路径,链接库(包括Python的lib库和需要测试的库)等。

    C++的接口有很多是通过形参传出结果的,Python不支持这么写。所以需要将那些需要从形参传出的函数重新封装一下。

比如dll库中有一个函数:

void getAlgoVersion(char *version)要改成 char *getAlgoVersion()

如果形参是一个结构体,那么就改成字典的方式传出:

struct students

{

int ages;

float score;

sreing name;

}

 

void getsutdents(struct students);

改成

auto getsutdents()

{

students lihua;

/**********

code****

**********/

py::dict studentdict;

studentdict["ages"]=lihua.ages;

studentdict["score"]=lihua.score;

studentdict["name"]=lihua.name;

return studentdict;

}

主函数:

#include <pybind11/pybind11.h>
namespace py = pybind11;
using namespace std;

PYBIND11_MODULE(Testdll, m)//Testdll必须与工程名称相同
{

   m.def("getsutdents", getsutdents, "A function eval iris"); 

}

编译之后即可生成Testdll.pyd。

3.python调用

import Testdll

print (Testdll.getsutdents())

即可得到输出,输出是一个字典格式,便于后续分析数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值