当前位置: 首页 > news >正文

Rust 实现可以被 Python 调用的包

完全固定,照抄就行

Cargo.toml

[lib] crate-type = ["cdylib", "rlib"] [dependencies] pyo3 = { version = "0.27" } [features] default = [] extension-module = ["pyo3/extension-module"]

pyproject.toml

[build-system] requires = ["maturin>=1.7,<2.0"] build-backend = "maturin" [tool.maturin] features = ["extension-module"]

这些永远不用动。


src/lib.rs—— 唯一需要你写的部分

结构是固定的,但内容是你的。看这个 repo 的实际写法:

// [src/lib.rs#L574-L579]#[pymodule]fnrustbpe(m:&Bound<'_,PyModule>)->PyResult<()>{pyo3_log::init();m.add_class::<Tokenizer>()?;// 注册你的类Ok(())}

你只需要关心两件事:

1. 函数名 = 模块名
fn rustbpe(...)这里的函数名,就是 Python 里import的名字。你写fn mylib(...)import mylib

2. 往模块里注册你的东西

想暴露的东西写法
一个类m.add_class::<MyStruct>()?+ struct 上加#[pyclass]
一个函数m.add_function(wrap_pyfunction!(my_fn, m)?)?+ fn 上加#[pyfunction]
一个常量m.add("MY_CONST", 42)?

最小可运行示例

假设你要写一个 Python 可以调用的add(a, b)函数和一个Counter类:

usepyo3::prelude::*;#[pyfunction]fnadd(a:i64,b:i64)->i64{a+b}#[pyclass]structCounter{value:i64,}#[pymethods]implCounter{#[new]fnnew()->Self{Counter{value:0}}fnincrement(&mutself){self.value+=1;}fnget(&self)->i64{self.value}}#[pymodule]fnmylib(m:&Bound<'_,PyModule>)->PyResult<()>{m.add_function(wrap_pyfunction!(add,m)?)?;m.add_class::<Counter>()?;Ok(())}

Python 端:

importmylibprint(mylib.add(1,2))# 3c=mylib.Counter()c.increment()print(c.get())# 1

总结一句话

配置文件照抄,#[pymodule]函数名改成你的模块名,然后把你的#[pyclass]/#[pyfunction]注册进去。其他的 Maturin 帮你搞定。

想了解更多 PyO3 绑定的细节和这个 repo 是怎么处理类型转换、错误的:

  • PyO3 绑定架构
  • 错误处理与类型转换
  • GIL 管理与性能优化
http://www.cnnetsun.cn/news/4164624.html

相关文章:

  • 简繁互转怎么一键搞定?Calibre 插件 TradSimpChinese 快速上手指南
  • OpenCore Legacy Patcher 完整指南:3 步给老 Mac 装上最新 macOS(可逆、免费)
  • UDP与TCP协议深度解析:从核心原理到网络编程实战
  • 3步导出QQ空间历史说说:GetQzonehistory 完整操作指南
  • AI模型部署实战:FDE工程师的核心技能与工作流解析
  • AI翻译模型本地部署指南:用Sakura启动器从下载到起服务只要5分钟
  • SpringBoot集成Lettuce连接Redis:从基础配置到生产实践
  • 团队招聘误区与高效人才管理策略
  • C++面试核心要点与内存管理深度解析
  • LLaMA-Factory 微调提速:3 个开关压缩 7B 模型训练时间与显存
  • LLM Agent域外工具推理能力评估:AgentEscapeBench基准设计与实践
  • 大厂Java面试核心:Java基础、Spring Boot与Redis深度解析
  • C++模板参数获取:从基础使用到编译期反射的完整指南
  • 免费听全网易云和QQ音乐:第三方Web播放器NeteaseMusic完整使用指南
  • AI智能体部署后评估:从静态测试到持续监控的工程实践
  • 基于OpenClaw与AI大模型的求职辅助系统开发实践
  • 结构化面试自我认知类题目解析与应对技巧
  • 数学建模竞赛实战:从时空预测到优化调度完整解决方案
  • 【原创】基于微信小程序+AI大模型+uni-app的母婴用品商城与育儿知识小程序(设计与实现)
  • 机密计算与TEE技术:为AI智能体构建硬件级数据安全保险箱
  • 自动驾驶世界模型算法:技术要点与蔚来面试解析
  • qmcdump:3条命令把QQ音乐qmcflac/qmc0/qmc3解密成标准flac/mp3
  • 多模态情感分析指南:5种融合策略一次讲清
  • 3 条命令搞定 Papermerge 部署:让扫描件也能全文搜索
  • 选对AI论文写作软件提前 2 周交稿!高口碑工具盘点 + 避坑全攻略
  • 维恩图入门:从集合概念到容斥原理的图形化学习指南
  • 01-Nginx核心架构与工作原理:进程模型、并发处理、适配高并发售货柜业务
  • 医学影像指纹彩色化图像数据集
  • 校园招聘系统开发:Vue+UniApp跨平台实践与Node.js高并发处理
  • 从信息化到空间智能:Cognize-Agent驱动海关生态立体管控白皮书