安裝 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}")