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

  • 使用