c++和python联合编程示例
·
安装 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}")
更多推荐
所有评论(0)