有没有办法跨会话保存 pdb(python 调试器)命令历史记录?另外,我可以指定历史长度吗?
这类似于问题如何让 gdb 保存命令历史记录?,但是对于 pdb 而不是 gdb。
-非常感谢
看到这个帖子。可以将历史记录保存在 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)
学分: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
...
清除/读取/打印当前 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)])
我不相信“股票” pdb 有办法。但是我写了一个替代调试器来做到这一点。
只需从源代码安装 Pycopia:http ://code.google.com/p/pycopia/source/checkout它位于 pycopia.debugger 中。
扩展@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
我认为你可以用 IPython 做到这一点:
http://ipython.org/ipython-doc/stable/interactive/tutorial.html#history
pdb 的 ipdb 替换: