MacOS编译Arduino ESP32报错:fork/exec python3执行格式错误
问题背景
昨日MacOS上Arduino IDE和VS Code编译Arduino程序均正常,今日全部编译失败,报错:
fork/exec /Library/Frameworks/Python.framework/Versions/3.11/bin/python3: exec format error
Compilation error: fork/exec /Library/Frameworks/Python.framework/Versions/3.11/bin/python3: exec format error
执行which python3返回路径/Library/Frameworks/Python.framework/Versions/3.11/bin/python3,但python --version显示为Python 3.10.6,怀疑是运行Docker后影响了Python环境。
排查与解决步骤
1. 检查Python 3.11二进制架构匹配性
MacOS的exec格式错误常因二进制架构与系统不匹配导致(比如Apple Silicon的arm64运行x86_64二进制且未启用Rosetta,或反之)。执行以下命令查看架构:
lipo -info /Library/Frameworks/Python.framework/Versions/3.11/bin/python3
- 若你的Mac是Apple Silicon(arm64),但输出仅显示
x86_64:需确保Rosetta已安装,或重新下载arm64版本的Python 3.11。 - 若Mac是Intel(x86_64),但输出仅显示
arm64:重新下载x86_64版本的Python 3.11。
2. 调整PATH环境变量优先级
当前系统PATH中Python 3.11的路径优先级高于系统默认的Python 3.10,导致Arduino工具链调用了有问题的3.11版本。
- 临时测试:在终端执行以下命令,然后重新打开Arduino IDE/VS Code编译:
export PATH=/usr/bin:$PATH - 永久生效:根据你使用的shell,编辑对应的配置文件:
- zsh用户:编辑
~/.zshrc,添加export PATH=/usr/bin:$PATH - bash用户:编辑
~/.bash_profile或~/.bashrc,添加同样内容
保存后执行source ~/.zshrc(或对应配置文件)使改动生效。
- zsh用户:编辑
3. 重新安装Python 3.11
如果上述方法无效,直接卸载损坏或架构不匹配的Python 3.11,重新安装适配版本:
# 卸载Python 3.11 sudo rm -rf /Library/Frameworks/Python.framework/Versions/3.11 sudo rm -f /usr/local/bin/python3.11 sudo rm -f /usr/local/bin/pip3.11
然后从Python官网下载对应Mac架构的Python 3.11安装包,完成安装后重新测试编译。
4. 检查Docker架构设置
Docker的Rosetta模拟设置可能影响系统架构环境:
- 打开Docker Desktop,进入
Settings > Features in development - 查看"use Rosetta for x86/amd64 emulation on Apple Silicon"选项的状态
- 如果近期修改过该设置,尝试重启Docker和电脑后再测试编译。
内容的提问来源于stack exchange,提问作者ChicoDaMan

