如何保存一个Python交互式会话?

我发现自己经常使用Python的解释器来处理数据库,文件等 – 基本上是大量的半结构化数据的手动格式化。 我没有正确地保存和清理有用的部分。 有没有办法将我的input保存到shell(数据库连接,variables赋值,循环和逻辑) – 一些交互式会话的历史? 如果我使用类似script东西,我会得到太多的stdout噪音。 我并不需要腌制所有的东西,但是如果有解决scheme,那就可以了。 理想情况下,我只剩下一个与我交互创build的脚本一样的脚本,我可以删除不需要的位。 有没有这样的包装,或DIY方法?

更新 :我真的很惊讶这些软件包的质量和实用性。 对于那些有类似的痒:

  • IPython – 应该已经使用了很多年了,我心里想的那种
  • reinteract – 非常令人印象深刻,我想了解更多关于可视化,这似乎将闪耀在那里。 排列内嵌graphics的gtk / gnome桌面应用程序。 想象一下混合shell+graphics计算器+迷你月蚀。 来源分布在这里: http : //www.reinteract.org/trac/wiki/GettingIt 。 在Ubuntu上构build得很好,也集成到gnome桌面,Windows和Mac安装程序中。
  • bpython – 非常酷,很多不错的function,自动完成(!),快退,一个按键保存到文件,缩进,做得好。 Python源代码分发,从sourceforge拉了一些依赖关系。

我被转换了,这些真正填补了翻译和编辑之间的需求。

如果您喜欢使用交互式会话, IPython非常有用。 例如你的用例有%save magic命令 ,你只需input%save my_useful_session 10-20 23将input行10到20和23保存到my_useful_session.py (为了解决这个问题,每一行都以其前缀数)。

此外,该文件指出:

此函数使用与%history相同的语法input范围,然后将行保存为您指定的文件名。

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

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

查看演示页面上的video以快速浏览function。

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

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

有办法做到这一点。 将文件存储在~/.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中设置环境variablesPYTHONSTARTUP (例如在~/.bashrc ):

 export PYTHONSTARTUP=$HOME/.pystartup 

您也可以添加这个来免费自动完成:

 readline.parse_and_bind('tab: complete') 

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

如果你正在使用IPython,你可以使用魔术函数%history-f参数pe:将所有以前的命令保存到一个文件中:

 %history -f /tmp/history.py 

安装Ipython后 ,运行以下命令打开Ipython会话:

 ipython 

从命令行运行下面的Ipython“magic”命令来自动logging整个Ipython会话:

 %logstart 

这将创build一个唯一命名的.py文件并存储您的会话,以便稍后用作交互式Ipython会话或用于您select的脚本中。

而且, reinteract为Python会话提供了类似笔记本的界面。

除了IPython之外,类似的实用工具bpython还有一个“保存你input到文件中的代码”的function

我不得不努力find答案,我对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文件中。

有%的历史魔术打印和保存input历史(和可选的输出)。

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

 >>> %hist -f my_history.py 

历史loggingIPython存储您input的命令及其生成的结果。 您可以使用上下箭头键轻松完成以前的命令,或以更复杂的方式访问您的历史logging。

您可以使用%历史魔术函数来检查过去的input和输出。 以前会话的input历史logging保存在数据库中,IPython可以configuration为保存输出历史logging。

其他几个魔术function可以使用您的input历史logging,包括%编辑,%重新运行,%召回,%macros,%保存和%pastebin。 您可以使用标准格式来引用行:

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

这将从当前会话中取第3行和第18至20行,并从前一会话取第1-5行。

查看%历史logging? 为Docstring和更多的例子。

另外,一定要探索%store magic在IPython中轻量级持久化variables的function。

在IPython的数据库中存储variables,别名和macros。

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

要在启动时自动存储存储的variables,请在ipython_config.py中指定c.StoreMagic.autorestore = True

把另一个build议放在碗里: Spyder

在这里输入图像说明

它有历史loggingvariables浏览器 。 如果你使用过MatLab,那么你会看到相似之处。

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

你可以像编辑器一样使用它,它也支持像控制台一样的使用—-执行每一行就像交互式解释器,带有立即回显。

当然,所有代码块和每个块的结果都会自动logging到一个txt文件中。

结果被logging在相应的代码块的后面。 很方便。

pyslices的概述

就Linux而言,可以使用script命令logging整个会话。 它是util-linux软件包的一部分,所以应该在大多数Linux系统上。 你可以创build和别名或function,将调用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 

这里的一个小缺点就是scriptlogging了所有的东西,甚至是换行符,每当你回退空间时,等等。所以你可能想用col来清理输出(参见Unix&Linux Stackexchange上的这篇文章 )。

%history命令非常棒,但是不幸的是,它不会让你把东西粘贴到sesh中。 要做到这一点,我认为你必须在开始时做%logstart (尽pipe我还没有确认这个工作)。

我喜欢做的是

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

这将在每个input(o,n和p选项)之前保存输出,行号和'>>>'。 请参阅此处 %历史logging的文档。

一些评论是问如何保存所有的IPythoninput一次。 为了在IPython中保存魔术%,可以按照如下所示以编程方式保存所有命令,以避免提示消息,也避免指定input数字。 currentLine = len(In)-1%save -f my_session 1- $ currentLine

-f选项用于强制文件replace, len(IN)-1显示IPython中的当前input提示符,允许以编程方式保存整个会话。

对于那些使用spacemacspython-layer自带的spacemacs ,由于在spacemacs工作的常量自动完成命令,保存魔法会产生大量不需要的输出,如:

 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 fs

如果你使用bpython ,所有的命令历史logging默认保存到~/.pythonhist

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

 $ cp ~/.pythonhist mycommands.py 

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

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

 >>> from mycommands import * 

我想build议在Linux上通过tmux维护python会话的另一种方法。 你运行tmux,把你的自己附加到你打开的会话(如果直接打开后没有连接)。 执行python并做任何你正在做的事情。 然后脱离会话。 从tmux会话分离不会closures会话。 会议保持开放。

这个方法的优点:你可以从任何其他设备附加到这个会话(如果你可以ssh你的电脑)

这个方法的缺点:这个方法不会放弃打开的python会话使用的资源,直到你实际存在python解释器。

Interesting Posts