vscode在macos调试python报permissionerror[errno 13],根本原因是sip阻止debugpy在/usr、/system等受保护路径写临时文件或读符号表;解决关键是将脚本和python解释器移至用户目录(如~/dev/或/opt/homebrew/bin/python3),并在launch.json中显式指定python路径,避免fallback到系统路径。

VSCode 调试器在 macOS 下报 PermissionError: [Errno 13] Permission denied,通常不是权限没给够,而是调试器试图访问被 SIP 锁死的路径(比如 /usr/bin/python3、/System 或某些预装工具链),或在受保护目录下创建临时调试文件。直接 sudo code 或改目录权限治标不治本,甚至可能破坏沙盒行为。真正要解决,得看清 SIP 拦在哪、为什么拦、以及哪些操作能绕过它而不关 SIP。
为什么 debugpy / ptvsd 在 SIP 下会失败
VSCode 的 Python 调试器(如 debugpy)需要:① 注入代码到目标进程;② 绑定本地端口(默认 5678);③ 在脚本所在目录写入临时 .debugpy 文件或 socket;④ 读取符号表或系统库路径。SIP 不阻止端口绑定,但会拦截第③和④步——尤其当脚本位于 /usr、/System、/bin 等受保护路径时,OS 层直接拒绝写入或读取。
常见表现:
- 调试器启动后立刻退出,控制台显示
PermissionError: [Errno 13],但终端里python3 script.py正常运行 -
debugpy进程卡在Waiting for process to attach...,实际没监听端口(用lsof -i :5678验证) - VSCode 弹出 “无法启动调试会话” 提示,且日志里出现
Failed to create debug adapter或Cannot write to path
不关 SIP 的安全调试方案
完全禁用 SIP 是高危操作,仅限内核级调试或驱动开发。绝大多数 VSCode 调试场景,只需避开 SIP 限制路径即可。核心原则:所有调试目标必须放在用户可写区域。
- 把 Python 脚本移到
~/Desktop、~/Documents或项目根目录(如~/dev/myproject/),确保父目录有rwx权限(ls -ld ~/dev查看) - 不要用系统 Python 解释器路径(如
/usr/bin/python3);改用 Homebrew 安装的/opt/homebrew/bin/python3(Apple Silicon)或/usr/local/bin/python3(Intel),这些路径不受 SIP 保护 - 在
launch.json中显式指定"python"字段,例如:"python": "/opt/homebrew/bin/python3",避免 VSCode 自动 fallback 到系统路径 - 如果使用虚拟环境,确保
venv创建在用户目录下(如python3 -m venv ~/venvs/myproj),而不是/usr/local/venv等 SIP 受限区
需要临时禁用 SIP 的极少数场景
只有当你必须调试以下内容时,才考虑进恢复模式执行 csrutil enable --without debug:
- 调试 Apple 自带命令行工具(如
/usr/bin/swiftc、/usr/bin/clang)的底层行为 - 用
CodeLLDB加载系统 dylib 符号(如libsystem_kernel.dylib)并单步进入系统调用 - 在 M1/M2/M3 上跑
dlv-dap调试 Go 程序,且该程序通过syscall.Mmap直接映射/System下的只读内存页
注意:csrutil enable --without debug 不等于关 SIP,它只豁免调试器对受保护路径的 ptrace 和内存附加权限,其他 SIP 保护(如文件写入、kext 加载)仍生效。执行后需重启,且每次系统更新都可能重置该设置。
VSCode 启动方式决定调试器权限边界
VSCode 本身是否以 sandboxed 方式启动,直接影响调试器能访问的资源范围:
- 从 Dock 或 Launchpad 启动的 VSCode 默认启用 Full Disk Access 和 Accessibility 权限,但**不自动继承终端的环境变量或 sudo 权限**
- 用
code --no-sandbox启动会绕过部分 Electron 沙盒,但 macOS Gatekeeper 仍会拦截对 SIP 路径的访问 - 绝对不要用
sudo code启动——这会导致 VSCode 进程以 root 运行,但其子进程(如debugpy)仍受限于 SIP 规则,且可能污染用户配置 - 正确做法:在终端中 cd 到项目目录,运行
code .,让 VSCode 继承当前 shell 的 PATH 和权限上下文
最易被忽略的一点:即使你把脚本放对了位置、用了正确的 Python 解释器,如果 VSCode 是通过双击 App 图标启动的,它可能读不到你 shell 中配置的 PATH(比如 Homebrew 路径),导致它悄悄 fallback 到系统 /usr/bin/python3——这时检查 Developer: Toggle Developer Tools 控制台里的 process.env.PATH 就很关键。











