经过一些搜索和搜索IPython documentation和一些code之后,我似乎无法弄清楚是否可以存储命令历史记录(不输出日志)到文本文件而不是SQLite数据库。 ipython --help-all
似乎表明此选项不存在。
这对于控制.bash_history等常用命令的版本非常有用。
编辑:Working solution基于@ minrk的回答。
答案 0 :(得分:31)
您可以将IPython中的所有历史记录导出为这样的文本文件。
%history -g -f filename
获得所需内容的一种方法可能是在git hook中进行导出。我通常将这些“同步外部资源”操作放在post-checkout git hook中。
答案 1 :(得分:5)
您可以通过在其中一个启动脚本中添加此行为来模拟bash的行为(例如$(ipython locate profile)/startup/log_history.py
:
import atexit
import os
ip = get_ipython()
LIMIT = 1000 # limit the size of the history
def save_history():
"""save the IPython history to a plaintext file"""
histfile = os.path.join(ip.profile_dir.location, "history.txt")
print("Saving plaintext history to %s" % histfile)
lines = []
# get previous lines
# this is only necessary because we truncate the history,
# otherwise we chould just open with mode='a'
if os.path.exists(histfile):
with open(histfile, 'r') as f:
lines = f.readlines()
# add any new lines from this session
lines.extend(record[2] + '\n' for record in ip.history_manager.get_range())
with open(histfile, 'w') as f:
# limit to LIMIT entries
f.writelines(lines[-LIMIT:])
# do the save at exit
atexit.register(save_history)
请注意,这会模仿bash / readline历史行为,因为它会在解释器崩溃时失败等。
如果您真正想要的是只有一些手动收藏命令可用于readline(完成,^ R搜索等),您可以进行版本控制,此启动文件将允许您自己维护该文件,这将纯粹是除了IPython的实际命令历史之外:
import os
ip = get_ipython()
favfile = "readline_favorites"
def load_readline_favorites():
"""load profile_dir/readline_favorites into the readline history"""
path = os.path.join(ip.profile_dir.location, favfile)
if not os.path.exists(path):
return
with open(path) as f:
for line in f:
ip.readline.add_history(line.rstrip('\n'))
if ip.has_readline:
load_readline_favorites()
将其放在您的profile_default/startup/
目录中,然后修改profile_default/readline_favorites
或您希望保留该文件的任何位置,并在每个IPython会话中显示在readline完成等中。
答案 2 :(得分:4)
要保存Ipython会话历史记录:
%save [filename] [line start - line end]
例如:
%save ~/Desktop/Ipython_session.txt 1-31
这只会保存该特定会话的ipython历史记录,而不会保存ipython命令的整个历史记录。
答案 3 :(得分:2)
您还可以选择要保存的行。例如
%history 1 7-8 10 -f /tmp/bar.py
这会将第1、7至8和10行保存到临时文件bar.py。如果您需要整体,则跳过该行的一部分。
%history -f /tmp/foo.py
答案 4 :(得分:0)
使用纯文本文件来存储历史记录会导致来自不同会话的命令被交错,并且使得添加诸如“从session-x运行第三个命令”或在历史记录中回溯等功能变得过于复杂和缓慢。因此是sqlite数据库,
但是,将脚本转储历史记录写入文件并同时执行stat也应该非常容易。您使用文本文件执行的所有操作都应该适用于sqlite。