You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:50:24