一個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

浙公網安備 33010602011771號