公司动态

Rust 实现可以被 Python 调用的包

📅 2026/8/22 21:51:34
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 [maturin1.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{ab}#[pyclass]structCounter{value:i64,}#[pymethods]implCounter{#[new]fnnew()-Self{Counter{value:0}}fnincrement(mutself){self.value1;}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))# 3cmylib.Counter()c.increment()print(c.get())# 1总结一句话配置文件照抄#[pymodule]函数名改成你的模块名然后把你的#[pyclass]/#[pyfunction]注册进去。其他的 Maturin 帮你搞定。想了解更多 PyO3 绑定的细节和这个 repo 是怎么处理类型转换、错误的PyO3 绑定架构错误处理与类型转换GIL 管理与性能优化