%history 是 IPython 内核内置的轻量级命令历史查看工具,记录当前会话中所有执行过的 Python 代码、魔法命令和 shell 命令,支持显示、搜索、导出等功能,但不自动持久化。

直接用 %history 查看执行过的命令和代码
执行过的所有 Python 代码、魔法命令、甚至 shell 命令(如 !ls),都会被 Jupyter 记录在内存历史中。%history 是最轻量、无需安装依赖的查看方式,不依赖任何扩展或配置。
常见用法:
-
%history:显示全部历史(可能很长) -
%history -l 10:只显示最近 10 条 -
%history ~1/5-10:显示上一个会话(~1)中第 5 到第 10 条命令 -
%history -g "pandas":全局搜索含pandas的历史记录(支持模糊匹配)
注意:%history 只保存当前内核会话的内容。重启内核后,历史清空;关闭浏览器但没重启内核,历史仍保留。
为什么 %history 比浏览器控制台日志更可靠
终端启动时打印的日志(如 jupyter notebook 命令输出)只包含服务器启动、内核连接等系统级事件,不记录你写的每行代码。而 %history 是 IPython 内核自身维护的执行轨迹,精度高、粒度细——连 a = 1 和 print(a) 都单独成条。
容易踩的坑:
- 误以为「命令行里按 ↑ 能翻出的历史」就是全部——其实那只是当前单元格的编辑历史,不是跨单元格的执行历史
- 用
%save保存历史到文件时忘记加-r参数,结果只存了编号没存实际内容 - 在远程内核(如 JupyterHub 或 SSH 连接)中执行
%history,看到的是远程服务器上的记录,不是本地终端的
想永久保存历史?别依赖自动机制
Jupyter 默认不会把 %history 写入磁盘。即使你关了浏览器,只要内核没重启,历史还在;但内核一崩或服务器重启,就全丢了。
手动落盘建议:
- 运行
%history -g -f history.py把带搜索关键词的历史导出为 Python 文件 - 用
%save -r 1-100 filename.py保存指定范围的输入行(不含输出) - 定期执行
%store my_var存变量,配合%store -r恢复——但这不存代码,只存变量值
第三方扩展(如 jupyter_contrib_nbextensions 的 History 直观面板)能图形化展示,但依赖前端渲染,且无法跨内核共享。真要长期归档,还是得靠主动导出 + 版本管理。
历史里看不到某段代码?先确认它是否真执行过
常见假“丢失”场景:
- 单元格是 Markdown 类型,根本没执行——
%history只记执行过的代码单元格 - 代码报错中断,但错误前的部分已执行(比如
a=1; b/0中a=1会被记入历史) - 用了
%%writefile或%run外部脚本,那些脚本里的代码不会出现在当前会话历史里 - 在 PyCharm 的 Jupyter 工具窗口里运行单元格,部分版本存在历史同步延迟,建议切换回原生浏览器验证
最稳妥的验证方式:在新单元格里执行 %who 或 list(globals().keys()),看变量是否存在——存在,说明对应代码确实跑过了,只是没被 %history 捕获到(极少见),大概率是你记错了单元格类型或执行路径。


















