环境安装

os: macos, M3, 14.1.1

python虚拟环境: conda

当前使用的pyo3版本:0.22.5

因为pyo3还在早期版本,可能随时有大更新,尽量做到定期更新

在此之前

如果使用mac环境,要修改~/.cargo/config.toml,添加

[target.x86_64-apple-darwin]
rustflags = [
  "-C", "link-arg=-undefined",
  "-C", "link-arg=dynamic_lookup",
]

[target.aarch64-apple-darwin]
rustflags = [
  "-C", "link-arg=-undefined",
  "-C", "link-arg=dynamic_lookup",
]

maturin

构建和发布带有 pyo3、cffi 和 uniffi 绑定的 crates,以及将 Rust 二进制文件作为 Python 包发布

brew install maturin

使用conda,安装失败,而且maturin只是一个命令行工具,所以使用了homebrew安装

构建环境

mkdir <target_dir>
cd <target_dir>
maturin init

这步会直接生成Github Actions的CI文件,.github/workflows/CI.yml,当把代码push到github后,会自动执行CI,生成轮子

调用如下命令行就可以直接安装轮子

pip install git+https://github.com/Leo-AO-99/pyo3-tutorial@main

完成后

target_dir/
│
├── src/
│   └── lib.rs
├── Cargo.toml
└── pyproject.toml

lib.rs 内容如下

use pyo3::prelude::*;

#[pymodule]
fn pyo3_tutorial(m: &Bound<'_, PyModule>) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
    Ok(())
}

#[pyfunction]
fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
    Ok((a + b).to_string())
}

具体解释会在后续章节中讲解,但是可以很容易看出sum_as_string的作用,将两个数字相加,然后返回字符串

接着执行,以及每次修改后都要执行该命令,会把编译后的库安装在当前的python环境中,后续不再赘述

maturin develop

(当然,cargo会生成二进制文件,各位可以尝试自己编写安装脚本)

测试下效果

$ python                     
Python 3.10.15 (main, Oct  3 2024, 02:24:49) [Clang 14.0.6 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyo3_tutorial
>>> pyo3_tutorial.sum_as_string(1,2)
'3'

好了,你已经学会pyo3,接下来去成为Rust编程大师吧