Is there a way to save pdb (python debugger) command history across sessions? Also, can I specify history length?
This is similar to the question How can I make gdb save the command history?, however for pdb instead of gdb.
Is there a way to save pdb (python debugger) command history across sessions? Also, can I specify history length?
This is similar to the question How can I make gdb save the command history?, however for pdb instead of gdb.
See this post. It is possible to save history in pdb. By default, pdb does not read multiple lines. So all functions need to be on a single line.
In ~/.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)
Credits: https://wiki.python.org/moin/PdbRcIdea
pdb uses readline so we can instruct readline to save history:
.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
For the drop-in replacement pdb++
, copy the above function code into the setup()
method:
from pdb import DefaultConfig, Pdb
class Config(DefaultConfig):
def setup(self, pdb):
## Save history across sessions
#
import readline
...
An example for clearing / reading / printing the current pdb history:
(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])
output:
[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])']
reference:
two liner without readline.clear_history
for what has been input to pdb so far:
from pprint import pprint; import readline
pprint([readline.get_history_item(x) for x in range(readline.get_current_history_length() + 1)])
Extending @olejorgenb's excellent answer, I wanted the history file in my home directory rather than in the current directory, so I used 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)
This is my setup for configuring pdbpp
(an improved debugger, aka pdb++
, https://pypi.org/project/pdbpp/). You can use the same idea along with @olejorgenb's answer to configure regular pdb
.
I don't believe there is a way with "stock" pdb. But I wrote a replacement debugger that does that.
just install Pycopia from source: http://code.google.com/p/pycopia/source/checkout and it's in pycopia.debugger.
I think you can do this with IPython:
http://ipython.org/ipython-doc/stable/interactive/tutorial.html#history
ipdb replacement for pdb: