python结构体数组传出接收c动态库 swig_使用pybind11封装C++结构体作为参数的函数实现步骤...

本文介绍了如何使用pybind11将C++结构体`student`封装成Python模块,包括结构体定义、成员函数、封装过程、setup脚本创建以及测试。通过这个例子,读者可以学习到将C++结构体作为参数的函数在Python中调用的方法。
摘要由CSDN通过智能技术生成

python调用C/C++有不少的方法,如boost.python, swig, ctypes, pybind11等,这些方法有繁有简,而pybind11的优点是对C++ 11支持很好,API比较简单,现在我们就简单记下Pybind11的入门操作。

pybind11简介

pybind11是一个轻量级的只包含头文件的库,它主要是用来在已有的 C++代码的基础上做扩展,它的语法和目标非常像Boost.Python,但Boost.Python为了兼容现有的基本所有的C++编译器而变得非常复杂和庞大,而因此付出的代价是很多晦涩的模板技巧以及很多不必要的对旧版编译器的支持。Pybind11摒弃了这些支持,它只支持python2.7以上以及C++ 11以上的编译器,使得它比Boost.Python更加简洁高效。

在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

结构体、结构体指针作为函数的参数应用的非常广泛,本文介绍如何使用pybind11封装C++结构体作为参数的函数。

一.需求分析

现有名为 student 的结构体,有5个成员变量 name,Chinese,Mathematics,English和total ,构造函数通过name生成实例,成员函数 setName 可以给实例的name赋值;

calc 函数接收一个student实例作为参数,通过三门课程的分数计算出总分 total ;

将student,calc封装到包含一个student类和一个calc函数的python模块( abctest )中。

二.实现步骤

在头文件中定义student结构体,并声明calc函数;

在C++源文件中实现func.cpp函数;

编写pybind11封装函数;

用python编写setup脚本;

编译生成动态链接库;

测试函数功能。

三.代码实现

在头文件中定义student结构体,并声明calc函数

//文件名:whjy.h

#include

using namespace std;

struct student{

string name;

int Chinese;

int Mathematics;

int English;

int total;

student(string n){

this->name = n;

}

void setName(string stuName){

this->name = stuName;

}

};

void calc(struct student&);

在C++源文件中实现func.cpp函数

//文件名:func.cpp

#include "whjy.h"

#include

void calc(struct student& tyh){

tyh.total = tyh.Chinese + tyh.Mathematics + tyh.English;

}

编写pybind11封装函数

//文件名:func_wrapper.cpp

#include

#include "whjy.h"

namespace py = pybind11;

PYBIND11_MODULE(abctest, m){

m.doc() = "simple example";

py::class_(m, "student")

.def(py::init())

.def("setName", &student::setName)

.def_readonly("name", &student::name)

.def_readwrite("Chinese", &student::Chinese)

.def_readwrite("Mathematics", &student::Mathematics)

.def_readwrite("English", &student::English)

.def_readwrite("total", &student::total);

m.def("calc", &calc);

}

用python编写setup脚本

#文件名:setup.py

from setuptools import setup, Extension

functions_module = Extension(

name = 'abctest',

sources = ['func.cpp', 'func_wrapper.cpp'],

include_dirs = [r'D:\software\pybind11-master\include',

r'D:\software\Anaconda\include']

)

setup(ext_modules = [functions_module])

编译生成动态链接库

在命令行执行 python setup.py build_ext --inplace,在当前路径下生成pyd动态库。

测试函数功能

#文件名:test.py

import abctest

s = abctest.student("小明")

s.Chinese = 100

s.Mathematics = 110

s.English =120

abctest.calc(s)

print(s.name + ":" + str(s.total) + "分")

print("----------------------")

s.setName("小红")

print(s.name + ":" + str(s.total) + "分")

output:

小明:330分

----------------------

小红:330分

总结

到此这篇关于使用pybind11封装C++结构体作为参数的函数的实现步骤的文章就介绍到这了,更多相关pybind11封装C++结构体参数函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

pybind11是一个用于将C++代码绑定到Python的库,使得在Python中能够调用C++函数使用C++数据结构。在pybind11中,可以使用结构体来传递参数。 要在pybind11中传递结构体参数,首先需要定义一个C++结构体结构体可以定义在C++代码中,然后使用pybind11的`py::init`函数来注册。在注册结构体时,可以指定结构体的成员变量的名称和类型。 接下来,在Python代码中,可以通过调用C++结构体的构造函数来创建一个结构体对象。通过将结构体对象作为参数传递给C++代码或函数,可以在Python使用这些结构体。 在C++代码中,可以通过在函数参数中指定结构体类型,并使用结构体的成员变量来访问结构体的数据。然后,在Python中调用这个C++函数时,可以传入一个结构体对象作为参数。 例如,假设有一个C++结构体定义如下: ```c++ struct Point { int x; int y; }; ``` 然后,在pybind11中,可以注册这个结构体,并定义一个使用结构体作为参数C++函数: ```c++ #include <pybind11/pybind11.h> #include <pybind11/stl.h> #include <iostream> namespace py = pybind11; struct Point { int x; int y; }; void print_point(Point p) { std::cout << "x: " << p.x << ", y: " << p.y << std::endl; } PYBIND11_MODULE(example, m) { py::class_<Point>(m, "Point") .def(py::init<>()) .def_readwrite("x", &Point::x) .def_readwrite("y", &Point::y); m.def("print_point", &print_point); } ``` 在Python中,可以使用这个结构体函数: ```python import example p = example.Point() p.x = 10 p.y = 20 example.print_point(p) ``` 这样就可以在Python使用结构体作为函数参数,并传递给C++代码。在C++代码中,可以通过访问结构体的成员变量来获取结构体的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值