在pdb中保存命令历史记录

时间:2012-04-27 07:21:51

标签: python debugging

有没有办法跨会话保存pdb(python调试器)命令历史记录?另外,我可以指定历史记录长度吗?

这类似于问题How can I make gdb save the command history?,但对于pdb而不是gdb。

- 非常感谢

6 个答案:

答案 0 :(得分:8)

请参阅this帖子。可以在pdb中保存历史记录。默认情况下,pdb不读取多行。所以所有功能都需要在一行上。

在〜/ .pdbrc:

> a = [1]
=> [1]
> def add_a(array)
>   array << "a"
> end
=> :add_a
> add_a a
=> [1, "a"]
> a
=> [1, "a"]

答案 1 :(得分:6)

注意:这只是用python 2测试的。

致谢:https://wiki.python.org/moin/PdbRcIdea

pdb使用readline,因此我们可以指示readline保存历史记录:

.pdbrc

# NB: This file only works with single-line statements
import os
execfile(os.path.expanduser("~/.pdbrc.py"))

.pdbrc.py

def _pdbrc_init():
    # Save history across sessions
    import readline
    histfile = ".pdb-pyhist"
    try:
        readline.read_history_file(histfile)
    except IOError:
        pass
    import atexit
    atexit.register(readline.write_history_file, histfile)
    readline.set_history_length(500)

_pdbrc_init()
del _pdbrc_init

答案 2 :(得分:2)

清除/读取/打印当前pdb历史记录的示例:

(Pdb) readline.clear_history()
(Pdb) print('hello pdb')
hello pdb
(Pdb) from pprint import pprint; import readline
(Pdb) y = range(readline.get_current_history_length() + 2)
(Pdb) print([readline.get_history_item(x) for x in y])

输出:

[None, 
"print('hello pdb')", 
'from pprint import pprint; import readline', 
'y = range(readline.get_current_history_length() + 2)',
'print([readline.get_history_item(x) for x in y])']

参考:

到目前为止没有输入readline.clear_history到pdb的两个衬里:

from pprint import pprint; import readline
pprint([readline.get_history_item(x) for x in range(readline.get_current_history_length() + 1)])

答案 3 :(得分:1)

我不相信有“库存”pdb的方法。但我写了一个替代调试器来做到这一点。

只需从源代码安装Pycopia:http://code.google.com/p/pycopia/source/checkout,它就在pycopia.debugger中。

答案 4 :(得分:1)

扩展@olejorgenb 的优秀answer,我希望历史文件位于我的主目录而不是当前目录中,所以我使用了pathlib.Path.expanduser

import pdb

class Config(pdb.DefaultConfig):

    def setup(self, pdb):
        # Save history across sessions
        import readline
        from pathlib import Path
        histfile_path = Path("~/.pdb-pyhist").expanduser()

        try:
            readline.read_history_file(histfile_path)
        except IOError:
            pass

        import atexit
        atexit.register(readline.write_history_file, histfile_path)
        readline.set_history_length(500)

这是我用于配置 pdbpp(改进的调试器,又名 pdb++https://pypi.org/project/pdbpp/)的设置。您可以将相同的想法与 @olejorgenb 的 answer 一起使用来配置常规 pdb

答案 5 :(得分:-2)