python shell的无法保存_关于shell:如何保存Python交互式会话?

我发现自己经常使用Python的解释器来处理数据库,文件等-基本上是半结构化数据的许多手动格式化。我没有按我想的那样适当地保存和清理有用的位。有没有一种方法可以将我的输入保存到外壳中(数据库连接,变量分配,很少用于循环和逻辑位)-交互式会话的一些历史记录?如果使用script之类的东西,则会收到过多的标准输出噪音。我真的不需要腌制所有对象-尽管如果有解决方案,那就可以了。理想情况下,我只剩下一个脚本,该脚本可以像我交互式创建的那样运行,并且我可以删除不需要的部分。是否有这样做的包装或DIY方法?

更新:我对这些软件包的质量和实用性感到非常惊讶。对于那些类似的痒:

IPython-早就应该使用它了

重新互动-非常令人印象深刻,我想了解有关可视化的更多信息,这似乎会在这里大放异彩。排序图的gtk / gnome桌面应用程序。想象一下混合壳+图形计算器+迷你月食。此处的源代码分发:http://www.reinteract.org/trac/wiki/GettingIt。可以在Ubuntu上很好地构建,也可以集成到gnome桌面,Windows和Mac安装程序中。

bpython-非常酷,有很多不错的功能,自动完成(!),倒带,一键保存到文件,缩进,做得很好。 Python源代码发行版从sourceforge中提取了两个依赖项。

我被转换了,这些真的满足了解释器和编辑器之间的需求。

如果您喜欢使用交互式会话,则IPython非常有用。例如,对于您的用例,有一个%save magic命令,您只需输入%save my_useful_session 10-20 23即可保存输入行10至20和23到my_useful_session.py(为此,每行都以其编号作为前缀)。

此外,文档指出:

This function uses the same syntax as %history for input ranges, then saves the lines to the filename you specify.

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

1

2%save current_session ~0/

%save previous_session ~1/

观看演示页面上的视频,以快速了解这些功能。

如何保存所有行?如果不指定范围,它将创建一个空文件。 :(

@ balki,IPythons提示会告诉您历史记录中有多少行(即In[48])。所以save filename 1-48将保存您的整个会话。

另外,是否可以将此文件加载回ipython并保持输入历史记录完整?

嗯,我在Enthought pylab提示符下尝试时遇到SyntaxError:语法无效的问题,它应该是IPython 12.1,但找不到在IPython站点上记录的此保存命令...

@SamJoseph:请使用%save my_useful_session 10-20 23(如示例中所示),不要忘记百分号

feinmann-谢谢-就这样-也许我可以编辑答案以使答案显而易见...但显然不是,因为编辑必须至少包含6个字符...

@BenPage在bash promt中对已保存的.py文件使用" ipython -i [文件名]",以便在返回交互式控制台之前将文件加载回! (不带-i标志,运行文件后您将不会获得交互式控制台)。

这个功能在哪里?当我从ipython尝试时,有一个保存功能,但" help(save)"表示未定义保存。如果我加载ipython --pylab,则"保存"功能不相同,它是numpy中的一个。我想从ipython调用ipython.save,但是如果可能的话我使用pylab。

@mathtick:Python函数和IPython命令之间有区别(后者就像* nix中内置的shell)-因此要使用的命令是%save,这是IPython的一部分。参见ipython.org/ipython-doc/rel-0.10.2/html/interactive/

如果要附加到文件而不是覆盖文件,请使用-a选项进行保存。示例:%save -a my_useful_session 10-20 23

那么,如何恢复之后的%save?

@ user4779,正如人们所期望的那样:%load my_useful_session

到目前为止,最简单的方法是Linux Python2,下面是Robertos的答案。所有内置的,只是普通的作品。 import readline然后readline.write_history_file(homeahjhistory)

问题是我试图使用virtualenv,它不能与jupyter一起使用

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

1

2import readline

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

在Windows 7上为我创建一个空文件

在Ubuntu中对我来说就像是一种魅力。

@ubershmekel-看起来只能在Unix上使用

在我的TI-83上失败

请记住在会话结束时进行操作。我的只是在开始调用该函数后,看上去有点空。

适用于在Win 32上运行的Python 2.7.2(默认值,2011年6月12日15:08:59)[MSC v.1500 32位(英特尔)]; Windows 7的

在Ubuntu 16.04 Python 3.6上对我来说是空白

在macOS上给了我一堆奇怪的废话

在Ubuntu 16.04 LTS和Raspberry Pi上适用于Python2的PERFECT。无需特殊的调味料。全部内置。非常感谢!

在MacOS上为我工作

可在Ubuntu 16.04.3 Python 3.5.2上运行,但它可以保存所有历史记录,而不仅仅是当前会话

链接现在似乎已断开,仅显示connecting...白屏

当您只有Python时非常有用。

有一种方法可以做到。将文件存储在~/.pystartup中...

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26# 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中):

1export PYTHONSTARTUP=$HOME/.pystartup

您还可以添加以下内容以免费获取自动完成功能:

1readline.parse_and_bind('tab: complete')

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

Mac OS X使用editline,因此有可用的制表符完成功能,但是确切的命令不同:readline.parse_and_bind(" bind ^ I rl_complete")

@Miles,感谢您的信息

那太快了,纳迪亚,非常感谢。我将尝试两个答案-目标平台是Ubuntu,BTW

如果使用MacPorts Python,则readline.parse_and_bind(tab: complete)可以工作。

在cygwin中就像一个魅力!谢谢!

这应该是框架。在RHEL 6.6上工作。 Pyenv,2.7.10。

这些年来,为什么我没有搜索!该解决方案非常适合使用快速,轻便的原始工具。

我只是在调试不稳定的代码时手动使用此命令,因为如果解释器出现段错误,则atexit不会发生。再次感谢您的宝贵建议!

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

1%history -f /tmp/history.py

使用save魔术无法确定文件的位置。 这很有帮助

使用%history -g -f full_history.py可以获取所有会话的历史记录,而不仅仅是当前会话。 另请参阅:%history文档。

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

1ipython

从命令行中,只需运行以下Ipython'magic'命令以自动记录整个Ipython会话:

1%logstart

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

同样,重新交互为您提供了类似于笔记本的Python会话界面。

reinteract现在已由IPython Notebook和QtConsole取代。

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

谁能解释一下如何使用bpython完成此操作?我尝试了ctrl + s,但没有成功(在运行Gnome终端的Python 3.4.3之上的版本0.14.2)

默认情况下绑定到F7。 F1将向您显示帮助和当前的绑定。

我必须努力寻找答案,我对iPython环境非常陌生。

这会起作用

如果您的iPython会话如下所示

1

2

3

4

5In [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会话上使用此命令

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

这会将所有python语句保存在当前目录(启动ipython的位置)的test.py文件中。

相关蚂蚁答案

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

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

1>>> %hist -f my_history.py

历史记录IPython既存储您输入的命令,又存储它产生的结果。您可以使用上下箭头键轻松查看以前的命令,或者以更复杂的方式访问历史记录。

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

其他一些魔术功能也可以使用您的输入历史记录,包括%edit,%rerun,%recall,%macro,%save和%pastebin。您可以使用标准格式来引用行:

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

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

看到%history? Docstring和更多示例。

另外,请确保探索%store magic在IPython中实现变量的轻量级持久性的功能。

Stores variables, aliases and macros in IPython’s database.

1

2

3

4

5

6

7d = {'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。

可以通过在配置文件中启用c.HistoryManager.db_log_output来启用保存输出历史记录。

只是在碗里放另一个建议:

Spyder的

python shell的无法保存_关于shell:如何保存Python交互式会话?_第1张图片

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

就Linux而言,可以使用script命令来记录整个会话。它是util-linux软件包的一部分,因此应在大多数Linux系统上使用。您可以创建一个别名或函数,该函数或函数将调用script -c python并将其保存到typescript文件中。例如,这是一个这样的文件的重印。

1

2

3

4

5

6

7

8

9

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

%history命令很棒,但是很遗憾,它不允许您将%paste的内容保存到sesh中。为此,我认为您必须在开始时进行%logstart(尽管我尚未确认此工作原理)。

我喜欢做的是

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

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

还有另一种选择--- pyslice。

在" wxpython 2.8文档演示和工具"中,有一个名为" pyslices"的开源程序。

您可以像编辑器一样使用它,它还可以像控制台一样使用----支持像执行即时回显的交互式解释器那样执行每一行。

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

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

python shell的无法保存_关于shell:如何保存Python交互式会话?_第2张图片

PySlices作者在这里。 很高兴您喜欢PySlices(甚至找到了它)。 它尚未完全弃用软件(我实际上仍在使用它),但是wxPython本身包含的版本通常无法正常工作。 如果要关注更新,可以从wx_py软件包中获取它们:pypi.python.org/pypi/wx_py、github.com/davidmashburn/wx_py

一些评论询问如何立即保存所有IPython输入。对于IPython中的%s magic,可以如下所示以编程方式保存所有命令,以避免出现提示消息,也避免指定输入数字。

currentLine = len(输入)-1

%save -f my_session 1- $ currentLine

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

要在XUbuntu上保存输入和输出:

在XWindows中,从Xfce终端应用程序运行iPython

单击顶部菜单栏中的Terminal,然后在下拉菜单中查找save contents

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

对于使用spacemacs和python-layer附带的ipython的用户,由于在后台运行恒定的自动完成命令,例如save,魔术会产生很多不需要的输出:

1

2

3

4

5

6

7

8

9

10

11

12

13

14len(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

我想提出另一种在Linux上通过tmux维护python会话的方法。您运行tmux,将自己附加到您打开的会话中(如果在直接打开它后未附加)。执行python并在上面执行任何操作。然后脱离会话。从tmux会话中分离不会关闭该会话。会话保持打开状态。

这种方法的优点:

您可以从任何其他设备连接到此会话(以防万一您可以SSH电脑)

这种方法的缺点:

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

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

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

1$ cp ~/.pythonhist mycommands.py

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

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

1>>> from mycommands import *

你可能感兴趣的:(python,shell的无法保存)