我发现自己经常使用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的
它具有历史记录日志和变量资源管理器。如果您使用过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文件中。
结果记录在相应的代码块后面。很方便。
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 *