如何保存Python交互式会话?


416

我发现自己经常使用Python的解释器来处理数据库,文件等-基本上是半结构化数据的大量手动格式化。我没有按我的意愿正确地保存和清理有用的位。有没有一种方法可以将我的输入保存到外壳中(数据库连接,变量分配,很少用于循环和逻辑位)-交互式会话的一些历史记录?如果我使用类似的东西,script则会收到过多的标准输出噪音。我真的不需要腌制所有对象-尽管如果有解决方案可以做到这一点,那就可以了。理想情况下,我只剩下一个脚本,该脚本可以像我交互式创建的那样运行,并且我可以删除不需要的部分。是否有这样做的包装或DIY方法?

更新:我对这些软件包的质量和实用性感到非常惊讶。对于那些类似的痒:

  • IPython-早就应该使用它了
  • 重新互动 -非常令人印象深刻,我想了解有关可视化的更多信息,这似乎会在这里闪耀。排序图的gtk / gnome桌面应用程序。想象一下混合壳+图形计算器+迷你月食。此处的源代码分发:http : //www.reinteract.org/trac/wiki/GettingIt。可以在Ubuntu上很好地构建,也可以集成到gnome桌面,Windows和Mac安装程序中。
  • bpython-非常酷,有很多不错的功能,自动完成(!),倒带,一键保存到文件,缩进,做得很好。Python源代码发行版从sourceforge中提取了两个依赖项。

我被转换了,这些真的满足了解释器和编辑器之间的需求。

Answers:


411

如果您喜欢使用交互式会话,则IPython非常有用。例如,对于您的用例,有一个%savemagic命令,您只需输入%save my_useful_session 10-20 23以保存输入行10至20和23至my_useful_session.py(为此,每行都以其编号作为前缀)。

此外,文档指出:

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

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

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

观看演示页面的视频,以快速了解这些功能。


11
如何保存所有行?如果不指定范围,它将创建一个空文件。:(
balki 2011年

40
@ balki,IPython的提示会告诉您历史记录中有多少行(即In[48])。因此save filename 1-48将节省您的整个会话。
本·佩奇

2
另外,是否可以将此文件加载回ipython并保持输入历史记录完整?
本·佩奇

15
@BenPage在bash程序中对保存的.py文件使用“ ipython -i [文件名]”,以便在返回交互式控制台之前将文件加载回!(不带-i标志,运行文件后您将不会获得交互式控制台)。
塞缪尔·兰帕

9
@ user4779,正如人们所期望的那样:%load my_useful_session
Daniel Serodio '17

167

http://www.andrewhjon.es/save-interactive-python-session-history

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

10
在Windows 7上为我创建一个空文件
ubershmekel,2013年

10
在Ubuntu中对我来说就像是一种魅力。
Johndt6'9

4
@ubershmekel-看起来它仅适用于Unix
Joel B

28
我的TI-83失败

1
请记住在会话结束时进行操作。我的只是在开始调用该函数后,看上去有点空。
dolphus333 '16

95

有一个 方法可以做到。将文件存储在~/.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

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

export PYTHONSTARTUP=$HOME/.pystartup

您还可以添加以下内容以免费获取自动完成功能:

readline.parse_and_bind('tab: complete')

请注意,这仅适用于* nix系统。由于readline仅在Unix平台上可用。


Mac OS X使用Editline,因此具有制表符完成功能,但是确切的命令有所不同:readline.parse_and_bind(“ bind ^ I rl_complete”)
Miles

那太快了,纳迪亚,非常感谢。我将尝试两个答案-目标平台是Ubuntu,BTW
卸载

readline.parse_and_bind('tab: complete')如果使用MacPorts Python,则可以使用。
菲利普·

3
这应该是框架。在RHEL 6.6上工作。Pyenv,2.7.10。
BilliAm

为什么这些年来我都没有搜索!该解决方案非常适合使用快速,轻便的原始工具。
iman


19

安装Ipython并通过运行以下命令打开Ipython会话后:

ipython

从命令行中,只需运行以下Ipython'magic'命令以自动记录整个Ipython会话:

%logstart

这将创建一个唯一命名的.py文件,并存储您的会话,以供以后用作交互式Ipython会话或在您选择的脚本中使用。



11

除了IPython,类似的实用程序bpython还具有“将您输入的代码保存到文件中”的功能


3
谁能解释一下如何使用bpython完成此操作?我尝试了ctrl + s,但没有用(在运行Gnome终端的Python 3.4.3之上的0.14.2版本)
Yang

默认情况下绑定到F7。F1将向您显示帮助和当前的绑定。
Jim K.

F7启动外部编辑器。Ctrl + s应该提示您提供一个简单的保存到文件功能,但是在bash和zsh中它必然会“停止”,因此您需要在bpython配置中选择一个替代方法。
RCross

8

我必须努力寻找答案,我对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语句保存在当前目录(启动ipython的位置)的test.py文件中。


3

有%history魔术可用于打印和保存输入历史记录(以及可选的输出)。

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

>>> %hist -f my_history.py

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

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

其他几个魔术功能也可以使用您的输入历史记录,包括%edit,%rerun,%recall,%macro,%save和%pastebin。您可以使用标准格式来引用行:

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

这将占用当前会话的第3行和第18至20行,以及上一会话的第1-5行。

看到%history?Docstring和更多示例。

另外,请确保探索%store magic在IPython中实现变量的轻量级持久性的功能。

在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}

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


可以通过c.HistoryManager.db_log_output在配置文件中启用来启用保存输出历史记录。
Ikke 2013年

3

只是在碗里放另一个建议: Spyder

在此处输入图片说明

它具有历史记录日志变量资源管理器。如果您使用过MatLab,那么您将看到相似之处。


2

就Linux而言,人们可以使用script命令来记录整个会话。它是util-linux软件包的一部分,因此应在大多数Linux系统上使用。您可以创建将要调用的别名或函数script -c python,并将其保存到typescript文件中。例如,这是一个这样的文件的重印。

$ cat typescript                                                                                                      
Script started on Sat 14 May 2016 08:30:08 AM MDT
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 'Hello Pythonic World'
Hello Pythonic World
>>> 

Script done on Sat 14 May 2016 08:30:42 AM MDT

这里的一个小缺点是script,无论何时碰到退格键等等,它都会记录所有内容,甚至是换行。因此,您可能希望使用它col来清理输出(请参阅Unix&Linux Stackexchange上的这篇文章)。


2

%history命令很棒,但不幸的是,它不会让您将%paste的内容保存到sesh中。为此,我认为您必须在一开始就做%logstart (尽管我尚未确认这项工作有效)。

我喜欢做的是

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

它将在每个输入之前保存输出,行号和'>>>'(o,n和p选项)。在此处查看%history的文档。


1

还有另一种选择--- pyslice。在“ wxpython 2.8文档演示和工具”中,有一个名为“ pyslices”的开源程序。

您可以像编辑器一样使用它,它还可以像控制台一样使用----像执行即时回显的交互式解释器一样执行每一行。

当然,所有代码块和每个块的结果将自动记录到txt文件中。

结果记录在相应的代码块后面。很方便。

切片的概述


PySlices作者在这里。很高兴您喜欢PySlices(甚至找到了它)。它还不是完全废弃的软件(我实际上仍然在使用它),但是wxPython本身包含的版本通常运行不佳。如果你想跟着更新,您可以从wx_py包让他们:pypi.python.org/pypi/wx_pygithub.com/davidmashburn/wx_py
大卫

1

如果使用bpython,则默认情况下所有命令历史记录都保存到~/.pythonhist

要保存命令以供以后重用,可以将它们复制到python脚本文件中:

$ cp ~/.pythonhist mycommands.py

然后编辑该文件以将其清理并放在Python路径(全局或虚拟环境的站点包,当前目录,*。pth中提及或其他方式)下。

要将命令包括到您的shell中,只需从保存的文件中导入它们:

>>> from mycommands import *

生活的救星。很难找到答案
Mehdi LAMRANI,

0

一些评论询问如何立即保存所有IPython输入。对于IPython中的%s magic,可以如下所示以编程方式保存所有命令,以避免出现提示消息,也避免指定输入数字。currentLine = len(In)-1%保存-f my_session 1- $ currentLine

-f选项用于强制替换文件,并len(IN)-1在IPython中显示当前输入提示,从而允许您以编程方式保存整个会话。


0

对于那些使用spacemacsipython附带的用户python-layer,由于在后台运行恒定的自动完成命令,例如save,魔术会产生很多不需要的输出:

len(all_suffixes)
';'.join(__PYTHON_EL_get_completions('''len'''))
';'.join(__PYTHON_EL_get_completions('''all_substa'''))
len(all_substantives_w_suffixes)
';'.join(__PYTHON_EL_get_completions('''len'''))
';'.join(__PYTHON_EL_get_completions('''all'''))
';'.join(__PYTHON_EL_get_completions('''all_'''))
';'.join(__PYTHON_EL_get_completions('''all_w'''))
';'.join(__PYTHON_EL_get_completions('''all_wo'''))
';'.join(__PYTHON_EL_get_completions('''all_wor'''))
';'.join(__PYTHON_EL_get_completions('''all_word'''))
';'.join(__PYTHON_EL_get_completions('''all_words'''))
len(all_words_w_logograms)
len(all_verbs)

为了避免这种情况,只需像平时保存其他任何文件一样保存ipython缓冲区即可: spc f s


0

我想提出另一种在Linux上通过tmux维护python会话的方法。您运行tmux,将自己附加到您打开的会话中(如果直接打开后未附加)。执行python并在上面执行任何操作。然后脱离会话。从tmux会话中分离不会关闭该会话。会话保持打开状态。

这种方法的优点: 您可以从任何其他设备连接到此会话(以防万一您可以SSH电脑)

此方法的缺点: 在您实际存在python解释器之前,此方法不会放弃打开的python会话使用的资源。


0

要在XUbuntu上保存输入和输出

  1. 在XWindows中,从Xfce终端应用程序运行iPython
  2. Terminal在顶部菜单栏中单击,然后在save contents下拉菜单中查找

我发现这可以保存输入和输出,一直到打开终端时一直返回。这不是ipython特有的,并且可以与ssh会话或从终端窗口运行的其他任务一起使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.