基于Maturin为Python≥3.9构建跨架构Python包的疑问
当前版本回顾
此前纯Python包通过setuptools构建,生成的是跨平台、跨Python版本的sdist和any wheel,所有用户都能直接安装。
新版本现状
改用PyO3+Maturin后,本地Windows Python3.11环境下生成的是仅适配Windows AMD64架构、Python3.11版本的wheel,以及包含Rust源码的sdist。
问题1:将这些文件上传至PyPI会给用户带来问题吗?
直接上传没问题,但存在局限性:
- 只有Windows AMD64平台、Python3.11的用户能直接安装预编译的wheel;
- 其他平台(Linux/macOS)或Python版本(3.9/3.10/3.12+)的用户,pip会自动 fallback 到源码包安装,这要求用户必须有Rust工具链,否则会安装失败。
问题2:未安装Rust的用户能否通过源码分发安装该包?
不能。源码包(tar.gz)包含Rust扩展的源代码,安装时Maturin会调用Rust编译器将其编译为适配用户系统的二进制文件。没有Rust环境的话,pip会抛出编译失败的错误,无法完成安装。
问题3:源码分发是否也需要依赖架构?
源码包本身不依赖架构——它是纯文本/源码文件,可以在任何平台上下载。但安装过程中会生成依赖架构的二进制产物:用户安装源码包时,会在本地编译出适配自身系统架构(比如Linux x86_64、macOS ARM64)的扩展文件,最终运行的二进制是和用户系统绑定的,但源码包本身是跨平台的。
问题4:如何通过Maturin生成支持所有Python≥3.9版本的wheel?
有两种可行方案:
本地多Python版本构建
先在本地安装好Python3.9、3.10、3.11、3.12等目标版本,然后针对每个版本单独运行构建命令:# 针对Python3.9 maturin build --release --bindings pyo3 --interpreter python3.9 # 针对Python3.10 maturin build --release --bindings pyo3 --interpreter python3.10 # 以此类推也可以一次性指定多个解释器:
maturin build --release --bindings pyo3 --interpreter python3.9 python3.10 python3.11 python3.12这样会生成对应每个Python版本的wheel(文件名带
cp39、cp310等后缀)。CI自动化多平台/多版本构建(推荐)
手动本地构建效率低且容易遗漏平台,推荐用CI工具(比如GitHub Actions)配合cibuildwheel,自动为Windows、macOS、Linux的各种架构,以及所有Python3.9+版本构建预编译wheel。只需要在项目中配置cibuildwheel的参数,它会自动调用Maturin完成构建,无需本地维护多环境。
内容的提问来源于stack exchange,提问作者Attack68

