18

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

这类似于问题如何让 gdb 保存命令历史记录?,但是对于 pdb 而不是 gdb。

-非常感谢

4

6 回答 6

15

看到这个帖子。可以将历史记录保存在 pdb 中。默认情况下,pdb 不会读取多行。所以所有功能都需要在一行上。

在 ~/.pdbrc 中:

import atexit
import os
import readline

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, historyPath=historyPath)
于 2016-03-08T11:35:53.553 回答
11

学分:https ://wiki.python.org/moin/PdbRcIdea

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

.pdbrc

# NB: `pdb` only accepts single-line statements
import os
with open(os.path.expanduser("~/.pdbrc.py")) as _f: _f = _f.read()
exec(_f)
del _f

.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

对于 drop-in replacement pdb++,将上述函数代码复制到setup()方法中:

from pdb import DefaultConfig, Pdb


class Config(DefaultConfig):
    def setup(self, pdb):
        ## Save history across sessions
        #
        import readline
        ...
于 2016-02-14T10:47:22.033 回答
4

清除/读取/打印当前 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)])
于 2018-07-25T23:25:42.000 回答
1

我不相信“股票” pdb 有办法。但是我写了一个替代调试器来做到这一点。

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

于 2012-04-30T05:51:53.293 回答
1

扩展@olejorgenb 的出色答案,我希望将历史文件放在我的主目录而不是当前目录中,所以我使用了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又名https://pypi.org/project/pdbpp/)。您可以将相同的想法与@olejorgenb 的答案一起使用来配置常规。pdb++pdb

于 2021-01-27T17:56:58.720 回答
-3

我认为你可以用 IPython 做到这一点:

http://ipython.org/ipython-doc/stable/interactive/tutorial.html#history

pdb 的 ipdb 替换:

http://pypi.python.org/pypi/ipdb

于 2012-04-27T13:28:27.360 回答