新闻中心

C++怎么编写Python的C++扩展模块_C++与Python混合编程之Pybind11

2025-11-21
浏览次数:
返回列表
Pybind11是目前最简洁高效的C++编写Python扩展模块的工具,通过极少量代码即可将C++函数、类、STL容器等暴露给Python。使用PYBIND11_MODULE定义模块,m.def()导出函数,py::class_封装类,配合#include 实现vector、map等自动转换。通过CMake构建生成.so或.pyd文件后,可在Python中如原生模块般调用,显著提升性能,适用于算法加速与C++项目集成。

c++怎么编写python的c++扩展模块_c++与python混合编程之pybind11

要用C++编写Python扩展模块,Pybind11 是目前最简洁高效的工具之一。它允许你用极少量的C++代码将C++类、函数、对象暴露给Python,实现高性能混合编程。相比传统的 Python C API 或 Boost.Python,Pybind11 更轻量、易用且功能强大。

安装 Pybind11

Pybind11 可以通过 pip 安装,也可以作为头文件直接集成到项目中:

pip install pybind11

安装后,你可以包含其头文件来使用。如果你使用 CMake,推荐方式是通过 find_package(pybind11) 集成。

编写第一个 C++ 扩展模块

下面是一个简单的例子,将一个 C++ 函数导出为 Python 模块:

example.cpp:

#include <pybind11/pybind11.h>
<p>int add(int a, int b) {
return a + b;
}</p><p>namespace py = pybind11;
PYBIND11_MODULE(example, m) {
m.doc() = "pybind11 example plugin";
m.def("add", &add, "A function that adds two numbers");
}

这里:
- PYBIND11_MODULE 定义了一个名为 example 的 Python 模块。
- m.def() 将 C++ 函数 add 绑定为 Python 可调用函数。

编译生成 Python 模块

有几种方式可以编译这个模块。最简单的是使用 pybind11 提供的工具链。

使用 CMake 编译(推荐):

CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(example)
<p>find_package(pybind11 REQUIRED)</p><p>pybind11_add_module(example example.cpp)

然后执行:

mkdir build
cd build
cmake ..
make

成功后会生成 example.cpython-xxx.so(Linux)或 example.pyd(Windows),可在 Python 中直接 import。

CA.LA CA.LA

第一款时尚产品在线设计平台,服装设计系统

CA.LA 94 查看详情 CA.LA

在 Python 中使用扩展模块

编译完成后,在 Python 中像普通模块一样导入:

import example
print(example.add(3, 4))  # 输出: 7

你会发现这个函数和原生 Python 函数一样调用自然,但底层是 C++ 实现,性能更高。

导出 C++ 类到 Python

Pybind11 支持完整封装 C++ 类。例如:

#include <pybind11/pybind11.h>
<p>class MyClass {
public:
MyClass(const std::string &name) : name(name) {}
void set_name(const std::string &n) { name = n; }
std::string get_name() const { return name; }
private:
std::string name;
};</p><p>namespace py = pybind11;
PYBIND11<em>MODULE(example, m) {
py::class</em><MyClass>(m, "MyClass")
.def(py::init<const std::string &>())
.def("set_name", &MyClass::set_name)
.def("get_name", &MyClass::get_name);
}

在 Python 中使用:

obj = example.MyClass("test")
print(obj.get_name())  # 输出: test
obj.set_name("hello")
print(obj.get_name())  # 输出: hello

构造函数、成员方法都可直接绑定,支持重载、属性访问等高级特性。

处理复杂类型与 STL 容器

Pybind11 支持自动转换常见 STL 类型。需包含对应头文件:

#include <pybind11/stl.h>

之后,C++ 的 std::vectorstd::stringstd::map 等会自动转换为 Python 的 list、str、dict。

例如:

std::vector<int> get_numbers() {
    return {1, 2, 3, 4};
}
<p>m.def("get_numbers", &get_numbers);

Python 调用时返回的就是 list。

基本上就这些。Pybind11 让 C++ 与 Python 混合编程变得非常直观。只要写好 C++ 逻辑,几行绑定代码就能在 Python 中高速调用,适合算法加速、接口封装、已有 C++ 项目集成等场景。

以上就是C++怎么编写Python的C++扩展模块_C++与Python混合编程之Pybind11的详细内容,更多请关注其它相关文章!


# 是一个  # 关键词排名哪家见效快  # 推广网站怎么介绍好看  # 展会网站怎么推广好呢  # 建设网站翻译英文  # 哈尔滨百度搜索网站优化  # 关键词seo排名火乙星26  # 黄浦区公司网站建设推广  # 云南网络营销推广  # 广州汽车seo方法  # 淘客网站seo优化  # 第一个  # 你可以  # 是目前  # 如果你  # pybind11  # 的是  # 如何用  # 绑定  # 头文件  # 可在  # red  # win  # c++  # 工具  # windows  # python  # linux  # c++扩展 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 《GTA6》开发画面疑似泄露!这次可不是AI了  poki网页游戏推荐_poki免费游戏平台入口  Go RPC HTTP服务正确实现与常见陷阱解析  DLsite中文平台入口 DLsite官网内容在线查看  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性  荣耀Play7T运行卡顿解决_荣耀Play7T性能优化  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  解决移动端滚动问题的overflow属性应用指南  Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示  铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧  c++如何使用Meson构建系统_c++比CMake更快的构建工具  谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版  b站如何看历史记录_b站观看历史找回方法  Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】  电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  PySpark中从现有列右侧提取可变长度字符创建新列的教程  sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件  Mac终端命令大全_Mac常用Terminal指令速查  解决J*aScript中重复选择项的确认对话框显示问题  微信语音通话掉线如何解决 微信语音通话稳定优化方法  韩小圈电脑版在线入口_网页版免费登录地址  Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】  三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】  漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道  将HTML动态表格多行数据保存到Google Sheet的教程  Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】  PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】  反效果?《战地6》免费试玩开启后玩家数不升反降  12306选座如何查看座位示意图_12306座位示意图解读与使用  2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】  深入理解Go语言中的指针类型:以*string为例  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  网易大神账号申诉需要多久_网易大神账号申诉流程说明  小米14应用无法联网原因分析_小米14网络权限修复  2026春节假期票务安排_2026春节放假购票指南  厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新  b站赚钱渠道_b站收益来源  夸克浏览器网页版最新地址 夸克浏览器官方入口合集  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】  J*a实现学校排课程序_面向对象结构化项目示例  Web Components中自定义开关组件状态同步的常见陷阱与解决方案 

搜索