c++如何为Python编写C++扩展_c++ Pybind11使用指南


Pybind11可高效将C++代码暴露给Python,提升性能。1. 通过pip或conda安装后包含头文件即可使用;2. 编写C++函数并用PYBIND11_MODULE和m.def导出;3. 用setuptools编译为共享库,Python可直接导入调用;4. 支持类绑定,如封装Person类并暴露构造函数与成员方法;5. 提供默认参数、STL容器转换、异常处理和NumPy支持等高级功能;6. 建议简化接口、明确返回值策略、拆分模块文件并生成类型提示。

c++如何为python编写c++扩展_c++ pybind11使用指南

用C++为Python编写扩展能显著提升性能关键部分的运行速度。Pybind11 是目前最流行、最简洁的工具之一,它允许你用极少量的 C++ 代码将 C++ 类和函数暴露给 Python。相比传统的 Python/C API 或 Boost.Python,Pybind11 更轻量、易用且功能强大。

1. 安装 Pybind11

Pybind11 是一个头文件库,不需要编译,只需包含即可使用。推荐通过包管理器安装:

  • pip 安装(推荐): pip install pybind11
  • conda 安装: conda install pybind11 -c conda-forge
  • 从源码编译: 从 GitHub 克隆并手动引入头文件目录

安装后,在项目中包含 <pybind11></pybind11> 即可开始使用。

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

创建一个简单的 C++ 文件(例如 example.cpp),导出一个加法函数:

Magician Magician

Figma插件,AI生成图标、图片和UX文案

Magician 412 查看详情 Magician
#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 numbers");
}</p>

说明:

  • PYBIND11_MODULE 定义一个 Python 可导入的模块,第一个参数是模块名(与编译后的文件名一致),第二个是模块对象 m。
  • m.def() 将 C++ 函数绑定为 Python 函数。

3. 编译生成 Python 模块

需要将 C++ 代码编译为 Python 可加载的共享库(如 .so 或 .pyd)。推荐使用 setuptools 构建。

创建 setup.py:

from setuptools import setup, Extension
from pybind11.setup_helpers import Pybind11Extension, build_ext
from pybind11 import get_cmake_dir
import pybind11
<p>ext_modules = [
Pybind11Extension(
"example",
["example.cpp"],
),
]</p><p>setup(
name="example",
ext_modules=ext_modules,
cmdclass={"build_ext": build_ext},
zip_safe=False,
)</p>

然后运行:

python setup.py build_ext --inplace

成功后会生成 example.cpython-xxx.so(Linux/macOS)或 example.pyd(Windows),可直接在 Python 中导入:

import example
print(example.add(2, 3))  # 输出 5

4. 绑定 C++ 类到 Python

Pybind11 支持完整封装 C++ 类。例如定义一个 Person 类:

#include <pybind11/pybind11.h>
#include <string>
<p>class Person {
public:
Person(const std::string &name, int age) : name(name), age(age) {}
void setName(const std::string &name) { this->name = name; }
const std::string &getName() const { return name; }
void setAge(int age) { this->age = age; }
int getAge() const { return age; }</p><p>private:
std::string name;
int age;
};</p><p>PYBIND11<em>MODULE(example, m) {
pybind11::class</em><Person>(m, "Person")
.def(pybind11::init<const std::string&, int>())
.def("setName", &Person::setName)
.def("getName", &Person::getName)
.def("setAge", &Person::setAge)
.def("getAge", &Person::getAge);
}</p>

在 Python 中使用:

p = example.Person("Alice", 30)
print(p.getName())  # Alice
p.setAge(31)
print(p.getAge())   # 31

5. 高级功能简要介绍

  • 默认参数: 直接支持 C++ 函数的默认参数,自动映射到 Python。
  • STL 容器转换: 包含 <pybind11></pybind11> 后,std::vector、std::map 等可自动转为 Python list/dict。
  • 异常处理: 使用 m.attr("builtins").attr("ValueError") 抛出 Python 异常,或用 py::wrap_exception 包装 C++ 异常。
  • NumPy 支持: 包含 <pybind11></pybind11> 可传递 NumPy 数组,实现高效数据共享。

6. 最佳实践建议

  • 保持接口简单,避免暴露复杂的 C++ 特性(如模板、多重继承)给 Python。
  • 使用 pybind11::return_value_policy 明确控制对象生命周期(如 reference_internal 避免拷贝)。
  • 模块组织清晰,按功能拆分多个 .cpp 文件并在 setup.py 中统一编译。
  • 添加类型提示支持:使用 pybind11-stubgen 生成 .pyi 文件,提升 IDE 体验。

基本上就这些。Pybind11 让 C++ 和 Python 的交互变得直观高效,适合科学计算、高性能算法、已有 C++ 库封装等场景。掌握基础绑定方法后,查阅官方文档即可应对大多数需求。

以上就是c++++如何为Python编写C++扩展_c++ Pybind11使用指南的详细内容,更多请关注其它相关文章!


# 头文件  # 江门网站建设外包  # 创新seo渠道  # 襄樊怎么做网站优化  # 怎么让网站推广更快些  # 乌鲁木齐网站建设制作  # 网站优化之页面优化  # 网站推广只选x火15星  # 宣城网站建设规划  # SEO好还是销售好  # 张掖网站推广服务  # 译为  # 客户端  # 网络编程  # 如何实现  # 可直接  # linux  # 中文网  # 第一个  # 何为  # 绑定  # cos  # win  # macos  # c++  # mac  # 工具  # github  # windows  # git  # python 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: Win10如何关闭操作中心通知 Win10免打扰设置全攻略【清爽】  Pydantic 中“schema”字段命名冲突的解决方案  谷歌邮箱怎么换绑定邮箱Gmail安全备份邮箱修改方法  WooCommerce 新客户订单自动添加管理员备注教程  阿里云共享相册入口在哪  铁路12306官网入口 铁路12306中国铁路官网登录首页  263企业邮箱如何设置邮件转发功能  《下一站江湖2》风神腿获取攻略  解决 Vue 3 组件未定义错误:理解 createApp 与根组件的正确使用  《绿竹漫游》关闭消息通知方法  Win11怎么开启HDR_Windows 11显示器画质增强设置  免费占卜在线神算_免费占卜手机神算  繁花漫画使用教程  163邮箱在线登录 163邮箱网页版在线入口  PHP实现等比数列:构建数组元素基于前一个值递增的方法  菜鸟裹裹怎样获得取件码_菜鸟裹裹获得取件码步骤  12306APP选座怎么选充电位置_12306APP带充电插座座位选择方法与技巧  MySQL多重关联查询:利用别名高效获取同一表的多个关联字段  作业帮网页版不用下载入口 在线问老师快速答疑  iPhone 15 Pro如何查看存储空间占用_iPhone 15 Pro存储空间查看教程  夸克浏览器资源嗅探怎么用 夸克浏览器网页资源下载技巧【教程】  PHP页面重载时变量值不重置的实现方法  《顺丰同城骑士》查看我的技能方法  mysql中外键约束如何使用_mysql FOREIGN KEY操作  如何在CSS中清除浮动解决背景颜色不包裹内容问题_clear after技巧  163邮箱网页版入口 163邮箱在线使用  在Django中动态检查模型关联:一种灵活的解决方案  Yandex世界探索 最新官方免登录入口全知道  在PySimpleGUI中实现键盘按键绑定按钮事件  J*aScript大数运算_BigInt使用指南  告别阻塞等待:如何使用GuzzlePromises优雅处理PHP异步操作,提升应用响应速度  Win10锁屏时间怎么设置 Win10调整自动锁屏时间方法  Win10运行窗口在哪里打开 Win10调出运行命令框快捷键【技巧】  win11如何开启单声道音频 Win11为听障用户合并左右声道【辅助】  如何快速去除厨房重油污? 2025年最好用的厨房清洁剂推荐  Sublime怎么自动添加CSS前缀_Sublime安装Autoprefixer插件  iPhone14开启Apple TV遥控设置  C++中std::thread和std::async的区别_C++并发编程与线程与异步任务比较  红手指专业版app注册教程  《健康大兴》注册方法介绍  《真我》申请退款方法  C++如何将字符串转换为大写或小写_C++ transform函数的使用技巧  如何编写一个符合 composer 规范的 post-install-cmd 脚本?  家里的小飞虫总是不断,用什么方法可以彻底根除?  Python csv 模块处理非字符串数据:列表写入 CSV 文件的机制解析  如何用mysql实现客户反馈管理_mysql客户反馈数据库方法  LINUX怎么查看显卡信息_LINUX查看GPU状态  如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?  《合金装备4》有望推出重制版!制作人发话了  在J*a中如何实现类的继承与方法重用_OOP继承方法重用技巧分享 

 2025-12-07

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.