jupyter notebook默认仅支持tab键手动补全,要实现边输边提示的自动补全需按版本选择方案:6.x用jupyter_contrib_nbextensions+hinterland,7+则必须使用jupyterlab-lsp+python-lsp-server;无论版本,补全失效时可全局禁用jedi引擎。

Jupyter Notebook 默认只支持按 Tab 键手动触发补全,不弹出实时建议框;要实现“边输边提示”的自动补全,必须安装第三方扩展,且不同 Notebook 版本对应不同方案——6.x 用 jupyter_contrib_nbextensions,7+ 则必须转向 jupyterlab-lsp(Notebook 7+ 已弃用 nbextension 架构)。
确认你的 Notebook 版本再动手
运行以下命令查版本:
jupyter notebook --version
结果决定你该走哪条路:
- 输出是
6.x(如6.5.4):走jupyter_contrib_nbextensions+Hinterland路线 - 输出是
7.x或更高:别浪费时间装 nbextension,它根本不会生效;必须用jupyterlab-lsp配合python-lsp-server - 不确定是否升级过?检查启动时浏览器地址栏:若含
/tree是经典 Notebook,含/lab是 JupyterLab —— 后者统一走 LSP
Notebook 6.x:启用 Hinterland 自动补全
这是最成熟、兼容性最好的方案,但注意:Hinterland 是“输入即弹出”,不是“智能上下文补全”,对 pandas、numpy 等库的链式调用(如 df.col.)支持有限。
- 先关掉所有正在运行的
jupyter notebook进程(终端里Ctrl+C,或任务管理器杀掉 python 进程) - 执行安装命令(推荐加清华源加速):
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jupyter_contrib_nbextensions jupyter_nbextensions_configurator
- 安装扩展到用户目录:
jupyter contrib nbextension install --user --skip-running-check
- 启用配置器:
jupyter nbextensions_configurator enable --user
- 重启
jupyter notebook,打开页面后点顶部菜单栏的Nbextensions→ 取消勾选Disable configuration for nbextensions without explicit compatibility→ 找到Hinterland并勾选
Notebook 7+ 或 JupyterLab:必须用 jupyterlab-lsp
新版内核已移除 nbextension 支持,强行装 Hinterland 不会显示、也不会报错,纯属白忙。LSP 方案虽配置稍重,但能真正理解类型、支持链式调用和参数提示。
- 卸载旧扩展(避免冲突):
pip uninstall jupyter_contrib_nbextensions jupyter_nbextensions_configurator
- 安装服务端:
pip install jupyterlab-lsp python-lsp-server[all]
- 安装前端(仅 JupyterLab 需要):
jupyter labextension install @krassowski/jupyterlab-lsp
- 如果是 Notebook 7+,跳过上一步,但需确保已安装
jupyter_server≥2.0;若提示no such extension,说明内核未识别 LSP,需检查jupyter server extension list输出中是否有jupyterlab_lsp - 启动后,在设置 →
Advanced Settings Editor→Language Server中确认enabled为true
补全失效或 pandas 不提示?优先关 Jedi
无论哪个版本,遇到补全卡顿、pd.DataFrame. 按 Tab 没反应,大概率是 jedi 引擎在老项目或大库上解析失败。临时解决可运行:
%config Completer.use_jedi = False
但更稳妥的是全局禁用(尤其适合数据分析场景):
- 生成 IPython 配置:
ipython profile create
- 进入
~/.ipython/profile_default/startup/目录,新建00-disable-jedi.py - 写入两行代码:
import IPython<br>IPython.get_ipython().Configurable.get_config().Completer.use_jedi = False
这个改动影响所有新打开的 notebook,无需重启 kernel,但修改后首次启动 notebook 时会加载 startup 脚本——这点容易被忽略,以为没生效。











