直接在单一平台用 build + cross-platform 构建多架构 wheel 不可行,必须通过原生构建或使用 PyPA 官方 manylinux 容器镜像(如 cp39-manylinux_x86_64/aarch64)分别构建,并用 auditwheel 验证 ABI 标签与文件名一致性。

用 build + cross-platform 环境直接构建多架构 wheel 不现实
Python 的 pip wheel 或 python -m build 默认只构建当前运行平台的 wheel。你在 amd64 机器上跑一遍,不会自动产出 arm64 的 .whl;反过来也一样。想“一次命令打两个架构”,底层没有魔法——wheel 文件名里带 manylinux2014_aarch64 或 manylinux2014_x86_64 这种标签,是构建环境、编译器、链接器共同决定的,不是靠改文件名能蒙混过关的。
所以真实路径只有两条:要么在对应架构机器上原生构建,要么用容器做交叉构建环境。前者简单但需要物理/虚拟机资源;后者更工程化,推荐用 quay.io/pypa/cp39-manylinux_x86_64 和 quay.io/pypa/cp39-manylinux_aarch64 这类官方 manylinux 镜像。
用 docker run 分别启动 amd64/arm64 容器构建 wheel
PyPA 提供的 manylinux 镜像已预装 auditwheel、pip、setuptools 和对应架构的 GCC,开箱即用。关键不是“怎么打包”,而是“怎么确保 wheel 标签和 ABI 兼容性正确”。
- 镜像名必须严格匹配目标架构:
quay.io/pypa/cp39-manylinux_x86_64(amd64)、quay.io/pypa/cp39-manylinux_aarch64(arm64) - 挂载项目目录时,用
-v $(pwd):/io,并在容器内 cd /io 执行python -m build --wheel --no-isolation - 生成的
.whl会落在/io/dist/,记得用-v把它映射回宿主机 - 构建完立刻用
auditwheel show dist/*.whl检查 ABI 标签是否含manylinux2014_x86_64或manylinux2014_aarch64—— 如果显示linux_x86_64,说明没走 manylinux 工具链,大概率漏了--no-isolation或用了错镜像
setup.py 或 pyproject.toml 里不需要特殊声明架构
Python 的打包配置本身不参与架构决策。setup.py 中的 ext_modules 或 pyproject.toml 里的 [build-system] 只控制“怎么编译扩展”,不控制“编译成哪个 CPU 指令集”。真正起作用的是构建时的 Python 解释器位数、C 编译器目标三元组(如 aarch64-linux-gnu-gcc)、以及 auditwheel 重写 WHEEL 元数据的行为。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
唯一要注意的是:如果你项目含 C 扩展,确认 setup.py 没硬编码 extra_compile_args=['-march=x86-64'] 这类指令;否则在 arm64 容器里会直接报错。更安全的做法是让编译器自己推导:extra_compile_args=[],依赖镜像中 GCC 的默认 target。
上传到 PyPI 前务必验证 wheel 文件名与内容一致性
常见翻车点:手动改过 .whl 文件名,但没更新内部 WHEEL 文件里的 Root-Is-Purelib: false 和 Tag: 字段,导致 pip install 时拒绝安装或选错版本。
- 用
unzip -p yourpkg-1.0.0-cp39-cp39-manylinux2014_x86_64.whl WHEEL | grep Tag确认输出是Tag: cp39-cp39-manylinux2014_x86_64 - 用
file dist/yourpkg*.whl看压缩包本身是否为 ZIP 格式(应是),排除构建中途出错生成了 tar.gz 却改后缀的情况 - 在干净的 arm64 Linux 环境(比如 Raspberry Pi OS 或 AWS EC2 a1.medium)上试装:
pip install --find-links ./dist --no-index yourpkg,比光看文件名靠谱得多
很多团队卡在最后一步:以为上传成功就万事大吉,结果用户 pip install 报 ERROR: No matching distribution found,其实只是 wheel 标签写错了,或者 auditwheel repair 没跑成功,内部还是 linux_aarch64 而非 manylinux2014_aarch64。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










