一个pybind11的例子
在当前文件夹下安装pybind11后,第一步,编写CPP文件
1、cpp_sources/data_processor.h
#include <random> #include <vector> class DataProcessor { public: DataProcessor() = default; void setData(std::vector<int> input_data); int process(); private: std::vector<int> data_; };
2、cpp_sources/data_processor.cpp
#include "data_processor.h" #include <numeric> void DataProcessor::setData(std::vector<int> input_data) { data_ = std::move(input_data); } int DataProcessor::process() { return std::accumulate(data_.begin(), data_.end(), 0); }
3、pybind_cpp_sources.cpp
#include <pybind11/detail/common.h> #include <pybind11/pybind11.h> #include <pybind11/stl.h> #include "cpp_sources/data_processor.h" namespace py = pybind11; PYBIND11_MODULE(pybind_cpp_module, m) { py::class_<DataProcessor>(m, "DataProcessor") .def(py::init()) .def("setData", &DataProcessor::setData) .def("process", &DataProcessor::process); }
第二步,编写Python文件
1、python_sources/data_processor.py
import random class DataProcessor: def __init__(self): self.data = list() self.random_seed = 0 def set_data(self, input_data: list) -> None: self.data = input_data def process(self) -> int: return sum(self.data)
2、python_sources/__init__.py,该文件为空即可。
3、python_interface.py
import pybind_cpp_module import python_sources.data_processor input_data = list(range(10)) cpp_data_processor = pybind_cpp_module.DataProcessor() cpp_data_processor.setData(input_data) print("C++ data processor output: {}".format(cpp_data_processor.process())) python_data_processor = python_sources.data_processor.DataProcessor() python_data_processor.set_data(input_data) print("Python data processor output: {}".format(python_data_processor.process()))
第三步,编写编译文件CMakeLists.txt
cmake_minimum_required(VERSION 3.5) project(example LANGUAGES CXX) set(SOURCES cpp_sources/data_processor.cpp) add_subdirectory(pybind11) pybind11_add_module(pybind_cpp_module pybind_cpp_sources.cpp ${SOURCES})
第四步,编译运行:
cmake . && make python python_interface.py