推荐使用pybind11实现C++与Python交互,因其轻量、易用且支持现代C++特性;也可选Python C API进行底层控制,或用Boost.Python(较重);若需解耦则采用IPC方式。

在实际开发中,C++与Python的交互常用于提升性能关键部分的执行效率,或复用已有的C++库。实现两者互通的核心思路是:让Python能调用C++代码,或让C++能执行并获取Python结果。以下是几种主流且实用的方法。
1. 使用pybind11(推荐方式)
pybind11 是一个轻量级、头文件-only 的C++库,用于将C++代码暴露给Python。它语法简洁,支持智能指针、STL容器自动转换,非常适合现代C++项目。使用步骤:
- 安装 pybind11:
pip install pybind11或从GitHub克隆源码 - 编写C++代码,用 pybind11 定义绑定接口
- 编译为 Python 可导入的模块(.so 或 .pyd)
示例代码:
#includeint add(int a, int b) { return a + b; }
PYBIND11_MODULE(example, m) { m.def("add", &add, "A function that adds two numbers"); }
编译后,在Python中可直接使用:
立即学习“Python免费学习笔记(深入)”;
import example print(example.add(3, 4)) # 输出 7
优点:易用、高性能、支持类、异常、lambda等C++特性。
2. 使用Python C API(原生方式)
Python 提供了C语言级别的API,C++也可调用。虽然灵活,但代码繁琐,容易出错。基本流程:
- 包含 Python.h 头文件
- 初始化Python解释器(Py_Initialize)
- 运行Python代码或调用函数
- 处理对象引用,避免内存泄漏
示例片段:
#includeint main() { Py_Initialize(); PyRun_SimpleString("print('Hello from Python!')"); Py_Finalize(); return 0; }
适合需要深度控制Python解释器的场景,但不推荐初学者使用。
3. 使用Boost.Python
Boost.Python 是较早的C++/Python绑定方案,功能强大,但依赖整个Boost库,编译复杂,体积大。与 pybind11 接口相似,但配置更麻烦。例如:
#includeusing namespace boost::python; BOOST_PYTHON_MODULE(hello) { def("greet", [](){ return "Hi"; }); }
目前多数新项目更倾向使用 pybind11,因其更轻便、无需编译Boost。
4. 通过进程间通信(IPC)间接交互
当不需要高频调用时,可用子进程、socket、共享内存等方式让C++和Python独立运行并通信。常见做法:
- C++程序启动Python脚本,通过stdin/stdout交换数据
- 使用JSON或Protobuf格式传递结构化信息
- 通过本地Socket或命名管道实现双向通信
优点:语言完全解耦,便于调试和部署;缺点:有进程开销,不适合实时性要求高的场景。
基本上就这些。选择哪种方式取决于项目需求:追求简单高效用 pybind11,需精细控制用 C API,系统分离则考虑 IPC。主流推荐 pybind11,上手快,维护方便。











