您如何在交互式Python中查看整个命令历史记录?


149

我正在Mac OS X上使用默认的python解释器,并且Cmd+ K(清除了)我以前的命令。我可以使用箭头键逐一浏览它们。但是bash shell中是否有--history选项之类的选项,可以显示您到目前为止输入的所有命令?


history外壳命令是像任何其他的程序。它不是bash命令中的“选项” 。
Niloct

6
准确地说:history是内置的shell。
blinry

3
对于iPython,答案是%history。并且该-g选项获得更早的会话
鲍勃·斯坦

%history -g +%edit效果最佳
Dyno Fu

刚刚问了Windows 10
Josiah Yoder

Answers:



250

用于打印整个历史记录的代码:

Python 3

单线(快速复制和粘贴):

import readline; print('\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())]))

(或更长的版本...)

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

Python 2

单线(快速复制和粘贴):

import readline; print '\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())])

(或更长的版本...)

import readline
for i in range(readline.get_current_history_length()):
    print readline.get_history_item(i + 1)

注意get_history_item()索引从1到n。


31
一支班轮:import readline; print '\n'.join([str(readline.get_history_item(i)) for i in range(readline.get_current_history_length())])
马特

24
这个答案(及其非示例性例子)说明了示例对人们的重要性。谢谢。
蒂姆·S.

8
凉!我history()在Python解释器启动脚本(由env。var指向的脚本)中添加了上述函数$PYTHONSTARTUP。从现在开始,我只需键入history()任何解释程序会话即可;-)
sxc731 '16

2
每当我忘了如何做到这一点时,我都会来这里寻找答案,谢谢丹尼斯。
费利佩·瓦尔德斯

3
我给这个知道什么时候的人加注了星标,我又回来了一次。👍🏽–
berto

45

使用python 3解释器将历史记录写入
~/.python_history


我没有这个目录,使用的是Python 3.5.2

这将适用于类似Unix的操作系统。我能够通过cat ~/.python_history
Ryan H.

1
感谢您的回答。后来我在这里的文档中发现了这一点:docs.python.org/3/library/site.html#readline-configuration
Jason V.

4
不幸的是,使用虚拟环境时历史记录似乎没有更新:-/
ChrisFreeman

4
您需要quit()口译员才能将当前会话历史记录包括在内~/.python_history
plexoos

9

如果要将历史记录写入文件:

import readline
readline.write_history_file('python_history.txt')

帮助功能提供:

Help on built-in function write_history_file in module readline:

write_history_file(...)
    write_history_file([filename]) -> None
    Save a readline history file.
    The default filename is ~/.history.

这会在ruby的撬历史记录等python会话中持续存在吗?
lacostenycoder

也许这个答案是在readline函数之前编写的,但是为什么不使用readline.write_history_file?@lacostenycoder您可以使用readline读取和写入持久的历史文件。
乔·霍洛威

@JoeHolloway酷,谢谢!我改变了答案!
马丁·托马

4

由于以上内容仅适用于python 2.x,而python 3.x(特别是3.5)则类似,但略有修改:

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

注意额外的()

(使用shell脚本解析.python_history或使用python修改以上代码是个人喜好和情况的问题恕我直言)


3
Win10 C:\>python -m pip install readline=> Collecting readline\ n Downloading https://files.pythonhosted.org/packages/f4/01/2cf081af8d880b44939a5f1b446551a7f8d59eae414277fd0c303757ff1b/readline-6.2.4.1.tar.gz (2.3MB)\ n |████████████████████████████████| 2.3MB 1.7MB/s\ n ERROR: Complete output from command python setup.py egg_info:\ n ERROR: error: this module is not meant to work on Windows\ n ----------------------------------------\ n`ERROR:命令“ python setup.py egg_info”在C:\ Users \ dblack \ AppData \ Local \ Temp \ pip-install-s6m4zkdw中失败,错误代码为1 \ readline`
bballdave025

1
@ bballdave025是的,您不能pip install readline,但是readline默认情况下已在Windows上安装。
Josiah Yoder

好吧,这使事情变得容易。感谢@JosiahYoder
bballdave025

@ bballdave025从那以后,我了解到默认情况下未在Windows上安装它,但是如果您点击链接,说明中会提供详细信息-诸如安装pyreadline之类。
Josiah Yoder

4

在IPython中,%history -g应该为您提供完整的命令历史记录。默认配置还将您的历史记录保存到用户目录中名为.python_history的文件中。


3

一个简单的函数来获取类似于unix / bash版本的历史记录。

希望它对一些新人有所帮助。

def ipyhistory(lastn=None):
    """
    param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
           Also takes -ve sequence for first n history records.
    """
    import readline
    assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
    hlen = readline.get_current_history_length()
    is_neg = lastn is not None and lastn < 0
    if not is_neg:
        flen = len(str(hlen)) if not lastn else len(str(lastn))
        for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
            print(": ".join([str(r if not lastn else r + lastn - hlen ).rjust(flen), readline.get_history_item(r)]))
    else:
        flen = len(str(-hlen))
        for r in range(1, -lastn + 1):
            print(": ".join([str(r).rjust(flen), readline.get_history_item(r)]))

片段:经过Python3测试。让我知道python2是否有故障。样品:

完整历史记录: ipyhistory()

最近的10个历史记录: ipyhistory(10)

前10个历史记录: ipyhistory(-10)

希望它能帮助小伙子们。


你好谢谢。我将您的代码段制作为文件xx.py。然后在打开python之后,我确实导入了xx。我尝试了ipyhistory(),但是它说,“ >>> ipyhistory回溯(最近一次调用为最新):文件“ <stdin>”,<module> NameError中的第1行:未定义名称“ ipyhistory”。怎么了?
灿金

我将其修改为不打印行号,因为这些行通常会妨碍我,但是我喜欢行限制功能。(即使在Unix上,我通常也会cut -c 8把它们淘汰。)
Josiah Yoder

1

@ Jason-V,真的有帮助,谢谢。然后,我找到了这些示例,并编写了自己的代码段。

#!/usr/bin/env python3
import os, readline, atexit
python_history = os.path.join(os.environ['HOME'], '.python_history')
try:
  readline.read_history_file(python_history)
  readline.parse_and_bind("tab: complete")
  readline.set_history_length(5000)
  atexit.register(readline.write_history_file, python_history)
except IOError:
  pass
del os, python_history, readline, atexit 

1

这应该给您单独打印出的命令:

import readline
map(lambda p:print(readline.get_history_item(p)),
    map(lambda p:p, range(readline.get_current_history_length()))
)

您能否更详细地说明代码的格式?您是说括号不匹配吗?
Idea4life

我已经用一些简单的缩进修复了格式。您可以删除@AleksAndreev。
克里斯·弗里曼(ChrisFreeman)

0

重排Doogle的答案,该答案不打印行号,但允许指定要打印的行数。

def history(lastn=None):
    """
    param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
           Also takes -ve sequence for first n history records.
    """
    import readline
    assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
    hlen = readline.get_current_history_length()
    is_neg = lastn is not None and lastn < 0
    if not is_neg:
        for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
            print(readline.get_history_item(r))
    else:
        for r in range(1, -lastn + 1):
            print(readline.get_history_item(r))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.