Problem

You'd like to include Python scripts into my .pdbrc, but only pdb commands are allowed there.

Solution

Use execfile() to run a file containing your Python code.

.pdbrc may look like this:

# .pdbrc only allows for debugger commands; you cannot insert Python
# scripts.

# To overcome this restriction, this .pdbrc executes ~/.pdbrc.py,
# which can contain arbitrary Python commands (including a call to a
# local pdbrc.py (no leading dot!) in your working directory if it
# exists).

# If ~/.pdbrc.py is missing, you get an error message (which doesn't
# hurt).

execfile(os.path.expanduser("~/.pdbrc.py"))

and this is an example ~/.pdbrc.py:

print ".pdbrc.py started"

# Command line history:
import readline
histfile = ".pdb-pyhist"
try:
    readline.read_history_file(histfile)
except IOError:
    pass
import atexit
atexit.register(readline.write_history_file, histfile)
del histfile
readline.set_history_length(200)

# return to debugger after fatal exception (Python cookbook 14.5):
def info(type, value, tb):
    if hasattr(sys, 'ps1') or not sys.stderr.isatty():
        sys.__excepthook__(type, value, tb)
    import traceback, pdb
    traceback.print_exception(type, value, tb)
    print
    pdb.pm()

sys.excepthook = info

# From (on my machine) /usr/local/lib/python2.3/less user.py:
import os
home = os.curdir                        # Default
if 'HOME' in os.environ:
    home = os.environ['HOME']
elif os.name == 'posix':
    home = os.path.expanduser("~/")
elif os.name == 'nt':                   # Contributed by Jeff Bauer
    if 'HOMEPATH' in os.environ:
        if 'HOMEDRIVE' in os.environ:
            home = os.environ['HOMEDRIVE'] + os.environ['HOMEPATH']
        else:
            home = os.environ['HOMEPATH']
# Make sure home always ends with a directory separator:
home = os.path.realpath(home) + os.sep

# Try to execute local file (if any) unless we are in the home dir.
if home != os.path.realpath(os.curdir) + os.sep:
    # Avoid recursively loading this file.
    try:
        _already_loaded += 1
    except NameError:
        _already_loaded = 1
    if _already_loaded < 3:
        try:
            execfile("pdbrc.py")
        except IOError:
            pass

# Cleanup any variables that could otherwise clutter up the namespace.
try:
    del atexit
    del home
    del info
    del os
    del pdb
    del readline
    del rlcompleter
    # careful here:
    del _already_loaded
except NameError:
    # Probably this is a second pdbrc that has been loaded.
    pass

print ".pdbrc.py finished"


PythonDebuggers

PdbRcIdea (last edited 2008-11-15 14:01:17 by localhost)

Unable to edit the page? See the FrontPage for instructions.