Bump version. Add IPython integration.
This commit is contained in:
parent
96b04de69c
commit
a5ca9582d4
@ -24,7 +24,7 @@ def fermat(n):
|
|||||||
Warning! Untested with n > 2.
|
Warning! Untested with n > 2.
|
||||||
"""
|
"""
|
||||||
from itertools import count
|
from itertools import count
|
||||||
for x in range(20):
|
for x in range(100):
|
||||||
for y in range(1, x+1):
|
for y in range(1, x+1):
|
||||||
for z in range(1, x**n+y**n + 1):
|
for z in range(1, x**n+y**n + 1):
|
||||||
#from pudb import set_trace; set_trace()
|
#from pudb import set_trace; set_trace()
|
||||||
@ -36,3 +36,4 @@ print "SF", simple_func(10)
|
|||||||
for i in fermat(2):
|
for i in fermat(2):
|
||||||
print i
|
print i
|
||||||
|
|
||||||
|
print "FINISHED"
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
VERSION = "0.92.9"
|
NUM_VERSION = (0, 92, 10)
|
||||||
|
VERSION = ".".join(str(nv) for nv in NUM_VERSION)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -16,7 +17,82 @@ def _get_debugger():
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
def run(statement, globals=None, locals=None):
|
def runscript(mainpyfile, args=None, pre_run="", steal_output=False):
|
||||||
|
from pudb.debugger import Debugger
|
||||||
|
dbg = Debugger(steal_output=steal_output)
|
||||||
|
|
||||||
|
# Note on saving/restoring sys.argv: it's a good idea when sys.argv was
|
||||||
|
# modified by the script being debugged. It's a bad idea when it was
|
||||||
|
# changed by the user from the command line. The best approach would be to
|
||||||
|
# have a "restart" command which would allow explicit specification of
|
||||||
|
# command line arguments.
|
||||||
|
|
||||||
|
import sys
|
||||||
|
if args is not None:
|
||||||
|
prev_sys_argv = sys.argv[:]
|
||||||
|
sys.argv = [mainpyfile] + args
|
||||||
|
|
||||||
|
# replace pudb's dir with script's dir in front of module search path.
|
||||||
|
from os.path import dirname
|
||||||
|
prev_sys_path = sys.path[:]
|
||||||
|
sys.path[0] = dirname(mainpyfile)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
if pre_run:
|
||||||
|
from subprocess import call
|
||||||
|
retcode = call(pre_run, close_fds=True, shell=True)
|
||||||
|
if retcode:
|
||||||
|
print "*** WARNING: pre-run process exited with code %d." % retcode
|
||||||
|
raw_input("[Hit Enter]")
|
||||||
|
|
||||||
|
status_msg = ""
|
||||||
|
|
||||||
|
try:
|
||||||
|
dbg._runscript(mainpyfile)
|
||||||
|
except SystemExit, se:
|
||||||
|
status_msg = "The debuggee exited normally with status code was %d.\n\n" % se.code
|
||||||
|
except:
|
||||||
|
dbg.post_mortem = True
|
||||||
|
dbg.interaction(None, sys.exc_info())
|
||||||
|
|
||||||
|
def quit_debugger(w, size, key):
|
||||||
|
dbg.ui.quit_event_loop = ["quit"]
|
||||||
|
|
||||||
|
import urwid
|
||||||
|
pre_run_edit = urwid.Edit("", pre_run)
|
||||||
|
|
||||||
|
result = dbg.ui.call_with_ui(dbg.ui.dialog,
|
||||||
|
urwid.ListBox([urwid.Text(
|
||||||
|
"Your PuDB session has ended.\n\n%s"
|
||||||
|
"Would you like to quit PuDB or restart your program?\n"
|
||||||
|
"You may hit 'q' to quit."
|
||||||
|
% status_msg),
|
||||||
|
urwid.Text("\n\nIf you decide to restart, this command will be run prior to "
|
||||||
|
"actually restarting:"),
|
||||||
|
urwid.AttrWrap(pre_run_edit, "value")
|
||||||
|
]),
|
||||||
|
[
|
||||||
|
("Restart", "restart"),
|
||||||
|
("Quit", "quit"),
|
||||||
|
],
|
||||||
|
focus_buttons=True,
|
||||||
|
bind_enter_esc=False,
|
||||||
|
title="Finished",
|
||||||
|
extra_bindings=[("q", quit_debugger)])
|
||||||
|
|
||||||
|
if result == "quit":
|
||||||
|
return
|
||||||
|
|
||||||
|
pre_run = pre_run_edit.get_edit_text()
|
||||||
|
|
||||||
|
dbg.restart()
|
||||||
|
|
||||||
|
if args is not None:
|
||||||
|
sys.argv = prev_sys_argv
|
||||||
|
|
||||||
|
sys.path = prev_sys_path
|
||||||
|
|
||||||
|
def run_statement(statement, globals=None, locals=None):
|
||||||
_get_debugger().run(statement, globals, locals)
|
_get_debugger().run(statement, globals, locals)
|
||||||
|
|
||||||
def runeval(expression, globals=None, locals=None):
|
def runeval(expression, globals=None, locals=None):
|
||||||
|
31
pudb/ipython.py
Normal file
31
pudb/ipython.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import os
|
||||||
|
import IPython.ipapi
|
||||||
|
import pudb
|
||||||
|
|
||||||
|
ip = IPython.ipapi.get()
|
||||||
|
|
||||||
|
def pudb_f(self, arg):
|
||||||
|
""" Debug a script (like %run -d) in IPython process, using PuDB.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%pudb test.py [args]
|
||||||
|
Run script test.py under PuDB.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not arg.strip():
|
||||||
|
print __doc__
|
||||||
|
return
|
||||||
|
|
||||||
|
from IPython.genutils import arg_split
|
||||||
|
args = arg_split(arg)
|
||||||
|
|
||||||
|
path = os.path.abspath(args[0])
|
||||||
|
args = args[1:]
|
||||||
|
if not os.path.isfile(path):
|
||||||
|
raise IPython.ipapi.UsageError("%%pudb: file %s does not exist" % path)
|
||||||
|
|
||||||
|
from pudb import runscript
|
||||||
|
runscript(path, args)
|
||||||
|
|
||||||
|
ip.expose_magic('pudb', pudb_f)
|
64
pudb/run.py
64
pudb/run.py
@ -24,67 +24,11 @@ def main():
|
|||||||
|
|
||||||
sys.argv = args
|
sys.argv = args
|
||||||
|
|
||||||
# Replace pudb's dir with script's dir in front of module search path.
|
from pudb import runscript
|
||||||
sys.path[0] = dirname(mainpyfile)
|
runscript(mainpyfile,
|
||||||
|
pre_run=options.pre_run,
|
||||||
|
steal_output=options.steal_output)
|
||||||
|
|
||||||
# Note on saving/restoring sys.argv: it's a good idea when sys.argv was
|
|
||||||
# modified by the script being debugged. It's a bad idea when it was
|
|
||||||
# changed by the user from the command line. The best approach would be to
|
|
||||||
# have a "restart" command which would allow explicit specification of
|
|
||||||
# command line arguments.
|
|
||||||
|
|
||||||
from pudb.debugger import Debugger
|
|
||||||
dbg = Debugger(steal_output=options.steal_output)
|
|
||||||
|
|
||||||
while True:
|
|
||||||
if options.pre_run:
|
|
||||||
from subprocess import call
|
|
||||||
retcode = call(options.pre_run, close_fds=True, shell=True)
|
|
||||||
if retcode:
|
|
||||||
print "*** WARNING: pre-run process exited with code %d." % retcode
|
|
||||||
raw_input("[Hit Enter]")
|
|
||||||
|
|
||||||
status_msg = ""
|
|
||||||
|
|
||||||
try:
|
|
||||||
dbg._runscript(mainpyfile)
|
|
||||||
except SystemExit, se:
|
|
||||||
status_msg = "The debuggee exited normally with status code was %d.\n\n" % se.code
|
|
||||||
except:
|
|
||||||
dbg.post_mortem = True
|
|
||||||
dbg.interaction(None, sys.exc_info())
|
|
||||||
|
|
||||||
def quit_debugger(w, size, key):
|
|
||||||
dbg.ui.quit_event_loop = ["quit"]
|
|
||||||
|
|
||||||
import urwid
|
|
||||||
pre_run_edit = urwid.Edit("", options.pre_run)
|
|
||||||
|
|
||||||
result = dbg.ui.call_with_ui(dbg.ui.dialog,
|
|
||||||
urwid.ListBox([urwid.Text(
|
|
||||||
"Your PuDB session has ended.\n\n%s"
|
|
||||||
"Would you like to quit PuDB or restart your program?\n"
|
|
||||||
"You may hit 'q' to quit."
|
|
||||||
% status_msg),
|
|
||||||
urwid.Text("\n\nIf you decide to restart, this command will be run prior to "
|
|
||||||
"actually restarting:"),
|
|
||||||
urwid.AttrWrap(pre_run_edit, "value")
|
|
||||||
]),
|
|
||||||
[
|
|
||||||
("Restart", "restart"),
|
|
||||||
("Quit", "quit"),
|
|
||||||
],
|
|
||||||
focus_buttons=True,
|
|
||||||
bind_enter_esc=False,
|
|
||||||
title="Finished",
|
|
||||||
extra_bindings=[("q", quit_debugger)])
|
|
||||||
|
|
||||||
if result == "quit":
|
|
||||||
return
|
|
||||||
|
|
||||||
options.pre_run = pre_run_edit.get_edit_text()
|
|
||||||
|
|
||||||
dbg.restart()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
15
setup.py
15
setup.py
@ -70,6 +70,21 @@ setup(name='pudb',
|
|||||||
|
|
||||||
python -m pudb.run my-script.py
|
python -m pudb.run my-script.py
|
||||||
|
|
||||||
|
IPython integration
|
||||||
|
^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
PuDB ships with IPython integration. Just stick the line::
|
||||||
|
|
||||||
|
import pudb.ipython
|
||||||
|
|
||||||
|
into your `$HOME/.ipython/ipy_user_conf.py`, and then you may use the magic
|
||||||
|
command::
|
||||||
|
|
||||||
|
%pudb script.py [args]
|
||||||
|
|
||||||
|
where `[args]` represents optional arguments, to launch PuDB from within
|
||||||
|
IPython.
|
||||||
|
|
||||||
Programming PuDB
|
Programming PuDB
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user