网站开发背景图,苏州软件公司排行榜,网站文件名优化,做网站用asp还是php安装 C与 Python 绑定工具
pip install pybind11这其实相当于使用 python 安装了一个 c的库 pybind11,这个库只由头文件构成#xff0c; 支持基础数据类型传递以及 python 的 numpy 和 c的 eigen 库之间的自动转换。
编写 CMakeList.txt
cmake_minimum_required(VERSION 3.14)…安装 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 cmathnamespace 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::vectordouble square_list(const std::vectordouble input) {std::vectordouble 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::initdouble(), 构造函数, 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(f3 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})