安装 C++与 Python 绑定工具
pip install pybind11
这其实相当于使用 python 安装了一个 c++的库 pybind11,这个库只由头文件构成, 支持基础数据类型传递以及 python 的 numpy 和 c++的 eigen 库之间的自动转换。
编写 CMakeList.txt
cmake_minimum_required(VERSION 3.14)
project(demo)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 查找 pybind11
set(pybind11_DIR "/home/erge/work/python/venv/demo/lib/python3.10/site-packages/pybind11/share/cmake/pybind11") # 这里是 pybind11 的安装路径,一般在虚拟环境的site-packages里面
find_package(pybind11 REQUIRED)
find_package(Eigen3 REQUIRED)
# 如果你使用的是系统安装的 pybind11,也可以使用:
# find_package(pybind11 REQUIRED MODULE)# 包含头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${pybind11_INCLUDE_DIRS})
include_directories(${EIGEN3_INCLUDE_DIR})# 添加模块
pybind11_add_module(demo main.cc)
编写c++代码
创建一个名为 main.cc
的源文件,并添加以下内容:
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <vector>
#include <string>
#include <cmath>namespace py = pybind11;// 示例1: 简单函数
int add(int i, int j) {return i + j;
}// 示例2: 字符串操作函数
std::string greet(const std::string& name) {return "Hello, " + name + "!";
}// 示例3: C++ 类
class Calculator {
public:Calculator(double initial_value = 0.0) : value(initial_value) {}void add(double x) {value += x;}void multiply(double x) {value *= x;}double get_value() const {return value;}void set_value(double v) {value = v;}private:double value;
};// 示例4: 使用 STL 容器
std::vector<double> square_list(const std::vector<double>& input) {std::vector<double> result;result.reserve(input.size());for (const auto& item : input) {result.push_back(item * item);}return result;
}// 示例5: 数学计算函数
double calculate_distance(double x1, double y1, double x2, double y2) {double dx = x2 - x1;double dy = y2 - y1;return std::sqrt(dx * dx + dy * dy);
}// Python 绑定部分
PYBIND11_MODULE(demo, m) {m.doc() = "pybind11 示例模块"; // 模块文档字符串// 绑定简单函数m.def("add", &add, "两个整数相加",py::arg("i"), py::arg("j"));m.def("greet", &greet, "问候函数",py::arg("name") = "World");// 绑定数学函数m.def("calculate_distance", &calculate_distance, "计算两点间距离",py::arg("x1"), py::arg("y1"), py::arg("x2"), py::arg("y2"));// 绑定STL容器函数m.def("square_list", &square_list, "计算列表中每个元素的平方");// 绑定类py::class_<Calculator>(m, "Calculator").def(py::init<double>(), "构造函数", py::arg("initial_value") = 0.0).def("add", &Calculator::add, "加法操作", py::arg("x")).def("multiply", &Calculator::multiply, "乘法操作", py::arg("x")).def("get_value", &Calculator::get_value, "获取当前值").def("set_value", &Calculator::set_value, "设置当前值", py::arg("v")).def("__repr__", [](const Calculator& c) {return "<Calculator value=" + std::to_string(c.get_value()) + ">";});
}
python调用
使用上面的 CMakeLists.txt 和 main.cc 即可编译生成 demo.so 文件,接下来只要将这个 demo.so 文件添加到 python 的路径中,就可以在 python 中调用 C++ 函数了。
import sys
sys.path.append('/home/demo/build') # 添加 .so 所在路径
import demo # 引入 .so,调用 C++ 函数# 测试简单函数
print("=== 简单函数测试 ===")
result = demo.add(3, 4)
print(f"3 + 4 = {result}")greeting = demo.greet("Python")
print(greeting)# 测试数学函数
print("\n=== 数学函数测试 ===")
distance = demo.calculate_distance(0, 0, 3, 4)
print(f"点(0,0)到点(3,4)的距离: {distance}")# 测试STL容器
print("\n=== STL容器测试 ===")
numbers = [1.0, 2.0, 3.0, 4.0, 5.0]
squared = demo.square_list(numbers)
print(f"原列表: {numbers}")
print(f"平方后: {squared}")# 测试类
print("\n=== 类测试 ===")
calc = demo.Calculator(10.0)
print(f"初始值: {calc.get_value()}")calc.add(5)
print(f"加5后: {calc.get_value()}")calc.multiply(2)
print(f"乘2后: {calc.get_value()}")calc.set_value(100)
print(f"设置为100后: {calc.get_value()}")print(f"对象表示: {calc}")