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

问题描述 投票:382回答:18

我发现自己经常使用Python解释器与数据库,文件等工作 - 基本上很多半结构化数据的手动格式。我不妥善保存和经常因为我想清理有用位。有没有办法救我输入到外壳(DB连接,变量赋值,有点逻辑的循环和位) - 交互式会话的一些历史?如果我使用类似script我得到太多的标准输出噪声。我并不真的需要腌制的所有对象 - 尽管如果是这样做,这将是确定的解决方案。理想我也只是留下了跑,因为我互动中创建一个脚本,我可以删除我并不需要的位。是否有一个包,这样做,或一个DIY的方法吗?

更新:我在这些包的质量和有效性感到惊讶。对于那些有类似痒:

  • IPython的 - 应该一直用这个的年龄,什么样的我脑子里想
  • reinteract - 令人印象深刻,我想更多地了解可视化和这似乎是它会闪耀在那里。排序呈现图形内嵌一个GTK / GNOME桌面应用程序。想象一下,一个混合壳+图形计算器+迷你蚀。来源分布于此:http://www.reinteract.org/trac/wiki/GettingIt。建立了良好的Ubuntu上,集成到gnome桌面,Windows和Mac安装工人了。
  • bpython - (!)酷劲十足,很多不错的功能,自动完成,快退,一个按键保存到文件,压痕,做得很好。 Python源代码分发,拉了几个依赖从SourceForge。

我转换,这些确实填写翻译和编辑之间的需求。

python shell read-eval-print-loop interactive-session
18个回答
387
投票

如果你喜欢使用的互动环节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获得的功能的简要介绍。


3
投票

只是把另一个暗示在碗里:Spyder

enter image description here

它具有历史记录和可变探险。如果你已经用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清理输出(见this post on Unix&Linux Stackexchange)。


1
投票

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

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

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

的结果记录只是的代码对应的块的后面。很方便。


1
投票

%history命令是真棒,但不幸的是它不会让您保存的东西是贴%倒是到sesh。要做到这一点,我认为你必须做%logstart at the beginning(虽然我还没有证实这工作)。

我喜欢做的是

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

这将节省每个输入(O,N,和P的选项)前的输出,行号,和“>>>”。请参阅%的历史here的文档。


0
投票

有些评论是询问如何所有的IPython的输入保存一次。对于折节省在IPython的魔法,可以编程方式保存所有的命令如下所示,以避免提示消息,并且还避免指定输入数字。 currentLine = LEN(In)的-1%节省-f my_session 1- $ currentLine

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


0
投票

对于使用spacemacs,并ipython附带python-layer,拯救魔法那些创造了很多不必要的输出,因为不断自动完成指令的底色,如工作:

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保持蟒蛇会议。您运行TMUX,附上你的自我,你打开的会话(如果直接打开它后不附后)。执行Python和你正在做的就可以了什么。然后从会话分离。从TMUX会话分离不关闭会话。会话保持打开状态。

这种方法的优点:您可以从任何其他设备连接到该会话(如果你可以ssh你的电脑)

这种方法的缺点:直到你实际存在的Python解释这种方法不放弃通过打开的Python会话使用的资源。


0
投票

为了节省输入和输出上的Xubuntu:

  1. 在XWindows,则来自的Xfce终端应用程序运行IPython的
  2. 在顶部的菜单栏单击Terminal并在下拉寻找save contents

我觉得这节省了输入和输出,将所有的方式回到当我打开终端。这是不特定的IPython,并将与SSH会话或从终端窗口中运行其他任务。


-1
投票

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

要保存命令后回用,你可以将它们复制到Python脚本文件:

$ cp ~/.pythonhist mycommands.py

然后编辑该文件来清理和put it under Python path(全局或虚拟环境的site-packages,当前目录中,* .pth提,或其他方式)。

要包含的命令到你的壳,只是从已保存的文件中导入:

>>> from mycommands import *

148
投票

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

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

91
投票

有一个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

然后将环境变量PYTHONSTARTUP在壳(例如,在~/.bashrc):

export PYTHONSTARTUP=$HOME/.pystartup

您还可以添加这提供自动免费:

readline.parse_and_bind('tab: complete')

请注意,这只会在* nix系统上运行。由于readline的是只在Unix平台上可用。


72
投票

如果你正在使用IPython你可以使用神奇的功能%history使用-f参数,体育课保存到一个文件中的所有以前的命令:

%history -f /tmp/history.py

17
投票

安装Ipython,并通过运行命令打开一个IPython的会议后:

ipython

从你的命令行,只需运行以下IPython的“魔力”命令来自动记录您的整个IPython的会议:

%logstart

这将创建一个唯一命名的.py文件和存储您的会话作为交互的IPython会话或在您选择的脚本(S)使用以后使用。


14
投票

此外,reinteract给你一个笔记本一样的接口为Python会话。


11
投票

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


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

要保存,然后在同一会话的IPython使用该命令行模式从1至135

In [137]: %save test.py 1-135

这将节省在test.py文件所有的Python语句在当前目录(你启动的IPython的)。


3
投票

有历史%的魔法打印和保存输入历史(任选与输出)。

要在当前会话保存到一个文件名为my_history.py

>>> %hist -f my_history.py

历史IPython中同时存储输入的命令,它产生的结果。您可以轻松地去通过与上调以前的命令和向下箭头键,或访问你的历史在更复杂的方式。

您可以使用历史%的神奇功能检查过去的输入和输出。历届会议输入历史记录将保存在数据库中,和IPython都可以配置为保存输出历史。

其他几个魔术函数可以使用您的输入历史,包括编辑%,再跑%,%的召回,%宏,%保存并%引擎收录。您可以使用标准格式来指代线:

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

这将需要线3,并从当前会话线18至20,并且线1-5从以前的会话。

请参见%的历史?对于文档字符串和更多的例子。

此外,一定要探索%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}

为了autorestore上启动存储变量,specifyc.StoreMagic.autorestore = True在ipython_config.py。

© www.soinside.com 2019 - 2024. All rights reserved.