当前位置: 首页 > 后端技术 > Python

混合编程:如何使用python11调用C++

时间:2023-03-26 12:10:14 Python

摘要:在实际的开发过程中,难免会涉及到混合编程。比如python这样的脚本语言,性能还是有限的。在一些对性能要求很高的场景下,还是需要使用c/c++来完成。如何?我们可以使用pybind11作为桥梁。pybind11的优点是对C++11的支持很好,API比较简单。下面我们简单记下Pybind11的入门操作。一、pybind11介绍及环境安装Pybind11是一个用于Python和C++接口转换的轻量级header-only库,可以为已有的C++代码创建Python接口绑定。Pybind11在编译C++时通过内省推断类型信息,以在扩展传统Python模块时最大限度地减少复杂的样板代码。实现了STL数据结构、智能指针、类、函数重载、实例方法到Python的转换。其中,函数可以接收和返回自定义数据类型的值、指针或引用。直接使用pip安装pip3installpybind11由于pybind11依赖pytest,所以在安装pip3installpytest2之前需要先安装pytest。Sum函数首先,我们编写一个名为example.cpp的C++源文件。//pybind11头文件和命名空间#includenamespacepy=pybind11;intadd(inti,intj){returni+j;}PYBIND11_MODULE(example,m){//可选,解释什么这个模块执行m.doc()="pybind11exampleplugin";//def("调用python的方法名",&实际运行的函数,"函数说明").函数描述可用Selectm.def("add",&add,"Afunctionwhichaddstwonumbers",py::arg("i")=1,py::arg("j")=2);}PYBIND11_MODULE()宏函数将创建一个函数,该函数将在Python发出导入语句时调用。模块名称“example”,由宏的第一个参数指定(不得出现在引号中)。第二个参数“m”定义了py::module的一个变量。函数py::module::def()生成绑定代码,将add()函数暴露给Python。我们使用CMake来编译。先写一个CMakeLists.txt。cmake_minimum_required(VERSION2.8.12)project(example)add_subdirectory(pybind11)pybind11_add_module(exampleexample.cpp)是CMakeList.txt和example.cpp放在一个目录下。cmake.make将生成example.cpython-36m-x86_64-linux-gnu.so文件。这个文件就是python可以调用的文件。还是在同一个目录下运行python,输入python命令行importexampleexample.add(3,4)[out]:73.STL与python内置数据类型的对应关系在使用python编程时,往往会用到内置容器作为函数,python语言的参数和返回值让我们的程序变得非常灵活和容易理解。那么在使用pybind11封装C++实现的函数时如何保留这个特性呢?本文介绍pybind11如何实现list和dict作为参数和返回值。返回vector//文件名:func.cpp#include"func.h"vectorlist_square(vector&in_list,vector&out_list){vector::iteratoriter;for(iter=in_list.begin();iter!=in_list.end();iter++){out_list.push_back(*iter**iter);}返回输出列表;}mapdict_square(map&in_dict,map&out_dict){map::iteratoriter;iter=in_dict.begin();while(iter!=in_dict.end()){out_dict.insert({iter->first,iter->second*iter->second});迭代器++;}返回out_dict;}写pybind11封包数//文件名:func_wrapper.cpp#include#include#include"func.h"PYBIND11_MODULE(square,m){m.doc()="平方容器的成员";m.def("list_square",&list_square);m.def("dict_square",&dict_square);}returnstruct#include#includestructFoo{std::stringa;};voidshow(Foof){std::cout<(m,"Foo").def_readwrite("a",&Foo::a);returnm.ptr();}writepybind11packagefunctionimportsyssys.path.append(".")importexampleb=example.Foob.a="Hello"example.show(b)另外:提供一些常用的参考链接pybind11—C++11与Python无缝衔接python调用C++的pybind11入门python调用c++工具-pybind11基于pybind11实现Python调用c++编写的CV算法-(Linux+Cmake)跟我学传值,其中之一pybind11#161pybind11封装的函数实现内置容器为参数和返回值SNHer点击关注,第一时间了解华为云的新鲜技术~