ipy_winpdb.py
84 lines
| 2.3 KiB
| text/x-python
|
PythonLexer
Ville M. Vainio
|
r1137 | """ Debug a script (like %run -d) in IPython process, Using WinPdb | ||
Usage: | ||||
%wdb test.py | ||||
Bernardo B. Marques
|
r4872 | run test.py, with a winpdb breakpoint at start of the file | ||
Ville M. Vainio
|
r1137 | %wdb pass | ||
Change the password (e.g. if you have forgotten the old one) | ||||
Fernando Perez
|
r1867 | |||
Notes | ||||
----- | ||||
**WARNING**: As of March 2009 (IPython 0.10), WinPdb has a known bug, which | ||||
causes PyTables to become impossible to import if winpdb is loaded. Therefore, | ||||
if you need PyTables, do *not* use this extension. | ||||
For more details: https://bugs.launchpad.net/ipython/+bug/249036 | ||||
Ville M. Vainio
|
r1137 | """ | ||
import os | ||||
Brian Granger
|
r2027 | from IPython.core import ipapi | ||
Brian Granger
|
r2205 | from IPython.core.error import UsageError | ||
Ville M. Vainio
|
r1137 | import rpdb2 | ||
Brian Granger
|
r2027 | ip = ipapi.get() | ||
Ville M. Vainio
|
r1137 | |||
rpdb_started = False | ||||
def wdb_f(self, arg): | ||||
""" Debug a script (like %run -d) in IPython process, Using WinPdb | ||||
Bernardo B. Marques
|
r4872 | |||
Ville M. Vainio
|
r1137 | Usage: | ||
Bernardo B. Marques
|
r4872 | |||
Ville M. Vainio
|
r1137 | %wdb test.py | ||
Bernardo B. Marques
|
r4872 | run test.py, with a winpdb breakpoint at start of the file | ||
Ville M. Vainio
|
r1137 | %wdb pass | ||
Change the password (e.g. if you have forgotten the old one) | ||||
Bernardo B. Marques
|
r4872 | |||
Note that after the script has been run, you need to do "Go" (f5) | ||||
Ville M. Vainio
|
r1137 | in WinPdb to resume normal IPython operation. | ||
""" | ||||
global rpdb_started | ||||
if not arg.strip(): | ||||
print __doc__ | ||||
return | ||||
Bernardo B. Marques
|
r4872 | |||
Ville M. Vainio
|
r1137 | if arg.strip() == 'pass': | ||
passwd = raw_input('Enter new winpdb session password: ') | ||||
ip.db['winpdb_pass'] = passwd | ||||
print "Winpdb password changed" | ||||
if rpdb_started: | ||||
print "You need to restart IPython to use the new password" | ||||
Bernardo B. Marques
|
r4872 | return | ||
Ville M. Vainio
|
r1137 | path = os.path.abspath(arg) | ||
if not os.path.isfile(path): | ||||
Brian Granger
|
r2205 | raise UsageError("%%wdb: file %s does not exist" % path) | ||
Ville M. Vainio
|
r1137 | if not rpdb_started: | ||
passwd = ip.db.get('winpdb_pass', None) | ||||
if passwd is None: | ||||
import textwrap | ||||
print textwrap.dedent("""\ | ||||
Winpdb sessions need a password that you use for attaching the external | ||||
Bernardo B. Marques
|
r4872 | winpdb session. IPython will remember this. You can change the password later | ||
Ville M. Vainio
|
r1137 | by '%wpdb pass' | ||
""") | ||||
passwd = raw_input('Enter new winpdb session password: ') | ||||
ip.db['winpdb_pass'] = passwd | ||||
Bernardo B. Marques
|
r4872 | |||
Ville M. Vainio
|
r1137 | print "Starting rpdb2 in IPython process" | ||
rpdb2.start_embedded_debugger(passwd, timeout = 0) | ||||
rpdb_started = True | ||||
Bernardo B. Marques
|
r4872 | |||
Ville M. Vainio
|
r1137 | rpdb2.set_temp_breakpoint(path) | ||
print 'It is time to attach with WinPdb (launch WinPdb if needed, File -> Attach)' | ||||
ip.magic('%run ' + arg) | ||||
Bernardo B. Marques
|
r4872 | |||
Ville M. Vainio
|
r1137 | |||
Brian Granger
|
r2205 | ip.define_magic('wdb', wdb_f) | ||