PyInstaller构建universal2架构失败,求助FAT版本构建及依赖解决方案
构建macOS Universal2胖可执行文件的解决方案
你碰到的错误本质是当前使用的Homebrew Python为单架构(arm64)版本,其内置的.so库仅适配当前架构,无法满足PyInstaller构建universal2胖文件的要求。以下是针对你问题的具体解决办法:
一、能不能构建FAT版本?
当然可以,但前提是所有依赖(包括Python内置库)都得是包含x86_64和arm64的fat binary。只要解决了依赖的架构兼容问题,就能顺利用PyInstaller构建跨架构的可执行文件。
二、哪里能获取编译为FAT的内置Python框架?
- 官方Python安装包:从Python官网下载的macOS安装包(不要用Homebrew版本)默认就是universal2架构的,它的
lib-dynload目录下所有.so文件都是fat binary。安装这个版本的Python,用它创建虚拟环境、安装项目依赖,再运行PyInstaller构建就能避开架构不兼容的问题。 - 手动合并架构(适合坚持用Homebrew的场景):
- 在x86_64架构的Mac上(或通过Rosetta 2打开终端模拟x86_64环境),安装同版本的Homebrew Python,提取对应架构的
.so文件; - 在你的arm64终端中,提取当前Python环境下的
.so文件; - 用
lipo命令合并两个架构的文件,以_struct.cpython-310-darwin.so为例:lipo -create 路径/x86_64版本.so 路径/arm64版本.so -output 合并后的路径/_struct.cpython-310-darwin.so - 把合并后的文件替换到当前Python环境的
lib-dynload目录(记得先备份原文件)。不过这种方法需要处理所有涉及的.so文件,操作起来比较繁琐。
- 在x86_64架构的Mac上(或通过Rosetta 2打开终端模拟x86_64环境),安装同版本的Homebrew Python,提取对应架构的
三、能不能按需自动下载对应架构的正确库?
目前PyInstaller没有自动下载跨架构依赖的功能。要实现跨架构支持,得提前做好准备:
- 优先使用官方universal2版本的Python,它自带的内置库已经是双架构的;
- 对于第三方依赖,安装时要确保是universal2版本。如果第三方包需要源码编译,安装前设置环境变量
ARCHFLAGS="-arch x86_64 -arch arm64",这样编译出来的包就是fat binary。
内容的提问来源于stack exchange,提问作者Zohar81
相关产品推荐
相关产品推荐

