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.
-Many thanks
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.
-Many thanks
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)])
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.
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 think you can do this with IPython:
http://ipython.org/ipython-doc/stable/interactive/tutorial.html#history
ipdb replacement for pdb: