我发现自己经常使用Python的解释器来处理数据库,文件等 - 基本上是大量的半结构化数据的手动格式化。我没有像我希望的那样经常保存和清理有用的位。有没有办法将我的输入保存到shell(数据库连接,变量赋值,少量循环和逻辑位) - 交互式会话的一些历史记录?如果我使用像script
这样的东西,我会得到太多的噪音。我真的不需要腌制所有对象 - 但如果有一个解决方案可以做到这一点,那就没关系。理想情况下,我只剩下一个脚本,它以我交互式创建的脚本运行,我可以删除我不需要的位。有没有这样做的包,或DIY方法?
更新:我对这些套餐的质量和实用性感到非常惊讶。对于那些有类似痒的人:
我被转换了,这些确实填补了翻译和编辑之间的需要。
答案 0 :(得分:373)
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以快速了解这些功能。
答案 1 :(得分:142)
http://www.andrewhjon.es/save-interactive-python-session-history
import readline
readline.write_history_file('/home/ahj/history')
答案 2 :(得分:88)
有一个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
然后在shell中设置环境变量PYTHONSTARTUP
(例如在~/.bashrc
中):
export PYTHONSTARTUP=$HOME/.pystartup
您也可以添加此项以免费获得自动填充功能:
readline.parse_and_bind('tab: complete')
请注意,这仅适用于* nix系统。由于readline仅适用于Unix平台。
答案 3 :(得分:68)
答案 4 :(得分:16)
安装Ipython后,通过运行命令打开Ipython会话:
ipython
从命令行运行以下Ipython'magic'命令来自动记录整个Ipython会话:
%logstart
这将创建一个唯一命名的.py文件并存储您的会话,以便以后用作交互式Ipython会话或在您选择的脚本中使用。
答案 5 :(得分:13)
此外,reinteract为您提供了一个类似笔记本的Python会话界面。
答案 6 :(得分:11)
除了IPython之外,类似的实用程序bpython还有一个“将您输入的代码保存到文件中”功能
答案 7 :(得分: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})
您想要保存从1到135的行,然后在同一个ipython会话中使用此命令
In [137]: %save test.py 1-135
这会将你所有的python语句保存在当前目录(启动ipython的地方)的test.py文件中。
答案 8 :(得分:3)
打印和保存输入历史记录(以及可选的输出)有%历史魔力。
将当前会话存储到名为my_history.py
的文件:
>>> %hist -f my_history.py
历史记录IPython存储您输入的命令及其生成的结果。您可以使用上箭头键和下箭头键轻松浏览以前的命令,或以更复杂的方式访问历史记录。
您可以使用%history magic功能检查过去的输入和输出。来自先前会话的输入历史记录保存在数据库中,并且可以配置IPython以保存输出历史记录。
其他几个魔术功能可以使用您的输入历史记录,包括%edit,%rerun,%recall,%macro,%save和%pastebin。您可以使用标准格式来引用行:
%pastebin 3 18-20 ~1/1-5
这将从当前会话中获取第3行和第18行到第20行,并从上一个会话中获取第1-5行。
请参阅%历史记录?对于Docstring和更多示例。
另外,请务必探索%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}
要在启动时自动存储已存储的变量,请在ipython_config.py中指定c.StoreMagic.autorestore = True
。
答案 9 :(得分:3)
答案 10 :(得分: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
来清理输出(见{{3} })。
答案 11 :(得分:1)
还有另一个选择--- pyslice。 在“wxpython 2.8 docs演示和工具”中,有一个名为“pyslices”的开源程序。
你可以像编辑一样使用它,它也支持像控制台一样使用----像一个具有即时回声的交互式解释器执行每一行。
当然,每个块的所有代码块和结果都将自动记录到txt文件中。
结果记录在相应的代码块后面。非常方便。
答案 12 :(得分:1)
%history
命令非常棒,但不幸的是它不会让你将%粘贴到sesh中的东西保存下来。要做到这一点,我认为你必须做%logstart
at the beginning(虽然我没有证实这是有效的。)
我喜欢做的是
%history -o -n -p -f filename.txt
将保存输出,行号和'>>>'在每个输入之前(o,n和p选项)。请参阅%history here的文档。
答案 13 :(得分:0)
有些评论询问如何一次保存所有IPython输入。对于IPython中的%save magic,您可以如下所示以编程方式保存所有命令,以避免提示消息并避免指定输入数字。 currentLine = len(In)-1 %save -f my_session 1- $ currentLine
-f
选项用于强制文件替换,len(IN)-1
显示IPython中的当前输入提示,允许您以编程方式保存整个会话。
答案 14 :(得分:0)
对于使用spacemacs
以及ipython
附带的python-layer
的用户,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
答案 15 :(得分:0)
我想建议另一种通过linux上的tmux维护python会话的方法。你运行tmux,将你自己附加到你打开的会话(如果没有直接打开它后附加)。执行python并做任何你正在做的事情。然后脱离会话。从tmux会话中分离不会关闭会话。会议仍然开放。
此方法的优点: 你可以从任何其他设备附加到这个会话(如果你可以ssh你的电脑)
这种方法的缺点: 在您实际存在python解释器之前,此方法不会放弃已打开的python会话使用的资源。
答案 16 :(得分:0)
要在XUbuntu上保存输入和输出:
Terminal
,然后在下拉列表中查找save contents
我发现这可以保存输入和输出,一直返回到打开终端时。这不是ipython特有的,并且可以与ssh会话或从终端窗口运行的其他任务一起使用。
答案 17 :(得分:0)
在IPython中,我首先使用
In [2]: %hist
查看我以前的代码。我选择了要保存的块,然后使用my_file.py
魔术(%%writefile
的缩写)将其粘贴到文件%%file
中
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
答案 18 :(得分:-1)
如果您使用 bpython ,则所有命令历史记录默认保存为~/.pythonhist
。
要保存命令以供以后重用,您可以将它们复制到python脚本文件:
$ cp ~/.pythonhist mycommands.py
然后编辑该文件以进行清理并put it under Python path(全局或虚拟环境的网站包,当前目录,以* .pth提及,或以其他方式)。
要将命令包含在shell中,只需从保存的文件中导入它们:
>>> from mycommands import *
答案 19 :(得分:-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!
我要感谢所有喜欢我的评论的人!谢谢您阅读!