在 python 中调用 c++ 库,通常有以下几种方式:
1. 实现方式
1. 使用 ctypes
适用于 c 风格的函数接口。可以用于调用编译为 `.so`(linux)或 `.dll`(windows)的库。
步骤:
1. 将 c++ 编译为动态链接库,并使用 `extern "c"` 导出函数。
2. 在 python 中使用 `ctypes` 加载并调用这些函数。
示例:c++ 文件 (add.cpp)
// add.cpp
#include <iostream>
extern "c" {
int add(int a, int b) {
return a + b;
}
}编译成共享库
g++ -shared -fpic -o libadd.so add.cpp
python 调用代码
import ctypes
# 加载 dll/so
lib = ctypes.cdll('./libadd.so')
# 设置参数类型和返回值类型(可选但推荐)
lib.add.argtypes = [ctypes.c_int, cypes.c_int]
lib.add.restype = ctypes.c_int
result = lib.add(3, 4)
print("result from c++:", result) # 输出: result from c++ :72. 使用 cffi 或 c扩展模块
- cffi: 更现代的 ffi 方法,支持 c 接口。
- 编写 c/c++ 扩展模块:适合性能关键部分。
不如 pybind11 简洁,这里略过。
3. 使用 pybind11
最推荐的方式,专为 python 和 c++ 混合编程设计,功能强大且简洁。
步骤:
1. 安装 pybind11:
pip install pybind11
2. 写一个封装了 c++ 的绑定文件。
3. 编译生成 `.pyd` 或 `.so` 文件供 python import。
示例:c++ 文件 (example.cpp)
#include <pybind11/pybind11.h>
int add(int i, int j) {
return i + j;
}
pybind11_module(example, m) {
m.def("add", &add, "a function that adds two numbers");
}编译方法 1:使用命令行
c++ -o3 -wall -shared -std=c++11 -fpic `python3 -m pybind11 --includes` example.cpp -o example$(python3-config --extension-suffix)
python 调用
import example print(example.add(3, 4)) # 输出: 7
4. 使用 swig
适合大型项目,但学习成本稍高。
小结

2. 使用pybind11封装一个c++类
使用 pybind11 封装 c++ 类是一个相对直接的过程,它允许你将 c++ 类暴露给 python 代码。下面我将展示如何使用 pybind11 来封装一个简单的 c++ 类。
示例
假设我们有一个简单的 c++ 类 rectangle,它有两个方法:计算矩形的面积和周长。
c++ 文件 (rectangle.cpp)```cpp
#include <pybind11/pybind11.h>
namespace py = pybind11;
class rectangle {
public:
rectangle(double width, double height) : width_(width), height_(height) {}
double area() const {
return width_ * height_;
}
double perimeter() const {
return 2 * (width_ + height_);
}
private:
double width_, height_;
};
pybind11_module(rectangle_module, m) {
py::class_<rectangle>(m, "rectangle") // 绑定类
.def(py::init<double, double>()) // 绑定构造函数
.def("area", &rectangle::area) // 绑定成员函数
.def("perimeter", &rectangle::perimeter); // 绑定成员函数
}在这个例子中:
- py::class_<rectangle> 定义了要暴露给 python 的 c++ 类。
- .def(py::init<double, double>()) 指定了如何创建这个类的对象(即它的构造函数)。
- .def("area", &rectangle::area) 和 .def("perimeter", &rectangle::perimeter) 分别绑定了类的方法 area 和 perimeter 到 python 中。
python 调用
一旦编译完成,你就可以像导入任何其他 python 模块一样导入并使用这个新模块:
import rectangle_module
rect = rectangle_module.rectangle(5, 4)
print(f"area: {rect.area()}") # 输出: area: 20
print(f"perimeter: {rect.perimeter()}") # 输出: perimeter: 183.windows 上配置环境
准备工作
1. 安装 visual studio:确保你已经安装了 visual studio,并且包含“使用 c++ 的桌面开发”工作负载。
2. 安装 python:下载并安装适合你项目的 python 版本。
3.下载pybind11库,这是一个仅包含头文件的轻量级库,使用起来非常方便。可以在github下载其release版本 pybind11 可以参考:官方文档
配置 visual studio 项目
1. 创建一个新的空项目。
2. 添加源文件:将上述 c++ 代码保存为 `example.cpp` 并添加到你的 visual studio 项目中。
3. 配置项目属性:
- c/c++ -> 常规 -> 附加包含目录:添加 pybind11/include 的路径,以及 python 的 include 目录。
- 链接器 -> 常规 -> 附加库目录:添加 python 的 lib 目录路径。
- 链接器 -> 输入 -> 附加依赖项:添加 pythonxy.lib(其中 xy 是你的 python 版本号,例如 python39.lib 对于 python 3.9)。
4. 设置输出类型:右键点击项目 -> 属性 -> 配置属性 -> 常规 -> 配置类型,选择“动态库(.dll)”。
5. 编译项目:选择合适的配置(debug 或 release),然后编译项目。确保在项目属性中将目标扩展名设置为 .pyd(这是 python 在 windows 上使用的扩展名),或者生成的 .dll 文件需要重命名为 .pyd ,其才能被 python 正确识别。
这样,你就成功地在 windows 上使用 python 调用了 c++ 库。通过这种方式,你可以将复杂的 c++ 功能集成到 python 应用程序中。对于更复杂的项目或类的封装,逻辑大致相同,但可能需要更多的细节配置。
到此这篇关于python如何实现简单调用c++库的文章就介绍到这了,更多相关python调用c++库内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论