jupyter notebook运行无反应或不显示结果,主因是内核未启动/断开、输出缓冲或前端截断;需先检查右上角内核状态(灰色即未连接)、强制刷新print(flush=true)、写日志文件替代直接输出,并排查ipykernel缺失、pyzmq/tornado版本冲突及windows中文环境变量问题。

Jupyter Notebook运行代码没反应、不显示结果,大概率不是代码写错了,而是环境配置、输出机制或内核状态出了问题。直接排查比重装更高效。
为什么 print() 不显示,甚至单元格卡在 [*] 状态
最常见原因是内核未正常启动或已断开连接——右上角的 kernel 圆点如果是灰色,说明内核没连上;如果一直是 [*],可能是内核卡死或被阻塞。
- 先看右上角 kernel 状态:灰色 → 重启 kernel(
Kernel → Restart);若重启失败,说明内核本身损坏或缺失 - 终端里启动 notebook 时有没有报错?比如
ImportError: No module named 'ipykernel'或tornado >= 6.1版本冲突,这类错误会静默导致 kernel 启动失败 - Windows 用户特别注意:用户名含中文或 TEMP/TMP 环境变量路径含中文/空格,会导致 kernel 启动后立即退出,现象就是“点了运行,什么也不发生”
- 临时验证:在终端执行
jupyter console,如果也打不开,基本可锁定是 ipykernel 或依赖包问题
明明代码执行了,但单元格里空空如也
这不是 bug,是 Jupyter 的默认行为:只有最后一行表达式的结果(非赋值、非 None)才会自动显示;print() 要求输出到前端,而缓冲或截断会让它“消失”。
- 检查最后一行是不是纯赋值,比如
df = pd.read_csv("x.csv")→ 不会显示;改成df.head()或单独一行写df才能出表 - 批量处理时(如遍历几百个 PDB 文件),Jupyter 默认限制单次输出长度(约 1MB 或 1000 行),超限内容被静默丢弃,
print()看不见不等于没执行 - 用
print("xxx", flush=True)强制刷新缓冲;或改用sys.stdout.flush()配合循环 - 更稳的做法:把关键日志写进文件,比如
with open("log.txt", "a", encoding="utf-8") as f: f.write(f"{i}: ok\n")
降级 pyzmq 或 tornado 真有用吗
有用,但得看版本组合。2025–2026 年主流环境(notebook ≥ 7.0、jupyter-server ≥ 2.0)要求 tornado >= 6.3 和 pyzmq >= 24.0;旧版反而会触发兼容性崩溃。
- 先查当前版本:
pip show pyzmq tornado jupyter - 如果
tornado 或 <code>pyzmq ,大概率 kernel 启动失败,应升级而非降级 - 如果报
zmq.error.ZMQError: Permission denied,通常是 pyzmq 与系统 zmq 库冲突,可试pip uninstall pyzmq && pip install --no-binary pyzmq pyzmq - conda 用户慎用 pip 混装:优先用
conda update pyzmq tornado ipykernel保持生态一致
Windows 中文用户名导致 kernel 启动即退出
这是真实高频问题,现象是 notebook 页面看似正常,但任何单元格都无响应,终端里 kernel 进程秒退,且无明显报错。
- 打开「系统属性 → 高级 → 环境变量」,找到用户变量里的
TEMP和TMP - 把它们的值统一改为
%SystemRoot%\TEMP(不要带中文路径、不要空格、不要自定义目录) - 改完点「确定」逐级关闭对话框,**必须重启整个命令行窗口和浏览器标签页**,否则不生效
- 验证:启动 notebook 后,新建 Python notebook,运行
import os; print(os.environ["TEMP"]),输出应为C:\WINDOWS\TEMP类似路径
真正难排查的,往往不是代码逻辑,而是环境变量路径里的一个中文字符、pyzmq 和 tornado 之间差的那 0.1 个版本号、或者 Jupyter 前端悄悄截掉了你第 1001 行 print。动手前先看 kernel 状态和终端报错,比盲目重装快得多。











