如何保存Python交互式会话?

时间:2009-06-03 23:21:03

标签: python shell read-eval-print-loop interactive-session

我发现自己经常使用Python的解释器来处理数据库,文件等 - 基本上是大量的半结构化数据的手动格式化。我没有像我希望的那样经常保存和清理有用的位。有没有办法将我的输入保存到shell(数据库连接,变量赋值,少量循环和逻辑位) - 交互式会话的一些历史记录?如果我使用像script这样的东西,我会得到太多的噪音。我真的不需要腌制所有对象 - 但如果有一个解决方案可以做到这一点,那就没关系。理想情况下,我只剩下一个脚本,它以我交互式创建的脚本运行,我可以删除我不需要的位。有没有这样做的包,或DIY方法?

更新:我对这些套餐的质量和实用性感到非常惊讶。对于那些有类似痒的人:

  • IPython - 应该已经使用了很多年了,我记得的那种
  • reinteract - 非常令人印象深刻,我想了解更多有关可视化的知识,这似乎会在那里发光。一种gtk / gnome桌面应用程序,用于内嵌图形。想象一下混合壳+图形计算器+迷你蚀。来源分布在这里:http://www.reinteract.org/trac/wiki/GettingIt。在Ubuntu上运行良好,也集成到gnome桌面,Windows和Mac安装程序中。
  • bpython - 非常酷,很多不错的功能,自动完成(!),倒带,一键击保存到文件,缩进,做得好。 Python源代码分发,从sourceforge中提取了几个依赖项。

我被转换了,这些确实填补了翻译和编辑之间的需要。

20 个答案:

答案 0 :(得分:373)

如果您喜欢使用交互式会话,

IPython非常有用。例如,对于您的用例,有the %save magic command,您只需输入%save my_useful_session 10-20 23即可将输入行10到20和23保存到my_useful_session.py(为了帮助解决此问题,每行都以其为前缀)数)。

此外,文档说明:

  

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

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

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

查看the videos on the presentation page以快速了解这些功能。

答案 1 :(得分:142)

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

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

答案 2 :(得分:88)

有一个way来做。将文件存储在~/.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平台。

答案 3 :(得分:68)

如果您使用的是IPython,则可以使用 %history -f 参数将以前的所有命令保存到文件中,pe:

%history -f /tmp/history.py

答案 4 :(得分:16)

安装Ipython后,通过运行命令打开Ipython会话:

ipython
从命令行

运行以下Ipython'magic'命令来自动记录整个Ipython会话:

%logstart

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

答案 5 :(得分:13)

此外,reinteract为您提供了一个类似笔记本的Python会话界面。

答案 6 :(得分:11)

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

答案 7 :(得分:6)

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

答案 8 :(得分:3)

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

将当前会话存储到名为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行。

请参阅%历史记录?对于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}

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

答案 9 :(得分:3)

在碗里放另一个暗示: Spyder

enter image description here

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

答案 10 :(得分: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来清理输出(见{{3} })。

答案 11 :(得分:1)

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

你可以像编辑一样使用它,它也支持像控制台一样使用----像一个具有即时回声的交互式解释器执行每一行。

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

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

the overview of pyslices

答案 12 :(得分:1)

%history命令非常棒,但不幸的是它不会让你将%粘贴到sesh中的东西保存下来。要做到这一点,我认为你必须做%logstart at the beginning(虽然我没有证实这是有效的。)

我喜欢做的是

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

将保存输出,行号和'>>>'在每个输入之前(o,n和p选项)。请参阅%history here的文档。

答案 13 :(得分:0)

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

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

答案 14 :(得分:0)

对于使用spacemacs以及ipython附带的python-layer的用户,save magic会产生大量不需要的输出,因为在后台工作的常量自动完成命令如:

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

答案 15 :(得分:0)

我想建议另一种通过linux上的tmux维护python会话的方法。你运行tmux,将你自己附加到你打开的会话(如果没有直接打开它后附加)。执行python并做任何你正在做的事情。然后脱离会话。从tmux会话中分离不会关闭会话。会议仍然开放。

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

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

答案 16 :(得分:0)

要在XUbuntu上保存输入和输出

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

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

答案 17 :(得分:0)

IPython中,我首先使用

In [2]: %hist

查看我以前的代码。我选择了要保存的块,然后使用my_file.py魔术(%%writefile的缩写)将其粘贴到文件%%file

In [3]: %%file my_file.py
   ...: # paste code here 
   ...:  
   ...:  

最后两次击中回合。

要附加到文件,请使用选项-a%%file -a my_file.py

如果需要,我可以使用感叹号在基础命令行中列出,编辑等文件。

In [5]: !ls -l my_file.py
In [6]: !vi my_file.py

答案 18 :(得分:-1)

如果您使用 bpython ,则所有命令历史记录默认保存为~/.pythonhist

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

$ cp ~/.pythonhist mycommands.py

然后编辑该文件以进行清理并put it under Python path(全局或虚拟环境的网站包,当前目录,以* .pth提及,或以其他方式)。

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

>>> from mycommands import *

答案 19 :(得分:-1)

您可以使用内置函数open:我在所有 需要在其中存储一些历史记录的程序(包括计算器等) 例如:

#gk-test.py or anything else would do
try: # use the try loop only if you haven't created the history file outside program
    username = open("history.txt").readline().strip("\n")
    user_age = open("history.txt").readlines()[1].strip("\n")
except FileNotFoundError:
    username = input("Enter Username: ")
    user_age = input("Enter User's Age: ")
    open("history.txt", "w").write(f"{username}\n{user_age}")
#Rest of the code is secret! try it your own!

我要感谢所有喜欢我的评论的人!谢谢您阅读!