使用PyO3从Python调用 Rust:加速Python

本文介绍了如何使用PyO3和maturin将Rust库编译并作为Python模块安装,从而从Python调用Rust代码。通过PyO3,可以轻松实现Python和Rust之间的类型转换,以及导出Rust函数到Python。文章展示了多个示例,包括计算斐波那契数、处理不同类型的参数、使用Rust结构体、JSON序列化以及错误处理。通过这些示例,读者可以了解如何利用Rust加速Python应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用 Rust 加速你的 Python: PyO3使从 Python 调用 Rust 代码变得容易。您可以编写 Rust 库,并依靠 PyO3 和生态系统中maturin的支持工具的组合PyO3来编译 Rust 库并将其作为 Python 模块直接安装。其中,PyO3 可以在 Python 和 Rust 之间转换类型,并且可以通过一组宏轻松地将 Rust 函数导出到 Python。

在这篇博文中,我将简要介绍 PyO3。之后,我将讨论几个用 Rust 编写并从 Python 调用的示例函数。这些例子包括:

  • 在 Python 和 Rust 中计算第 n 个斐波那契数
  • 让 Python 在 Rust 函数中使用多种类型
  • 在 Python 代码中使用 Rust 结构
  • 使用 Python 将 JSON 发送到 Rust 并将该 JSON 序列化为结构
  • 允许 Rust 从 Python 运行时使用记录器
  • 在 Rust 中生成错误并将其作为异常在 Python 中捕获

PyO3 简介

PyO3 为想要将 Rust 和 Python 代码粘合在一起的人们提供了一些人体工程学设计。它可以帮助您从 Rust 调用 Python 代码以及从 Python 调用 Rust 代码。由于我只使用它从 Python 调用 Rust 代码,这是我在这里写的唯一内容。

那么 PyO3 给你什么?

首先,有maturin 。该工具将为您编译 Rust 代码,并将编译后的代码作为 Python 模块安装在您的虚拟环境中。之后,您可以在 Python 代码中导入此模块并使用它。在您pip install maturin 之后,您只需要运行 1 个命令 (&nb

可以通过使用`pyo3`库来将`Python`类方法导出到`Rust`,然后在`Rust`中调用这些方法。以下是一个例子: ```python # example.py class MyClass: def __init__(self, name): self.name = name def greet(self): print(f"Hello, {self.name}!") ``` ```rust // main.rs use pyo3::prelude::*; use pyo3::wrap_pyfunction; #[pyclass] struct MyClass { name: String, } #[pymethods] impl MyClass { #[new] fn new(name: String) -> Self { Self { name } } fn greet(&self) -> PyResult<()> { Python::with_gil(|py| { let gil = pyo3::Python::acquire_gil(); let py = gil.python(); let locals = [("self", pyo3::PyObject::from(self))].into_py_dict(py); py.run("self.greet()", None, Some(&locals))?; Ok(()) }) } } #[pyfunction] fn create_my_class(name: String) -> PyResult<MyClass> { Ok(MyClass::new(name)) } #[pymodule] fn example(_py: Python, m: &PyModule) -> PyResult<()> { m.add_class::<MyClass>()?; m.add_wrapped(wrap_pyfunction!(create_my_class))?; Ok(()) } fn main() -> PyResult<()> { Python::with_gil(|py| { let example_module = PyModule::new(py, "example")?; example_module.add_class::<MyClass>()?; example_module.add_wrapped(wrap_pyfunction!(create_my_class))?; let locals = [("example", example_module)].into_py_dict(py); py.run("import example", None, Some(&locals))?; let my_class = example_module .call("create_my_class", ("World",), None)? .extract::<MyClass>()?; my_class.greet()?; Ok(()) }) } ``` 这个例子中,我们使用`pyo3`库将`Python`类`MyClass`导出到`Rust`中。在`Rust`代码中,我们可以通过调用`MyClass`的`greet`方法来执行`Python`类中的`greet`方法。我们还编写了一个`Rust`函数`create_my_class`,用于创建`MyClass`实例并将其返回到`Python`。最后,我们在`Rust`中调用`Python`代码来创建`MyClass`实例,然后调用`greet`方法来打印出“Hello, World!”的消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值