如何保存Python交互式会话?

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

3

在建议列表中再添加一个内容:Spyder

enter image description here

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上的这篇文章)。

1

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

您可以像使用编辑器一样使用它,它还支持像控制台一样使用——执行每行代码就像是一个交互式解释器,并立即回显结果。

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

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

the overview of pyslices


PySlices 的作者在此。很高兴您喜欢 PySlices(甚至找到了它)。它现在并不完全被抛弃(实际上我仍在使用它),但是 wxPython 自带的版本通常不太好用。如果您想要跟进更新,可以从 wx_py 包中获取:https://pypi.python.org/pypi/wx_py,https://github.com/davidmashburn/wx_py - David

1

IPython 中,我首先使用

In [2]: %hist

要查看我的过去代码。我选择要保存的块,然后使用%%file魔法将其粘贴到文件my_file.py中(缩写为%%writefile

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

0
如果您使用bpython,则默认情况下所有命令历史记录都保存在~/.pythonhist中。
为了将命令保存以备将来重用,您可以将它们复制到Python脚本文件中:
$ cp ~/.pythonhist mycommands.py

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

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

>>> from mycommands import *

救命稻草。一个难以找到的答案。 - Mehdi LAMRANI

0

在XUbuntu上保存输入和输出:

  1. 在XWindows中,从Xfce终端应用程序运行iPython
  2. 单击顶部菜单栏中的终端,并在下拉菜单中查找保存内容

我发现这样可以保存输入和输出,一直回溯到我打开终端的时候。这不是ipython特定的,也适用于从终端窗口运行的ssh会话或其他任务。


0
一些评论问如何一次保存所有的IPython输入。对于IPython中的%save Magic,您可以编程方式保存所有命令,以避免提示消息并避免指定输入编号,如下所示。 currentLine = len(In)-1 %save -f my_session 1-$currentLine -f选项用于强制文件替换,len(IN)-1显示IPython中当前输入提示,允许您编程方式保存整个会话。

0

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

这种方法的优点: 您可以从任何其他设备附加到此会话(如果您可以通过ssh连接到您的计算机)

这种方法的缺点: 此方法不会释放已打开的Python会话使用的资源,直到您实际退出Python解释器。


0
对于那些使用 spacemacs 和带有 python-layeripython 的人来说,由于后台不断工作的自动补全命令(例如: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

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

我要感谢所有喜欢我的评论的人!谢谢你们阅读这篇文章!


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