讲师中心 微信公众号
AI工具推荐 视频效率加速

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

轻宇君_9374

轻宇君_9374

发布时间:2025-11-21 19:50:02

|

335人浏览过

|

来源于php中文网

原创

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 模块:

立即学习“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)

然后执行:

windows-auto
windows-auto

Windows 桌面自动化技能,支持鼠标控制(移动/点击/拖拽/滚轮/截图)、键盘输入(文字输入/按键/组合键)、窗口管理(查找/聚焦/最大化/最小化/关闭/移动)、截图并发送文件。提供两种截图方式:Python pyautogui 截图(集成在自动化流程中)和 PowerShell + .NET 零依赖截图(支持区域截图和多显示器)。当用户需要自动化 Windows 桌面操作、控制鼠标键盘、管理窗口、执行 GUI 自动化任务、截图发送文件时使用。

下载
mkdir build
cd build
cmake ..
make

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

在 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::vector、std::string、std::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++ 项目集成等场景。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

3390

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

7703

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

9362

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

4887

2025.07.23

string转int
string转int

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

7079

2023.08.02

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3208

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5249

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3869

2025.12.29

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

热门下载

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

精品课程

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

共115课时 | 43.8万人学习

vscode其实很简单
vscode其实很简单

共72课时 | 32.6万人学习

Mongodb基础视频教程
Mongodb基础视频教程

共21课时 | 5.5万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn