如何保存Python交互式会话?

466
我经常使用Python解释器来处理数据库、文件等——基本上是对半结构化数据的大量手动格式化。我没有正确地保存和清理有用的部分,就像我想要的那样频繁地进行操作。是否有一种方法可以保存我的输入到shell中(db连接、变量赋值、小型循环和逻辑流)——即交互式会话的历史记录?如果我使用类似script的东西,我会得到太多的stdout噪音。我真的不需要将所有对象都pickle起来——虽然如果有一个能够这样做的解决方案,那就好了。理想情况下,我只需要留下一个运行与我创建的交互式脚本相同的脚本,我可以删除我不需要的部分。是否有一个可以实现这个功能的软件包或DIY方法?
20个回答

457

IPython非常有用,如果你喜欢使用交互式会话。例如,对于你的用例,可以使用%save魔法命令,只需输入%save my_useful_session 10-20 23,即可保存输入的第10到20行和第23行到my_useful_session.py(为了帮助这点,每一行都有它的编号)。

此外,文档还指出:

这个函数使用与%history魔法命令相同的语法来指定输入范围,然后将这些行保存到您指定的文件名中。

这允许例如引用旧的会话,比如:

%save current_session ~0/
%save previous_session ~1/

您可以查看演示页面上的视频,快速了解其功能概述。


13
如何保存所有行?如果不指定范围,它会创建一个空文件。:( - balki
46
IPython的提示会告诉你历史记录中有多少行(即 In[48])。因此,“save filename 1-48” 将保存你的整个会话。 - Ben Page
18
在Bash提示符下,使用命令"ipython -i [文件名]"来加载已保存的.py文件,并返回交互式控制台!(不带-i标志运行文件后无法获得交互式控制台)。 - Samuel Lampa
2
那么如何恢复%save呢? - user4779
10
@user4779,正如预期的那样:%load my_useful_session - Daniel Serodio
显示剩余12条评论

212

以下内容来自 Andrew Jones 的网站 (存档):

import readline
readline.write_history_file('/home/ahj/history')

11
在Windows 7上为我创建一个空文件。 - ubershmekel
14
在Ubuntu上对我非常有效。 - Johndt
5
貌似它只适用于Unix操作系统。 - Joel B
40
我的TI-83出问题了。 - Dan
4
记得在会话结束时执行这个操作。如果只在开头调用函数,我的结果会显得有些空洞。 - dolphus333
显示剩余10条评论

101

有一种方法可以实现。将文件存储在~/.pystartup中...

# Add auto-completion and a stored history file of commands to your Python
# interactive interpreter. Requires Python 2.0+, readline. Autocomplete is
# bound to the Esc key by default (you can change it - see readline docs).
#
# Store the file in ~/.pystartup, and set an environment variable to point
# to it:  "export PYTHONSTARTUP=/home/user/.pystartup" in bash.
#
# Note that PYTHONSTARTUP does *not* expand "~", so you have to put in the
# full path to your home directory.

import atexit
import os
import readline
import rlcompleter

historyPath = os.path.expanduser("~/.pyhistory")

def save_history(historyPath=historyPath):
    import readline
    readline.write_history_file(historyPath)

if os.path.exists(historyPath):
    readline.read_history_file(historyPath)

atexit.register(save_history)
del os, atexit, readline, rlcompleter, save_history, historyPath

然后在你的shell中设置环境变量PYTHONSTARTUP(例如,在~/.bashrc中):

export PYTHONSTARTUP=$HOME/.pystartup

你还可以添加以下内容来免费获得自动完成:

readline.parse_and_bind('tab: complete')
请注意,这仅适用于*nix系统。因为readline仅在Unix平台上可用。

Mac OS X 使用 editline,因此可以使用 tab 键自动补全功能,但确切的命令略有不同:readline.parse_and_bind("bind ^I rl_complete")。 - Miles
那真是太快了,Nadia,非常感谢。我会尝试这两个答案——目标平台是Ubuntu,顺便提一下。 - unmounted
如果您使用MacPorts Python,则readline.parse_and_bind('tab: complete') 可正常工作。 - Phillip Cloud
3
这应该被装裱起来。适用于RHEL 6.6,Pyenv版本为2.7.10。需要翻译的内容已完整呈现。 - BilliAm
为什么我这些年没有搜索到这个! 这个解决方案很棒,因为使用了原始工具,快速而轻便。 - iman
只是“我也是”的回复,说当调试不稳定的代码时,我会手动使用它,因为如果解释器崩溃,atexit就不会发生。再次感谢您提供的好建议! - taranaki

79
如果您正在使用IPython,则可以使用魔法函数%history-f参数将所有先前的命令保存到文件中,例如:
%history -f /tmp/history.py

不确定使用 save 命令保存文件的位置,这非常有帮助。 - alpha_989
6
使用%history -g -f full_history.py命令可以获取所有会话的历史记录,而不仅仅是当前会话。请参见:%history 魔法命令文档 - Evgeni Sergeev

23
在安装了IPython之后,通过运行命令打开一个IPython会话:
ipython

只需从您的命令行运行以下Ipython“魔术”命令,即可自动记录您的整个Ipython会话:

%logstart

这将创建一个带有唯一名称的.py文件,并将您的会话存储以便稍后用作交互式Ipython会话或用于您选择的脚本中。


14

此外,reinteract 可以为你提供类似笔记本的界面来查看 Python 会话。


4
reinteract 现已被 IPython Notebook 和 QtConsole 取代。 - Eric O. Lebigot

11

我必须努力寻找答案,因为我对iPython环境非常陌生。

这将起作用。

如果您的iPython会话看起来像这样

In [1] : import numpy as np
....
In [135]: counter=collections.Counter(mapusercluster[3])
In [136]: counter
Out[136]: Counter({2: 700, 0: 351, 1: 233})

如果您想保留从1到135行的内容,然后在同一个IPython会话中使用此命令:

In [137]: %save test.py 1-135

这将把您所有的Python语句保存在test.py文件中,该文件位于您当前的目录中(即您启动IPython的位置)。


如何在PyCharm中使用Anaconda进行此操作。 - Saran Zeb

11

除了IPython外,类似的工具bpython还具有“将输入的代码保存到文件”的功能。


3
有人能解释一下如何在bpython中执行这个操作吗?我尝试了Ctrl + S,但它没有起作用(版本0.14.2,在Python 3.4.3上运行Gnome终端)。 - Yibo Yang
默认情况下,它绑定到 F7。按 F1 可以显示帮助和当前键绑定。 - Jim K.
F7启动外部编辑器。Ctrl+s应该提示进行简单的保存到文件功能,但在bash和zsh中它被绑定为“停止”,因此您需要在bpython配置中选择替代选项。 - RCross

4

有一个%history魔法命令可以打印和保存输入历史记录(以及可选的输出)。

要将当前会话存储到名为my_history.py的文件中:

>>> %hist -f my_history.py

历史记录 IPython 存储您输入的命令和产生的结果。您可以使用上下箭头键轻松浏览以前的命令,或以更复杂的方式访问您的历史记录。

您可以使用 %history 魔法函数来查看过去的输入和输出。来自以前会话的输入历史记录保存在数据库中,并且可以配置 IPython 以保存输出历史记录。

还有几个其他魔法函数可以使用您的输入历史记录,包括 %edit、%rerun、%recall、%macro、%save 和 %pastebin。您可以使用标准格式引用行:

%pastebin 3 18-20 ~1/1-5

这将从当前会话中获取第3行和第18到20行,以及从上一个会话中获取第1至5行。
有关文档字符串和更多示例,请参见%history?。
此外,请务必探索IPython中%store magic的轻量级变量持久性功能。
在IPython的数据库中存储变量、别名和宏。
d = {'a': 1, 'b': 2}
%store d  # stores the variable
del d

%store -r d  # Refresh the variable from IPython's database.
>>> d
{'a': 1, 'b': 2}

为了在启动时自动恢复存储的变量,请在 ipython_config.py 中指定 c.StoreMagic.autorestore = True

在配置文件中启用c.HistoryManager.db_log_output即可启用保存输出历史记录的功能。 - Ikke

4
< p > %history 命令很棒,但不幸的是它不能让你保存被 %paste 插入会话中的内容。要做到这一点,我认为你必须在开头执行 %logstart (虽然我没有确认这是否有效)

我喜欢做的事情是

%history -o -n -p -f filename.txt

这将保存输出、行号和每个输入前面的“>>>”符号(o、n 和 p 选项)。请参见 %history 文档 此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接