使用PyInstaller构建时能否指定Python架构?适配新Mac问题咨询
在Intel Mac上用PyInstaller构建的包在Apple Silicon Mac上运行报错的解决方案
我用旧款Intel架构Mac,通过PyInstaller构建分发包,这些包在Intel机器上能正常运行,但在新款Mac上报错:
zsh: killed /Users/...../our_distr_folder
我推测分发包里包含x86版本的Python,想问能不能把它替换成arm64e版本?或者能不能创建基于arm64 Python的虚拟环境(这个环境可能在我的Intel机器上跑不起来)?
我已经安装了两种架构的Python,执行命令:
file $(which /usr/bin/python3)
输出结果是:
/usr/bin/python3 (for architecture x86_64): Mach-O 64-bit executable x86_64 /usr/bin/python3 (for architecture arm64e): Mach-O 64-bit executable arm64e
解决方案
1. 直接替换分发包中的Python架构不可行
手动替换分包里的Python二进制文件风险极高,PyInstaller打包时会把Python解释器和所有依赖库绑定在一起,依赖库也都是x86架构的,单独替换Python解释器会导致依赖不兼容,依然无法正常运行。
2. 在Intel Mac上创建arm64 Python虚拟环境并构建包
可以借助Rosetta 2在Intel Mac上模拟arm64环境,创建对应架构的虚拟环境并打包,步骤如下:
- 开启终端的Rosetta模式:右键终端应用→显示简介→勾选“使用Rosetta打开”,重启终端。
- 在该终端中创建arm64架构的虚拟环境:
arch -arm64 /usr/bin/python3 -m venv arm64_venv - 激活虚拟环境:
source arm64_venv/bin/activate - 安装PyInstaller和项目依赖:
pip install pyinstaller [你的项目依赖包] - 使用该环境下的PyInstaller构建分发包,生成的包即为arm64架构,可直接在Apple Silicon Mac上运行。
3. 构建同时兼容两种架构的通用二进制包
如果需要包同时支持Intel和Apple Silicon Mac,可分别构建两个架构的包后合并:
- 在原生Intel终端构建x86版本的包。
- 在Rosetta终端的arm64虚拟环境中构建arm64版本的包。
- 使用
lipo工具合并两个可执行文件:
注意:需确保两个环境下的依赖版本完全一致,否则合并后可能出现运行异常。lipo -create x86_version/dist/your_app arm64_version/dist/your_app -output universal_app
内容的提问来源于stack exchange,提问作者user3223180
相关产品推荐
相关产品推荐

