0

0

c++代码如何与Python进行交互? (pybind11基础教程)

冰火之心

冰火之心

发布时间:2026-01-22 18:15:19

|

791人浏览过

|

来源于php中文网

原创

pybind11是C++与Python交互最轻量主流方案,通过PYBIND11_MODULE声明模块、m.def()绑定函数、编译为.so/.pyd实现调用;支持STL类型自动转换,类绑定需pybind11::class_。

c++代码如何与python进行交互? (pybind11基础教程)

pybind11 是目前 C++ 与 Python 交互最轻量、最主流的选择——它不依赖 Python C API 的底层细节,编译快,接口写法接近 Python 原生风格,且头文件即用,无需链接庞大库。

怎么让 Python 调用 C++ 函数?

核心是用 pybind11 将 C++ 函数“绑定”为 Python 可导入的模块。关键步骤:声明模块、注册函数、编译成 .so(Linux/macOS)或 .pyd(Windows)。

  • 必须包含 #include <pybind11/pybind11.h>,并用 PYBIND11_MODULE 宏定义模块入口
  • C++ 函数本身无需修改,直接在绑定代码里用 m.def() 暴露出去
  • 编译需启用 C++11 或更高标准(-std=c++11),并链接 pybind11 的构建系统(推荐用 cmake + find_package(pybind11)
/* example.cpp */
#include <pybind11/pybind11.h>
<p>int add(int a, int b) {
return a + b;
}</p><p>PYBIND11_MODULE(example, m) {
m.doc() = "pybind11 example plugin";
m.def("add", &add, "A function that adds two integers");
}

如何传递和返回复杂类型(比如 std::vector)?

pybind11 自动支持常见 STL 类型的转换,但默认是值传递(拷贝),对大对象可能影响性能;若需零拷贝或原地修改,得显式控制。

  • std::vector<int>std::stringstd::map 等可直接作为参数或返回值,无需额外声明
  • 返回 std::vector 时,Python 侧拿到的是 list;传入 list 也会自动转为 std::vector
  • 若想避免拷贝(例如只读访问大数组),可用 pybind11::array_t<float>pybind11::buffer,配合 NumPy 使用
/* vector_example.cpp */
#include <pybind11/pybind11.h>
#include <pybind11/stl.h> // 必须包含此头文件以支持 STL 容器自动转换
#include <vector>
<p>std::vector<int> get_range(int n) {
std::vector<int> v(n);
for (int i = 0; i < n; ++i) v[i] = i;
return v;
}</p><p>PYBIND11_MODULE(vector_example, m) {
m.def("get_range", &get_range);
}

编译时常见错误有哪些?

多数问题出在环境路径、Python 版本不匹配或 CMake 配置遗漏,不是代码逻辑问题。

靠岸学术
靠岸学术

一款集翻译,阅读,文献管理于一体的英文文献阅读器

下载

立即学习Python免费学习笔记(深入)”;

  • ImportError: dynamic module does not define module export function:模块名与 PYBIND11_MODULE 第一个参数不一致,或编译后文件名不是 xxx.cpython-*.so 形式(建议用 set_target_properties(... PROPERTIES PREFIX "") 清除前缀)
  • undefined symbol: _Py_ZeroStruct:链接了错误的 Python 库(比如系统 Python 和 conda Python 混用),检查 cmake -DPYTHON_EXECUTABLE 是否指向你实际运行 python 的那个解释器
  • Windows 下报 LNK2001: unresolved external symbol PyInit_xxx:没加 __declspec(dllexport)?不用——pybind11 已通过宏处理,只需确认项目属性中“配置类型”是 Dynamic Library (.dll),且输出扩展名为 .pyd

要不要用 pybind11::class_ 绑定 C++ 类?

要,而且非常值得。相比纯函数,类绑定能自然映射面向对象逻辑,支持构造、析构、成员函数、属性、重载操作符等。

  • pybind11::class_<MyClass>(m, "MyClass") 声明绑定类
  • .def(pybind11::init<>()) 绑定构造函数;.def("method", &MyClass::method) 绑定成员函数
  • 成员变量用 .def_readwrite("name", &MyClass::name);只读用 def_readonly
  • 注意:C++ 对象生命周期由 Python 引用计数管理,除非显式用 pybind11::return_value_policy 控制,否则默认按值返回会触发拷贝

真正容易被忽略的是 Python 解释器初始化状态——如果你在已有 Python 进程中(比如嵌入式场景)加载 pybind11 模块,确保 PyEval_InitThreads()(旧版)或 GIL 管理已就绪;而绝大多数情况(直接运行 python script.py)不需要操心这个。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1031

2023.08.02

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

595

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

108

2025.10.23

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

119

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

390

2023.10.11

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

58

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

63

2025.11.27

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1031

2023.08.02

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.6万人学习

Git 教程
Git 教程

共21课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号