用pybind11封裝C++結構體做爲參數的函數

在C語言中,結構體(struct)指的是一種數據結構,是C語言中聚合數據類型(aggregate data type)的一類。結構體能夠被聲明爲變量、指針或數組等,用以實現較複雜的數據結構。結構體同時也是一些元素的集合,這些元素稱爲結構體的成員(member),且這些成員能夠爲不一樣的類型,成員通常用名字訪問。python

結構體、結構體指針做爲函數的參數應用的很是普遍,本文介紹如何使用pybind11封裝C++結構體做爲參數的函數。數組

一.需求分析

  • 現有名爲student的結構體,有5個成員變量name,Chinese,Mathematics,English和total,構造函數經過name生成實例,成員函數setName能夠給實例的name賦值;
  • calc函數接收一個student實例做爲參數,經過三門課程的分數計算出總分total;
  • 將student,calc封裝到包含一個student類和一個calc函數的python模塊(abctest)中。

二.實現步驟

  1. 在頭文件中定義student結構體,並聲明calc函數;
  2. 在C++源文件中實現func.cpp函數;
  3. 編寫pybind11封裝函數;
  4. 用python編寫setup腳本;
  5. 編譯生成動態連接庫;
  6. 測試函數功能。

三.代碼實現

  • 在頭文件中定義student結構體,並聲明calc函數
//文件名:whjy.h
#include <string>  
  
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 <string>  
  
void calc(struct student& tyh){  
    tyh.total = tyh.Chinese + tyh.Mathematics + tyh.English;  
}
  • 編寫pybind11封裝函數
//文件名:func_wrapper.cpp
#include <pybind11/pybind11.h>  
#include "whjy.h"  
  
namespace py = pybind11;  
  
PYBIND11_MODULE(abctest, m){  
    m.doc() = "simple example";  
  
    py::class_<student>(m, "student")  
        .def(py::init<string>())  
        .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分app

相關文章
相關標籤/搜索