MacOS下sudo运行Python文件报zsh segmentation fault求助
运行环境
- 系统:MacOS Monterey(无可用系统更新)
- Python版本:3.10.4
问题描述
通过绝对路径加sudo提权运行Python脚本mainCode.py时触发段错误,执行命令为:sudo python3 '/Users/cyberstorm/Documents/Visual Studio Code/Terminal Adventure/mainCode.py'
终端返回报错:zsh: segmentation fault sudo python3,无法直接定位错误原因。
复现背景
脚本依赖keyboard模块实现键盘输入监听,代码逻辑确认无问题:
- 首次以普通用户权限运行时,抛出权限不足错误,日志如下:
Exception in thread Thread-1 (listen): Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/threading.py", line 1009, in _bootstrap_inner self.run() File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/threading.py", line 946, in run self._target(*self._args, **self._kwargs) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/keyboard/__init__.py", line 294, in listen _os_keyboard.listen(self.direct_callback) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/keyboard/_darwinkeyboard.py", line 430, in listen raise OSError("Error 13 - Must be run as administrator") OSError: Error 13 - Must be run as administrator
- 根据报错提示改用sudo提权运行,在脚本所在目录执行
sudo python3 mainCode.py时提示文件不存在,切换为脚本绝对路径执行后触发前述段错误。
解决方案
这个段错误和代码逻辑无关,是MacOS权限机制、sudo环境变量差异、keyboard模块Mac端实现缺陷共同导致的,按以下步骤操作即可修复:
- 指定正确的Python解释器全路径
sudo执行时会重置环境变量PATH,直接写python3大概率会调用系统自带的Python解释器,该解释器既没有安装keyboard模块,还存在版本兼容问题。先在普通用户权限的终端执行which python3,获取当前用户使用的Python解释器完整路径(通常为/Library/Frameworks/Python.framework/Versions/3.10/bin/python3),sudo运行时直接写全该路径,示例命令:sudo /Library/Frameworks/Python.framework/Versions/3.10/bin/python3 '/Users/cyberstorm/Documents/Visual Studio Code/Terminal Adventure/mainCode.py' - 给终端开放对应系统权限
打开「系统设置→隐私与安全性」,分别找到「辅助功能」「完全磁盘访问权限」两个配置项,将你当前使用的终端(系统Terminal、iTerm2、VS Code内置终端均可)加入允许列表并勾选。配置完成后必须完全退出终端重新打开,权限配置才会生效。 - 降级安装兼容版本的keyboard模块
如果前两步操作后仍触发段错误,说明当前安装的最新版keyboard模块在Monterey系统上存在内存访问bug,提权调用底层输入监听接口时会触发越界。执行以下命令重装稳定兼容版本:
重装完成后再使用带Python全路径的sudo命令运行即可。pip3 uninstall keyboard -y pip3 install keyboard==0.13.5
补充说明:之前在脚本目录执行
sudo python3 mainCode.py提示文件不存在,也是sudo重置环境变量和工作目录导致的,使用脚本绝对路径的写法本身没有问题,只要Python解释器路径正确就不会出现找不到文件的报错。
内容的提问来源于stack exchange,提问作者user19284560
相关产品推荐
相关产品推荐

