Rust PyO3 使用

2021-01-26 language java

Python 有强于 Bash 的语法检查,但是,不适合一些高性能的场景,所以,很多时候会作为胶水语言使用。而且,由于 CPython 作为事实标准,使得其兼容 C/C++ 要容易的多,所以,通常高性能场景下会通过 C/C++ 进行重构。

这里介绍 Python 如何调用 Rust 的实现。

简介

社区有个很不错的库 PyO3 可以用来在 Rust 和 Python 之间相互调用。

示例

为了简化处理,同时提供了 maturin 工具,可以通过 pip install maturin 安装。

----- 如下新建目录,或者在某目录下 init 初始化
$ maturin new pyex
----- 会自动生成如下文件
$ cat src/lib.rs
use pyo3::prelude::*;

/// Formats the sum of two numbers as string.
#[pyfunction]
fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
    Ok((a + b).to_string())
}

/// A Python module implemented in Rust.
#[pymodule]
fn pyex(m: &Bound<'_, PyModule>) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
    Ok(())
}
----- 会自动安装到 Python 环境中,可以通过 pip list 查看
$ maturin develop
----- 生成 .pyd 文件,可以在 Python 中直接导入
$ maturin develop --skip-install
----- 打包生成 .whl 可发布的文件
$ maturin develop --release

参考