Rosetta模式下M1 Mac运行Python脚本遇Segmentation Fault问题求助
M1 Mac + Rosetta Conda + Python 3.7 运行pytest出现Segmentation Fault的排查思路
一、环境一致性排查
- 确认所有依赖包均为Rosetta兼容的x86架构:运行
conda list,检查每个包的build列,确保都是osx-64标记(而非osx-arm64)。若存在arm64架构的包,需卸载后通过当前Rosetta终端的conda重装。 - 验证Python解释器架构:执行
file $(which python),输出需包含Mach-O 64-bit executable x86_64,否则说明未使用Rosetta下的conda环境。
二、定位触发问题的测试与依赖
- 逐用例排查:通过
pytest tests/目标测试文件.py::目标测试函数 -xvs逐个运行测试,锁定触发Segfault的具体用例。 - 隔离依赖测试:针对触发错误的用例,逐步注释第三方库调用,排查是否为特定包导致的崩溃,重点关注带C扩展的包(如numpy、scipy、pandas等)。
- 核对依赖版本:确保所有包的版本与原仓库的
requirements.txt/environment.yml完全一致,C扩展包的版本不匹配是Segfault的常见诱因。
三、pytest相关问题排查
- 跳过pytest直接运行脚本:将测试用例改为普通Python脚本运行,若未出现Segfault,说明问题可能出在pytest本身或其插件。
- 降级pytest版本:Python 3.7与pytest 6.0+部分版本存在兼容性问题,可尝试安装
pytest<6.0版本测试。 - 禁用所有pytest插件:执行
pytest -p no:all tests/...,若问题消失,再逐个启用插件定位故障源。
四、系统级调试定位
- 使用调试工具获取堆栈信息:通过
lldb -- python -m pytest tests/目标测试文件.py启动调试,输入run运行测试,崩溃后输入bt查看调用堆栈,可直接定位到导致崩溃的C扩展或系统库代码位置。 - 确认Rosetta终端状态:右键终端-显示简介,确保勾选“使用Rosetta打开”,且conda环境是在该终端内创建的,未跨架构终端混用。
需补充的细节(便于进一步定位)
- 原仓库的核心依赖包列表,或仓库的大致功能方向。
conda list的输出结果(重点关注Python、pytest及核心依赖的版本和架构标记)。- 触发Segfault的具体测试用例代码片段。
file $(which python)的输出内容。- 通过lldb调试得到的堆栈信息(若可获取)。
内容的提问来源于stack exchange,提问作者firerozen
相关产品推荐
相关产品推荐

