持久性Python命令行历史记录

时间:2009-07-27 07:53:12

标签: interpreter python

我希望能够“向上箭头”到我在之前的Python解释器中输入的命令。我找到了readline模块,它提供了以下功能:read_history_filewrite_history_fileset_startup_hook。虽然我还不够精明,但有人可以帮忙吗?我对解决方案的看法是:

(1)修改.login PYTHONSTARTUP以运行python脚本。 (2)在该python脚本文件中执行以下操作:

def command_history_hook():
    import readline
    readline.read_history_file('.python_history')
command_history_hook()

(3)每当解释器退出时,将历史记录写入文件。我想最好的方法是在你的启动脚本中定义一个函数并使用该函数退出:

def ex():
    import readline
    readline.write_history_file('.python_history')
    exit()

但是必须使用括号退出是非常烦人的:ex()。是否有一些python糖允许ex(没有parens)运行ex函数?

是否有更好的方法可以使历史文件每次都写入?提前感谢所有解决方案/建议。

此外,我可以看到两种架构选择。一种选择是拥有统一的命令历史记录。好处是简单性(后面的替代方案使用大量文件来填充您的主目录。)缺点是您在不同终端中运行的解释器将填充彼此的命令历史记录,并且它们将覆盖彼此的历史记录。 (这对我来说没问题,因为我通常有兴趣关闭一个解释器并立即重新打开一个解码器来重新加载模块,在这种情况下,解释器的命令将被写入文件。)一种可能的解决方案来维护每个终端的单独历史文件是为您创建的每个新终端编写环境变量:

def random_key()
    ''.join([choice(string.uppercase + string.digits) for i in range(16)])

def command_history_hook():
    import readline
    key = get_env_variable('command_history_key')
    if key:
        readline.read_history_file('.python_history_{0}'.format(key))
    else:
        set_env_variable('command_history_key', random_key())

def ex():
    import readline
    key = get_env_variable('command_history_key')
    if not key:
        set_env_variable('command_history_key', random_key())
    readline.write_history_file('.python_history_{0}'.format(key))
    exit()

通过将随机密钥长度从16减少到1,您可以将乱丢您目录的文件数量减少到36,但代价是可能的重叠率(2.8%)。

5 个答案:

答案 0 :(得分:13)

我认为Python文档中的建议几乎涵盖了您想要的内容。查看第13.3节末尾的示例pystartup文件:

或查看此页:

但是,对于提供所有这些以及更多内容的开箱即用的交互式shell,请看一下使用IPython:

答案 1 :(得分:4)

尝试使用IPython作为python shell。它已经拥有了你要求的一切。他们有最受欢迎的发行包的包,所以安装应该很容易。

答案 2 :(得分:1)

自Python 3.4以来,支持开箱即用的历史记录。请参阅this bug report

答案 3 :(得分:0)

使用PIP安装 pyreadline 包:

pip install pyreadline

答案 4 :(得分:0)

如果您只想使用没有所有文件内容的交互式历史记录替换,那么您需要做的就是导入readline:

import readline

然后您可以使用向上/向下键来浏览过去的命令。 2或3相同。

从文档中我并不清楚,但也许我错过了它。