VSCode Notebook 内核为空或连接失败,主因是 Python 扩展未识别 conda/virtualenv 环境且 ipykernel 未正确注册或版本不兼容;需手动运行 python -m ipykernel install 注册内核,并降级 ipykernel 解决通信问题。

找不到 Python 内核或内核列表为空
VSCode 启动 Notebook 后,右上角内核选择器显示 Select Kernel 但点开是空的,或者只显示 Python 3 (system) 这类模糊名称——说明 VSCode 没识别到你安装的 conda/virtualenv 环境里的 Python 解释器。
根本原因不是“没装 Jupyter”,而是 VSCode 的 Python 扩展没扫描到目标环境。它只认 python 可执行文件路径,不自动遍历所有 conda env 或 venv 目录。
- 先确认目标环境已安装
jupyter:在该环境下运行pip list | grep jupyter(Linux/macOS)或pip list | findstr jupyter(Windows),确保有jupyter-core和ipykernel - 手动注册内核:在目标环境中运行
python -m ipykernel install --user --name myenv --display-name "Python (myenv)",其中myenv是你自己起的内核名,不能含空格 - 重启 VSCode(不是重载窗口),再打开 Notebook,内核列表里就会出现
Python (myenv) - 如果仍不显示,检查 VSCode 设置里
python.defaultInterpreterPath是否被错误覆盖——这个设置只影响普通 .py 文件,对 Notebook 内核无用,删掉它更安全
选中内核后一直显示“Connecting to kernel……”
点击内核名后卡在连接状态,控制台(Output → Jupyter)可能报错 ModuleNotFoundError: No module named 'ipykernel' 或直接静默超时——这说明内核进程启动了,但和 VSCode 的通信通道断了。
本质是 ipykernel 启动时依赖的底层组件(如 ZeroMQ)版本不兼容,或是权限 / 代理干扰了 IPC 通信。
- 优先尝试降级
ipykernel:在对应环境里运行pip install "ipykernel(6.27+ 版本在某些 Windows/WSL 下有 socket 绑定问题) - 关闭杀毒软件或企业防火墙临时测试,某些安全软件会拦截
ipykernel创建的本地 TCP 连接(地址类似tcp://127.0.0.1:XXXXX) - 不要用管理员权限启动 VSCode——以管理员身份运行会导致内核进程无法访问用户级 socket 文件
- 如果用 WSL,确保
localhost能被正确解析:在 VSCode 设置中把jupyter.allowUnauthorizedRemoteConnection设为true(仅限本地开发环境)
内核切换后代码不生效,还是跑旧环境的包
明明选了 Python (myenv),但 import torch 却报错说没安装,而你在该环境里明明 pip install 过——这说明 VSCode 实际加载的是另一个 Python 解释器,内核名只是个标签,不保证路径真实对应。
内核注册时的 --name 是 ID,--display-name 是显示名,两者都可重复;VSCode 靠 --name 查找内核配置,但配置文件里存的路径可能已失效(比如环境被删、重装过 Python)。
- 查真实路径:运行
jupyter kernelspec list,看输出里myenv对应的路径,然后进该目录打开kernel.json,确认argv[0]指向的 python 是否还存在 - 删掉失效内核:
jupyter kernelspec uninstall myenv,再重新ipykernel install - 在 Notebook 第一个 cell 里加
import sys; print(sys.executable),立刻验证当前运行的 Python 是否是你预期的路径 - 别依赖 VSCode 左下角 Python 解释器选择器——它对 Notebook 完全无效,纯属干扰项
多环境共存时内核名冲突或识别错乱
两个 conda env 都叫 myenv,或者你反复注册又卸载,结果内核列表里冒出一堆 Python (myenv) (1)、(2)——VSCode 不会自动去重,只会按 kernelspec 名字硬匹配,容易选错。
名字重复本身不报错,但一旦某个内核配置损坏,VSCode 可能 fallback 到第一个可用内核,导致行为不可控。
- 注册时强制用唯一 ID:
conda activate env1 && python -m ipykernel install --user --name env1-py39 --display-name "Python 3.9 (env1)" - 统一管理:所有内核都用
--user(避免需要 sudo),且不用--prefix指向 conda env 根目录(易权限出错) - 定期清理:
jupyter kernelspec list看有哪些,用uninstall删除不再维护的,别留着“备用” - Windows 用户特别注意:PowerShell 默认禁用脚本执行,注册内核前先运行
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
最麻烦的从来不是注册失败,而是内核看似连上了,实际跑在别的 Python 上——所以每次换环境,第一件事永远是 print(sys.executable),而不是信界面显示的名字。