如何保存Python交互会话?

我发现自己经常使用Python的解释器来处理数据库、文件等——基本上是大量的半结构化数据的手动格式化。我没有像我想的那样妥善地保存和清理有用的部分。是否有一种方法来保存我的输入到shell (db连接,变量赋值,小循环和逻辑位)——交互会话的一些历史?如果我使用类似script的东西,我会得到太多的标准输出噪声。我真的不需要pickle所有的对象——尽管如果有一个解决方案,它将是好的。理想情况下,我只会留下一个脚本,它与我交互式创建的脚本一样运行,我可以删除我不需要的部分。有没有这样的软件包,或者自己动手的方法?

221060 次浏览

有一个道路来做这件事。将文件存储在~/.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平台上可用。

如果你喜欢使用交互式会话,IPython是非常有用的。例如,对于你的用例,有%save魔术命令,你只需输入%save my_useful_session 10-20 23来保存输入行10到20和23到my_useful_session.py(为了帮助,每一行都有它的数字前缀)。

此外,文件指出:

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

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

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

查看演示页面上的视频来快速了解其特性。

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

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

来自Andrew Jones的网站(存档):

import readline
readline.write_history_file('/home/ahj/history')
只是在碗里再提一个建议: 世爵 < / p >

enter image description here

它有历史日志变量的探险家。如果你用过MatLab,你就会发现其中的相似之处。

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

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

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

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

 pyslices概述

我不得不努力寻找答案,我对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的地方)。

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

ipython

在你的命令行中,只需运行下面的Ipython 'magic'命令来自动记录你的整个Ipython会话:

%logstart

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

如果你正在使用IPython,你可以使用神奇的函数< a href = " http://ipython.org/ipython-doc/2/api/generated/IPython.core.magics.history.html IPython.core.magics.history.HistoryMagics " > < / > %历史- f参数p.e将你之前的所有命令保存到一个文件:

%history -f /tmp/history.py

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

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

>>> %hist -f my_history.py

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

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

其他几个神奇的功能可以使用您的输入历史,包括%编辑,%重新运行,%召回,%宏,%保存和%pastebin。你可以使用标准格式来引用行:

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

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

看到%历史吗?查看Docstring和更多示例。

另外,一定要探索%储存魔法在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中指定__abc0。

就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的文章)。

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

. %

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

对于那些使用spacemacspython-layer附带的ipython的人来说,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

%history命令非常棒,但不幸的是,它不能让你保存%paste 'd到sesh中的东西。要做到这一点,我认为你必须做%logstart 一开始(尽管我还没有确认这是有效的)。

我喜欢做的是

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

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

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

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

$ cp ~/.pythonhist mycommands.py

然后编辑该文件以清理它和把它放在Python路径下(全局或虚拟环境的site-packages,当前目录,在*.pth中提到,或其他方式)。

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

>>> from mycommands import *

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

此方法优点: 您可以从任何其他设备连接到此会话(如果您可以SSH您的pc)

此方法的缺点: 在python解释器真正存在之前,此方法不会放弃被打开的python会话所使用的资源。< / p >

在XUbuntu上节省输入和输出:

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

我发现这节省了输入和输出,一直追溯到我打开终端的时候。这不是特定于ipython的,它与ssh会话或从终端窗口运行的其他任务一起工作。

IPython中,我首先使用

In [2]: %hist

查看我过去的代码。我选择我想保存的数据块,然后使用%%file魔法(%%writefile的简称)将其粘贴到文件my_file.py中。

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

你可以使用内置函数open:我使用它在我所有的 我需要存储一些历史的程序(包括计算器等) 例如:< / p >

#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!

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