内核断开重连失败主因是 ipykernel 与 tornado 版本不兼容或 kernel.json 路径失效,非网络问题;需检查 sys.executable、修正 kernel.json、清空 runtime 缓存并降级 ipykernel 验证。

内核突然断开、自动重连失败,根本不是网络问题
VSCode 里 Notebook 单元格执行中途卡住、状态栏变灰、右上角显示 “Kernel disconnected” 或反复弹出 “Reconnecting…” —— 这不是你本地网络不稳,而是内核进程意外退出后,VSCode 尝试复用旧连接句柄失败。它没真正重启内核,只是在原地等一个早已不存在的 socket。
- 先别急着点 “Restart Kernel”,那只是清空变量,不解决进程崩溃根源
- 打开 Output 面板 → 切到
Jupyter标签页,找最后一段报错,常见的是Kernel died后跟OSError: [Errno 9] Bad file descriptor或ConnectionResetError - 这类错误基本锁定在
ipykernel和底层通信组件(pyzmq、tornado)版本不兼容,尤其多见于ipykernel 6.27++tornado 6.4+组合
重连失败时,别信右上角那个“Python (myenv)”标签
内核名只是注册时写的 display-name,不代表当前正在跑的是你认为的那个环境。VSCode 可能拿着旧 kernel.json 里的路径去连,而那个路径下的 Python 解释器早已被 conda update 或 pip uninstall 拆掉。
- 在 Notebook 里运行:
import sys; print(sys.executable),记下输出路径 - 在终端激活同一环境,运行:
jupyter kernelspec list,找到对应myenv的路径 - 进那个目录(如
~/.local/share/jupyter/kernels/myenv),打开kernel.json,核对"argv"第一项是否和sys.executable完全一致(注意 Windows 是反斜杠,Linux/macOS 是正斜杠) - 不一致?直接改
kernel.json,或干脆删掉整个目录,重新运行python -m ipykernel install --user --name myenv --display-name "Python (myenv)"
强制走全新内核流程:跳过所有缓存和复用逻辑
VSCode 默认会尝试复用已启动的 notebook server 和 kernel 进程,一旦中间某个环节残留异常状态,就会陷入无限重连循环。必须打断这个链路。
- 关掉所有 Notebook 标签页,关闭 VSCode(不是重载窗口)
- 删掉 Jupyter 运行时缓存:
rm -rf ~/.jupyter/runtime/(macOS/Linux)或del /q %USERPROFILE%\.jupyter\runtime\*(Windows) - 启动 VSCode 后,先按
Ctrl+Shift+P→ 输入Jupyter: Specify Jupyter Server for Connections→ 选Local Jupyter Server→ 点Start local Jupyter server - 再打开 .ipynb 文件,此时内核是全新拉起的进程,不会继承任何旧状态
ipykernel 版本是最大隐藏变量
不是越新越好。ipykernel 6.27.0 开始在 Windows/WSL 上默认启用 tcp://127.0.0.1 绑定,但某些杀软、WSL 的 localhost 解析、甚至 Docker Desktop 的网络代理都会拦截该地址。降级是最快验证手段。
- 在目标环境中运行:
python -m pip install "ipykernel(推荐 <code>6.26.0) - 然后重装内核:
python -m ipykernel install --user --name myenv --display-name "Python (myenv)" - 如果仍不行,再加一层保险:
python -m pip install "tornado(<code>tornado 6.3.3是目前最稳组合) - 注意:不要同时降级
pyzmq,除非pip list显示它版本低于22.3.0;新版pyzmq对 ZeroMQ 底层更健壮
kernel.json 路径、ipykernel 版本、tornado 兼容性这三者交叉处。改完任一环,都得删 runtime 缓存 + 全重启 VSCode,否则旧状态还在偷偷作祟。











