PyO3
PyO3 是使用 Rust 开发 Python 插件的库。 curl-py 是我写的一个示例项目,通过 pyo3 将 libcurl 暴露给 Python 使用。
打包分发时,会用到 PyO3/maturin-action,它会自动使用 manylinux 镜像来打包,尽可能多的保证最后的二进制文件可以在多个 linux 平台上使用。
pypa/manylinux
Python wheels that work on any linux (almost) 这是 Python 官方提供的一组 Docker 静态,用来打包、分发含有二进制的 Python 包,有多个版本:
- PEP 513 (manylinux1)
- PEP 571 (manylinux2010)
- PEP 599 (manylinux2014)
- PEP 600 (manylinux_x_y)
- PEP 656 (musllinux_x_y)
现在主要用的就是最后两个,最后的 xy 表示的是 glibc 的版本,比如:manylinux_2_28。 不同镜像支持的系统,可以参见:https://github.com/pypa/manylinux?tab=readme-ov-file#docker-images
manylinux_2_28 (AlmaLinux 8 based)
Toolchain: GCC 13
- x86_64 image: quay.io/pypa/manylinux_2_28_x86_64
- aarch64 image: quay.io/pypa/manylinux_2_28_aarch64
- ppc64le image: quay.io/pypa/manylinux_2_28_ppc64le
- s390x image: quay.io/pypa/manylinux_2_28_s390x
兼容的系统
- Debian 10+
- Ubuntu 18.10+
- Fedora 29+
- CentOS/RHEL 8+
PyO3 使用注意事项
pymodule
标注的函数名要与 cargo 中的 name 一致,如果函数名会与现有模块名冲突,可以用下面方式解决:1 2 3 4 5
#[pymodule(name = "vsag")] fn vsag_py(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_class::<Index>()?; Ok(()) }
Maturin-action
- 使用