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_MODULE 宏定义模块入口
  • C++ 函数本身无需修改,直接在绑定代码里用 m.def() 暴露出去
  • 编译需启用 C++11 或更高标准(-std=c++11),并链接 pybind11 的构建系统(推荐用 cmake + find_package(pybind11)
/* example.cpp */
#include 

int add(int a, int b) { return a + b; }

PYBIND11_MODULE(example, m) { m.doc() = "pybind11 example plugin"; m.def("add", &add, "A function that adds two integers"); }

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

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

  • std::vectorstd::stringstd::map 等可直接作为参数或返回值,无需额外声明
  • 返回 std::vector 时,Python 侧拿到的是 list;传入 list 也会自动转为 std::vector
  • 若想避免拷贝(例如只读访问大数组),可用 pybind11::array_tpybind11::buffer,配合 NumPy 使用
/* vector_example.cpp */
#include 
#include  // 必须包含此头文件以支持 STL 容器自动转换
#include 

std::vector get_range(int n) { std::vector v(n); for (int i = 0; i < n; ++i) v[i] = i; return v; }

PYBIND11_MODULE(vector_example, m) { m.def("get_range", &get_range); }

编译时常见错误有哪些?

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

Replit Ghostwrite
Replit Ghostwrite

一种基于 ML 的工具,可提供代码完成、生成、转换和编辑器内搜索功能。

下载

立即学习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_(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)不需要操心这个。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

772

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

661

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

764

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

679

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1365

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

569

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

730

2023.08.11

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

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

精品课程

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

共48课时 | 7.6万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

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

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