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())
即可得到输出,输出是一个字典格式,便于后续分析数据。