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

pybind11封装的函数实现内建容器作为参数及返回值

时间:2023-03-26 01:48:16 Python

pybind11封装的函数实现内置容器作为参数和返回值,简单易懂。那么在使用pybind11封装C++实现的函数时如何保留这个特性呢?本文介绍pybind11如何实现list和dict作为参数和返回值。一、C++STL与python内置数据类型的对应关系C++STLPythonstd::vectorliststd::arrayliststd::mapdictstd::setset二、需要注意的问题为了使C++函数能够返回向量对象,向量容器必须是returned一般放在函数参数中,下面两种方式在某些情况下可以达到同样的效果,但是推荐第二种方式。因为如果使用前一种方法,而类的对象存放在vector中,函数返回时会调用相关类的析构函数。所以如果vector是局部变量,返回vector的引用是非常危险的,因为vector已经被析构了。返回地图对象是一样的。矢量fun1(intnum){矢量值;for(intj=0;jfun1(intnum,vector&values){for(intj=0;j#include#includeusingnamespacestd;矢量<长>list_square(矢量<长>&,矢量<长>&);mapdict_square(map&,map&);用C++编写两个函数//文件名: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);}用python编写安装脚本#Filename:setup.pyfromsetuptoolsimportsetup,Extensionfunctions_module=Extension(name='square',sources=['func.cpp','func_wrapper.cpp'],include_dirs=[r'D:\software\pybind11-master\include',r'D:\software\Anaconda\include'])setup(ext_modules=[functions_module])编译生成动态链接库执行pythonsetup.pybuild_ext--inplaceon命令行在当前路径生成pyd动态库测试函数function#filename:test.pyimportsquarein_list=[30,40,50]out_list=list()out_list=square.list_square(in_list,out_list)print(out_list)print("-"*45)in_dict={"小明":30,"小红":40,"小华":50}out_dict=dict()out_dict=square.dict_square(in_dict,out_dict)print(out_dict)output:[900,1600,2500]----------------------------------------------{'小花':2500,'小花'明':900,'小红':1600}