##// END OF EJS Templates
Add pfile command to ipdb.
Bradley M. Froehle -
Show More
@@ -1,535 +1,544
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 Pdb debugger class.
4 4
5 5 Modified from the standard pdb.Pdb class to avoid including readline, so that
6 6 the command line completion of other programs which include this isn't
7 7 damaged.
8 8
9 9 In the future, this class will be expanded with improvements over the standard
10 10 pdb.
11 11
12 12 The code in this file is mainly lifted out of cmd.py in Python 2.2, with minor
13 13 changes. Licensing should therefore be under the standard Python terms. For
14 14 details on the PSF (Python Software Foundation) standard license, see:
15 15
16 16 http://www.python.org/2.2.3/license.html"""
17 17
18 18 #*****************************************************************************
19 19 #
20 20 # This file is licensed under the PSF license.
21 21 #
22 22 # Copyright (C) 2001 Python Software Foundation, www.python.org
23 23 # Copyright (C) 2005-2006 Fernando Perez. <fperez@colorado.edu>
24 24 #
25 25 #
26 26 #*****************************************************************************
27 27 from __future__ import print_function
28 28
29 29 import bdb
30 30 import linecache
31 31 import sys
32 32
33 33 from IPython.utils import PyColorize, ulinecache
34 34 from IPython.core import ipapi
35 35 from IPython.utils import coloransi, io, openpy, py3compat
36 36 from IPython.core.excolors import exception_colors
37 37
38 38 # See if we can use pydb.
39 39 has_pydb = False
40 40 prompt = 'ipdb> '
41 41 #We have to check this directly from sys.argv, config struct not yet available
42 42 if '--pydb' in sys.argv:
43 43 try:
44 44 import pydb
45 45 if hasattr(pydb.pydb, "runl") and pydb.version>'1.17':
46 46 # Version 1.17 is broken, and that's what ships with Ubuntu Edgy, so we
47 47 # better protect against it.
48 48 has_pydb = True
49 49 except ImportError:
50 50 print("Pydb (http://bashdb.sourceforge.net/pydb/) does not seem to be available")
51 51
52 52 if has_pydb:
53 53 from pydb import Pdb as OldPdb
54 54 #print "Using pydb for %run -d and post-mortem" #dbg
55 55 prompt = 'ipydb> '
56 56 else:
57 57 from pdb import Pdb as OldPdb
58 58
59 59 # Allow the set_trace code to operate outside of an ipython instance, even if
60 60 # it does so with some limitations. The rest of this support is implemented in
61 61 # the Tracer constructor.
62 62 def BdbQuit_excepthook(et,ev,tb):
63 63 if et==bdb.BdbQuit:
64 64 print('Exiting Debugger.')
65 65 else:
66 66 BdbQuit_excepthook.excepthook_ori(et,ev,tb)
67 67
68 68 def BdbQuit_IPython_excepthook(self,et,ev,tb,tb_offset=None):
69 69 print('Exiting Debugger.')
70 70
71 71
72 72 class Tracer(object):
73 73 """Class for local debugging, similar to pdb.set_trace.
74 74
75 75 Instances of this class, when called, behave like pdb.set_trace, but
76 76 providing IPython's enhanced capabilities.
77 77
78 78 This is implemented as a class which must be initialized in your own code
79 79 and not as a standalone function because we need to detect at runtime
80 80 whether IPython is already active or not. That detection is done in the
81 81 constructor, ensuring that this code plays nicely with a running IPython,
82 82 while functioning acceptably (though with limitations) if outside of it.
83 83 """
84 84
85 85 def __init__(self,colors=None):
86 86 """Create a local debugger instance.
87 87
88 88 :Parameters:
89 89
90 90 - `colors` (None): a string containing the name of the color scheme to
91 91 use, it must be one of IPython's valid color schemes. If not given, the
92 92 function will default to the current IPython scheme when running inside
93 93 IPython, and to 'NoColor' otherwise.
94 94
95 95 Usage example:
96 96
97 97 from IPython.core.debugger import Tracer; debug_here = Tracer()
98 98
99 99 ... later in your code
100 100 debug_here() # -> will open up the debugger at that point.
101 101
102 102 Once the debugger activates, you can use all of its regular commands to
103 103 step through code, set breakpoints, etc. See the pdb documentation
104 104 from the Python standard library for usage details.
105 105 """
106 106
107 107 try:
108 108 ip = get_ipython()
109 109 except NameError:
110 110 # Outside of ipython, we set our own exception hook manually
111 111 BdbQuit_excepthook.excepthook_ori = sys.excepthook
112 112 sys.excepthook = BdbQuit_excepthook
113 113 def_colors = 'NoColor'
114 114 try:
115 115 # Limited tab completion support
116 116 import readline
117 117 readline.parse_and_bind('tab: complete')
118 118 except ImportError:
119 119 pass
120 120 else:
121 121 # In ipython, we use its custom exception handler mechanism
122 122 def_colors = ip.colors
123 123 ip.set_custom_exc((bdb.BdbQuit,), BdbQuit_IPython_excepthook)
124 124
125 125 if colors is None:
126 126 colors = def_colors
127 127
128 128 # The stdlib debugger internally uses a modified repr from the `repr`
129 129 # module, that limits the length of printed strings to a hardcoded
130 130 # limit of 30 characters. That much trimming is too aggressive, let's
131 131 # at least raise that limit to 80 chars, which should be enough for
132 132 # most interactive uses.
133 133 try:
134 134 from repr import aRepr
135 135 aRepr.maxstring = 80
136 136 except:
137 137 # This is only a user-facing convenience, so any error we encounter
138 138 # here can be warned about but can be otherwise ignored. These
139 139 # printouts will tell us about problems if this API changes
140 140 import traceback
141 141 traceback.print_exc()
142 142
143 143 self.debugger = Pdb(colors)
144 144
145 145 def __call__(self):
146 146 """Starts an interactive debugger at the point where called.
147 147
148 148 This is similar to the pdb.set_trace() function from the std lib, but
149 149 using IPython's enhanced debugger."""
150 150
151 151 self.debugger.set_trace(sys._getframe().f_back)
152 152
153 153
154 154 def decorate_fn_with_doc(new_fn, old_fn, additional_text=""):
155 155 """Make new_fn have old_fn's doc string. This is particularly useful
156 156 for the do_... commands that hook into the help system.
157 157 Adapted from from a comp.lang.python posting
158 158 by Duncan Booth."""
159 159 def wrapper(*args, **kw):
160 160 return new_fn(*args, **kw)
161 161 if old_fn.__doc__:
162 162 wrapper.__doc__ = old_fn.__doc__ + additional_text
163 163 return wrapper
164 164
165 165
166 166 def _file_lines(fname):
167 167 """Return the contents of a named file as a list of lines.
168 168
169 169 This function never raises an IOError exception: if the file can't be
170 170 read, it simply returns an empty list."""
171 171
172 172 try:
173 173 outfile = open(fname)
174 174 except IOError:
175 175 return []
176 176 else:
177 177 out = outfile.readlines()
178 178 outfile.close()
179 179 return out
180 180
181 181
182 182 class Pdb(OldPdb):
183 183 """Modified Pdb class, does not load readline."""
184 184
185 185 def __init__(self,color_scheme='NoColor',completekey=None,
186 186 stdin=None, stdout=None):
187 187
188 188 # Parent constructor:
189 189 if has_pydb and completekey is None:
190 190 OldPdb.__init__(self,stdin=stdin,stdout=io.stdout)
191 191 else:
192 192 OldPdb.__init__(self,completekey,stdin,stdout)
193 193
194 194 self.prompt = prompt # The default prompt is '(Pdb)'
195 195
196 196 # IPython changes...
197 197 self.is_pydb = has_pydb
198 198
199 199 self.shell = ipapi.get()
200 200
201 201 if self.is_pydb:
202 202
203 203 # interactiveshell.py's ipalias seems to want pdb's checkline
204 204 # which located in pydb.fn
205 205 import pydb.fns
206 206 self.checkline = lambda filename, lineno: \
207 207 pydb.fns.checkline(self, filename, lineno)
208 208
209 209 self.curframe = None
210 210 self.do_restart = self.new_do_restart
211 211
212 212 self.old_all_completions = self.shell.Completer.all_completions
213 213 self.shell.Completer.all_completions=self.all_completions
214 214
215 215 self.do_list = decorate_fn_with_doc(self.list_command_pydb,
216 216 OldPdb.do_list)
217 217 self.do_l = self.do_list
218 218 self.do_frame = decorate_fn_with_doc(self.new_do_frame,
219 219 OldPdb.do_frame)
220 220
221 221 self.aliases = {}
222 222
223 223 # Create color table: we copy the default one from the traceback
224 224 # module and add a few attributes needed for debugging
225 225 self.color_scheme_table = exception_colors()
226 226
227 227 # shorthands
228 228 C = coloransi.TermColors
229 229 cst = self.color_scheme_table
230 230
231 231 cst['NoColor'].colors.breakpoint_enabled = C.NoColor
232 232 cst['NoColor'].colors.breakpoint_disabled = C.NoColor
233 233
234 234 cst['Linux'].colors.breakpoint_enabled = C.LightRed
235 235 cst['Linux'].colors.breakpoint_disabled = C.Red
236 236
237 237 cst['LightBG'].colors.breakpoint_enabled = C.LightRed
238 238 cst['LightBG'].colors.breakpoint_disabled = C.Red
239 239
240 240 self.set_colors(color_scheme)
241 241
242 242 # Add a python parser so we can syntax highlight source while
243 243 # debugging.
244 244 self.parser = PyColorize.Parser()
245 245
246 246 def set_colors(self, scheme):
247 247 """Shorthand access to the color table scheme selector method."""
248 248 self.color_scheme_table.set_active_scheme(scheme)
249 249
250 250 def interaction(self, frame, traceback):
251 251 self.shell.set_completer_frame(frame)
252 252 OldPdb.interaction(self, frame, traceback)
253 253
254 254 def new_do_up(self, arg):
255 255 OldPdb.do_up(self, arg)
256 256 self.shell.set_completer_frame(self.curframe)
257 257 do_u = do_up = decorate_fn_with_doc(new_do_up, OldPdb.do_up)
258 258
259 259 def new_do_down(self, arg):
260 260 OldPdb.do_down(self, arg)
261 261 self.shell.set_completer_frame(self.curframe)
262 262
263 263 do_d = do_down = decorate_fn_with_doc(new_do_down, OldPdb.do_down)
264 264
265 265 def new_do_frame(self, arg):
266 266 OldPdb.do_frame(self, arg)
267 267 self.shell.set_completer_frame(self.curframe)
268 268
269 269 def new_do_quit(self, arg):
270 270
271 271 if hasattr(self, 'old_all_completions'):
272 272 self.shell.Completer.all_completions=self.old_all_completions
273 273
274 274
275 275 return OldPdb.do_quit(self, arg)
276 276
277 277 do_q = do_quit = decorate_fn_with_doc(new_do_quit, OldPdb.do_quit)
278 278
279 279 def new_do_restart(self, arg):
280 280 """Restart command. In the context of ipython this is exactly the same
281 281 thing as 'quit'."""
282 282 self.msg("Restart doesn't make sense here. Using 'quit' instead.")
283 283 return self.do_quit(arg)
284 284
285 285 def postloop(self):
286 286 self.shell.set_completer_frame(None)
287 287
288 288 def print_stack_trace(self):
289 289 try:
290 290 for frame_lineno in self.stack:
291 291 self.print_stack_entry(frame_lineno, context = 5)
292 292 except KeyboardInterrupt:
293 293 pass
294 294
295 295 def print_stack_entry(self,frame_lineno,prompt_prefix='\n-> ',
296 296 context = 3):
297 297 #frame, lineno = frame_lineno
298 298 print(self.format_stack_entry(frame_lineno, '', context), file=io.stdout)
299 299
300 300 # vds: >>
301 301 frame, lineno = frame_lineno
302 302 filename = frame.f_code.co_filename
303 303 self.shell.hooks.synchronize_with_editor(filename, lineno, 0)
304 304 # vds: <<
305 305
306 306 def format_stack_entry(self, frame_lineno, lprefix=': ', context = 3):
307 307 import repr
308 308
309 309 ret = []
310 310
311 311 Colors = self.color_scheme_table.active_colors
312 312 ColorsNormal = Colors.Normal
313 313 tpl_link = u'%s%%s%s' % (Colors.filenameEm, ColorsNormal)
314 314 tpl_call = u'%s%%s%s%%s%s' % (Colors.vName, Colors.valEm, ColorsNormal)
315 315 tpl_line = u'%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
316 316 tpl_line_em = u'%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line,
317 317 ColorsNormal)
318 318
319 319 frame, lineno = frame_lineno
320 320
321 321 return_value = ''
322 322 if '__return__' in frame.f_locals:
323 323 rv = frame.f_locals['__return__']
324 324 #return_value += '->'
325 325 return_value += repr.repr(rv) + '\n'
326 326 ret.append(return_value)
327 327
328 328 #s = filename + '(' + `lineno` + ')'
329 329 filename = self.canonic(frame.f_code.co_filename)
330 330 link = tpl_link % py3compat.cast_unicode(filename)
331 331
332 332 if frame.f_code.co_name:
333 333 func = frame.f_code.co_name
334 334 else:
335 335 func = "<lambda>"
336 336
337 337 call = ''
338 338 if func != '?':
339 339 if '__args__' in frame.f_locals:
340 340 args = repr.repr(frame.f_locals['__args__'])
341 341 else:
342 342 args = '()'
343 343 call = tpl_call % (func, args)
344 344
345 345 # The level info should be generated in the same format pdb uses, to
346 346 # avoid breaking the pdbtrack functionality of python-mode in *emacs.
347 347 if frame is self.curframe:
348 348 ret.append('> ')
349 349 else:
350 350 ret.append(' ')
351 351 ret.append(u'%s(%s)%s\n' % (link,lineno,call))
352 352
353 353 start = lineno - 1 - context//2
354 354 lines = ulinecache.getlines(filename)
355 355 start = max(start, 0)
356 356 start = min(start, len(lines) - context)
357 357 lines = lines[start : start + context]
358 358
359 359 for i,line in enumerate(lines):
360 360 show_arrow = (start + 1 + i == lineno)
361 361 linetpl = (frame is self.curframe or show_arrow) \
362 362 and tpl_line_em \
363 363 or tpl_line
364 364 ret.append(self.__format_line(linetpl, filename,
365 365 start + 1 + i, line,
366 366 arrow = show_arrow) )
367 367 return ''.join(ret)
368 368
369 369 def __format_line(self, tpl_line, filename, lineno, line, arrow = False):
370 370 bp_mark = ""
371 371 bp_mark_color = ""
372 372
373 373 scheme = self.color_scheme_table.active_scheme_name
374 374 new_line, err = self.parser.format2(line, 'str', scheme)
375 375 if not err: line = new_line
376 376
377 377 bp = None
378 378 if lineno in self.get_file_breaks(filename):
379 379 bps = self.get_breaks(filename, lineno)
380 380 bp = bps[-1]
381 381
382 382 if bp:
383 383 Colors = self.color_scheme_table.active_colors
384 384 bp_mark = str(bp.number)
385 385 bp_mark_color = Colors.breakpoint_enabled
386 386 if not bp.enabled:
387 387 bp_mark_color = Colors.breakpoint_disabled
388 388
389 389 numbers_width = 7
390 390 if arrow:
391 391 # This is the line with the error
392 392 pad = numbers_width - len(str(lineno)) - len(bp_mark)
393 393 if pad >= 3:
394 394 marker = '-'*(pad-3) + '-> '
395 395 elif pad == 2:
396 396 marker = '> '
397 397 elif pad == 1:
398 398 marker = '>'
399 399 else:
400 400 marker = ''
401 401 num = '%s%s' % (marker, str(lineno))
402 402 line = tpl_line % (bp_mark_color + bp_mark, num, line)
403 403 else:
404 404 num = '%*s' % (numbers_width - len(bp_mark), str(lineno))
405 405 line = tpl_line % (bp_mark_color + bp_mark, num, line)
406 406
407 407 return line
408 408
409 409 def list_command_pydb(self, arg):
410 410 """List command to use if we have a newer pydb installed"""
411 411 filename, first, last = OldPdb.parse_list_cmd(self, arg)
412 412 if filename is not None:
413 413 self.print_list_lines(filename, first, last)
414 414
415 415 def print_list_lines(self, filename, first, last):
416 416 """The printing (as opposed to the parsing part of a 'list'
417 417 command."""
418 418 try:
419 419 Colors = self.color_scheme_table.active_colors
420 420 ColorsNormal = Colors.Normal
421 421 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
422 422 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal)
423 423 src = []
424 424 if filename == "<string>" and hasattr(self, "_exec_filename"):
425 425 filename = self._exec_filename
426 426
427 427 for lineno in range(first, last+1):
428 428 line = ulinecache.getline(filename, lineno)
429 429 if not line:
430 430 break
431 431
432 432 if lineno == self.curframe.f_lineno:
433 433 line = self.__format_line(tpl_line_em, filename, lineno, line, arrow = True)
434 434 else:
435 435 line = self.__format_line(tpl_line, filename, lineno, line, arrow = False)
436 436
437 437 src.append(line)
438 438 self.lineno = lineno
439 439
440 440 print(''.join(src), file=io.stdout)
441 441
442 442 except KeyboardInterrupt:
443 443 pass
444 444
445 445 def do_list(self, arg):
446 446 self.lastcmd = 'list'
447 447 last = None
448 448 if arg:
449 449 try:
450 450 x = eval(arg, {}, {})
451 451 if type(x) == type(()):
452 452 first, last = x
453 453 first = int(first)
454 454 last = int(last)
455 455 if last < first:
456 456 # Assume it's a count
457 457 last = first + last
458 458 else:
459 459 first = max(1, int(x) - 5)
460 460 except:
461 461 print('*** Error in argument:', repr(arg))
462 462 return
463 463 elif self.lineno is None:
464 464 first = max(1, self.curframe.f_lineno - 5)
465 465 else:
466 466 first = self.lineno + 1
467 467 if last is None:
468 468 last = first + 10
469 469 self.print_list_lines(self.curframe.f_code.co_filename, first, last)
470 470
471 471 # vds: >>
472 472 lineno = first
473 473 filename = self.curframe.f_code.co_filename
474 474 self.shell.hooks.synchronize_with_editor(filename, lineno, 0)
475 475 # vds: <<
476 476
477 477 do_l = do_list
478 478
479 479 def do_pdef(self, arg):
480 480 """Print the definition header for any callable object.
481 481
482 482 The debugger interface to %pdef"""
483 483 namespaces = [('Locals', self.curframe.f_locals),
484 484 ('Globals', self.curframe.f_globals)]
485 485 self.shell.find_line_magic('pdef')(arg, namespaces=namespaces)
486 486
487 487 def do_pdoc(self, arg):
488 488 """Print the docstring for an object.
489 489
490 490 The debugger interface to %pdoc."""
491 491 namespaces = [('Locals', self.curframe.f_locals),
492 492 ('Globals', self.curframe.f_globals)]
493 493 self.shell.find_line_magic('pdoc')(arg, namespaces=namespaces)
494 494
495 def do_pfile(self, arg):
496 """Print (or run through pager) the file where an object is defined.
497
498 The debugger interface to %pfile.
499 """
500 namespaces = [('Locals', self.curframe.f_locals),
501 ('Globals', self.curframe.f_globals)]
502 self.shell.find_line_magic('pfile')(arg, namespaces=namespaces)
503
495 504 def do_pinfo(self, arg):
496 505 """Provide detailed information about an object.
497 506
498 507 The debugger interface to %pinfo, i.e., obj?."""
499 508 namespaces = [('Locals', self.curframe.f_locals),
500 509 ('Globals', self.curframe.f_globals)]
501 510 self.shell.find_line_magic('pinfo')("pinfo %s" % arg,
502 511 namespaces=namespaces)
503 512
504 513 def checkline(self, filename, lineno):
505 514 """Check whether specified line seems to be executable.
506 515
507 516 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
508 517 line or EOF). Warning: testing is not comprehensive.
509 518 """
510 519 #######################################################################
511 520 # XXX Hack! Use python-2.5 compatible code for this call, because with
512 521 # all of our changes, we've drifted from the pdb api in 2.6. For now,
513 522 # changing:
514 523 #
515 524 #line = linecache.getline(filename, lineno, self.curframe.f_globals)
516 525 # to:
517 526 #
518 527 line = linecache.getline(filename, lineno)
519 528 #
520 529 # does the trick. But in reality, we need to fix this by reconciling
521 530 # our updates with the new Pdb APIs in Python 2.6.
522 531 #
523 532 # End hack. The rest of this method is copied verbatim from 2.6 pdb.py
524 533 #######################################################################
525 534
526 535 if not line:
527 536 print('End of file', file=self.stdout)
528 537 return 0
529 538 line = line.strip()
530 539 # Don't allow setting breakpoint at a blank line
531 540 if (not line or (line[0] == '#') or
532 541 (line[:3] == '"""') or line[:3] == "'''"):
533 542 print('*** Blank or comment', file=self.stdout)
534 543 return 0
535 544 return lineno
@@ -1,703 +1,703
1 1 """Implementation of namespace-related magic functions.
2 2 """
3 3 #-----------------------------------------------------------------------------
4 4 # Copyright (c) 2012 The IPython Development Team.
5 5 #
6 6 # Distributed under the terms of the Modified BSD License.
7 7 #
8 8 # The full license is in the file COPYING.txt, distributed with this software.
9 9 #-----------------------------------------------------------------------------
10 10
11 11 #-----------------------------------------------------------------------------
12 12 # Imports
13 13 #-----------------------------------------------------------------------------
14 14
15 15 # Stdlib
16 16 import gc
17 17 import re
18 18 import sys
19 19
20 20 # Our own packages
21 21 from IPython.core import page
22 22 from IPython.core.error import StdinNotImplementedError, UsageError
23 23 from IPython.core.magic import Magics, magics_class, line_magic
24 24 from IPython.testing.skipdoctest import skip_doctest
25 25 from IPython.utils.encoding import DEFAULT_ENCODING
26 26 from IPython.utils.openpy import read_py_file
27 27 from IPython.utils.path import get_py_filename
28 28
29 29 #-----------------------------------------------------------------------------
30 30 # Magic implementation classes
31 31 #-----------------------------------------------------------------------------
32 32
33 33 @magics_class
34 34 class NamespaceMagics(Magics):
35 35 """Magics to manage various aspects of the user's namespace.
36 36
37 37 These include listing variables, introspecting into them, etc.
38 38 """
39 39
40 40 @line_magic
41 41 def pinfo(self, parameter_s='', namespaces=None):
42 42 """Provide detailed information about an object.
43 43
44 44 '%pinfo object' is just a synonym for object? or ?object."""
45 45
46 46 #print 'pinfo par: <%s>' % parameter_s # dbg
47 47 # detail_level: 0 -> obj? , 1 -> obj??
48 48 detail_level = 0
49 49 # We need to detect if we got called as 'pinfo pinfo foo', which can
50 50 # happen if the user types 'pinfo foo?' at the cmd line.
51 51 pinfo,qmark1,oname,qmark2 = \
52 52 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
53 53 if pinfo or qmark1 or qmark2:
54 54 detail_level = 1
55 55 if "*" in oname:
56 56 self.psearch(oname)
57 57 else:
58 58 self.shell._inspect('pinfo', oname, detail_level=detail_level,
59 59 namespaces=namespaces)
60 60
61 61 @line_magic
62 62 def pinfo2(self, parameter_s='', namespaces=None):
63 63 """Provide extra detailed information about an object.
64 64
65 65 '%pinfo2 object' is just a synonym for object?? or ??object."""
66 66 self.shell._inspect('pinfo', parameter_s, detail_level=1,
67 67 namespaces=namespaces)
68 68
69 69 @skip_doctest
70 70 @line_magic
71 71 def pdef(self, parameter_s='', namespaces=None):
72 72 """Print the definition header for any callable object.
73 73
74 74 If the object is a class, print the constructor information.
75 75
76 76 Examples
77 77 --------
78 78 ::
79 79
80 80 In [3]: %pdef urllib.urlopen
81 81 urllib.urlopen(url, data=None, proxies=None)
82 82 """
83 83 self.shell._inspect('pdef',parameter_s, namespaces)
84 84
85 85 @line_magic
86 86 def pdoc(self, parameter_s='', namespaces=None):
87 87 """Print the docstring for an object.
88 88
89 89 If the given object is a class, it will print both the class and the
90 90 constructor docstrings."""
91 91 self.shell._inspect('pdoc',parameter_s, namespaces)
92 92
93 93 @line_magic
94 94 def psource(self, parameter_s='', namespaces=None):
95 95 """Print (or run through pager) the source code for an object."""
96 96 if not parameter_s:
97 97 raise UsageError('Missing object name.')
98 98 self.shell._inspect('psource',parameter_s, namespaces)
99 99
100 100 @line_magic
101 def pfile(self, parameter_s=''):
101 def pfile(self, parameter_s='', namespaces=None):
102 102 """Print (or run through pager) the file where an object is defined.
103 103
104 104 The file opens at the line where the object definition begins. IPython
105 105 will honor the environment variable PAGER if set, and otherwise will
106 106 do its best to print the file in a convenient form.
107 107
108 108 If the given argument is not an object currently defined, IPython will
109 109 try to interpret it as a filename (automatically adding a .py extension
110 110 if needed). You can thus use %pfile as a syntax highlighting code
111 111 viewer."""
112 112
113 113 # first interpret argument as an object name
114 out = self.shell._inspect('pfile',parameter_s)
114 out = self.shell._inspect('pfile',parameter_s, namespaces)
115 115 # if not, try the input as a filename
116 116 if out == 'not found':
117 117 try:
118 118 filename = get_py_filename(parameter_s)
119 119 except IOError as msg:
120 120 print msg
121 121 return
122 122 page.page(self.shell.pycolorize(read_py_file(filename, skip_encoding_cookie=False)))
123 123
124 124 @line_magic
125 125 def psearch(self, parameter_s=''):
126 126 """Search for object in namespaces by wildcard.
127 127
128 128 %psearch [options] PATTERN [OBJECT TYPE]
129 129
130 130 Note: ? can be used as a synonym for %psearch, at the beginning or at
131 131 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
132 132 rest of the command line must be unchanged (options come first), so
133 133 for example the following forms are equivalent
134 134
135 135 %psearch -i a* function
136 136 -i a* function?
137 137 ?-i a* function
138 138
139 139 Arguments:
140 140
141 141 PATTERN
142 142
143 143 where PATTERN is a string containing * as a wildcard similar to its
144 144 use in a shell. The pattern is matched in all namespaces on the
145 145 search path. By default objects starting with a single _ are not
146 146 matched, many IPython generated objects have a single
147 147 underscore. The default is case insensitive matching. Matching is
148 148 also done on the attributes of objects and not only on the objects
149 149 in a module.
150 150
151 151 [OBJECT TYPE]
152 152
153 153 Is the name of a python type from the types module. The name is
154 154 given in lowercase without the ending type, ex. StringType is
155 155 written string. By adding a type here only objects matching the
156 156 given type are matched. Using all here makes the pattern match all
157 157 types (this is the default).
158 158
159 159 Options:
160 160
161 161 -a: makes the pattern match even objects whose names start with a
162 162 single underscore. These names are normally omitted from the
163 163 search.
164 164
165 165 -i/-c: make the pattern case insensitive/sensitive. If neither of
166 166 these options are given, the default is read from your configuration
167 167 file, with the option ``InteractiveShell.wildcards_case_sensitive``.
168 168 If this option is not specified in your configuration file, IPython's
169 169 internal default is to do a case sensitive search.
170 170
171 171 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
172 172 specify can be searched in any of the following namespaces:
173 173 'builtin', 'user', 'user_global','internal', 'alias', where
174 174 'builtin' and 'user' are the search defaults. Note that you should
175 175 not use quotes when specifying namespaces.
176 176
177 177 'Builtin' contains the python module builtin, 'user' contains all
178 178 user data, 'alias' only contain the shell aliases and no python
179 179 objects, 'internal' contains objects used by IPython. The
180 180 'user_global' namespace is only used by embedded IPython instances,
181 181 and it contains module-level globals. You can add namespaces to the
182 182 search with -s or exclude them with -e (these options can be given
183 183 more than once).
184 184
185 185 Examples
186 186 --------
187 187 ::
188 188
189 189 %psearch a* -> objects beginning with an a
190 190 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
191 191 %psearch a* function -> all functions beginning with an a
192 192 %psearch re.e* -> objects beginning with an e in module re
193 193 %psearch r*.e* -> objects that start with e in modules starting in r
194 194 %psearch r*.* string -> all strings in modules beginning with r
195 195
196 196 Case sensitive search::
197 197
198 198 %psearch -c a* list all object beginning with lower case a
199 199
200 200 Show objects beginning with a single _::
201 201
202 202 %psearch -a _* list objects beginning with a single underscore
203 203 """
204 204 try:
205 205 parameter_s.encode('ascii')
206 206 except UnicodeEncodeError:
207 207 print 'Python identifiers can only contain ascii characters.'
208 208 return
209 209
210 210 # default namespaces to be searched
211 211 def_search = ['user_local', 'user_global', 'builtin']
212 212
213 213 # Process options/args
214 214 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
215 215 opt = opts.get
216 216 shell = self.shell
217 217 psearch = shell.inspector.psearch
218 218
219 219 # select case options
220 220 if 'i' in opts:
221 221 ignore_case = True
222 222 elif 'c' in opts:
223 223 ignore_case = False
224 224 else:
225 225 ignore_case = not shell.wildcards_case_sensitive
226 226
227 227 # Build list of namespaces to search from user options
228 228 def_search.extend(opt('s',[]))
229 229 ns_exclude = ns_exclude=opt('e',[])
230 230 ns_search = [nm for nm in def_search if nm not in ns_exclude]
231 231
232 232 # Call the actual search
233 233 try:
234 234 psearch(args,shell.ns_table,ns_search,
235 235 show_all=opt('a'),ignore_case=ignore_case)
236 236 except:
237 237 shell.showtraceback()
238 238
239 239 @skip_doctest
240 240 @line_magic
241 241 def who_ls(self, parameter_s=''):
242 242 """Return a sorted list of all interactive variables.
243 243
244 244 If arguments are given, only variables of types matching these
245 245 arguments are returned.
246 246
247 247 Examples
248 248 --------
249 249
250 250 Define two variables and list them with who_ls::
251 251
252 252 In [1]: alpha = 123
253 253
254 254 In [2]: beta = 'test'
255 255
256 256 In [3]: %who_ls
257 257 Out[3]: ['alpha', 'beta']
258 258
259 259 In [4]: %who_ls int
260 260 Out[4]: ['alpha']
261 261
262 262 In [5]: %who_ls str
263 263 Out[5]: ['beta']
264 264 """
265 265
266 266 user_ns = self.shell.user_ns
267 267 user_ns_hidden = self.shell.user_ns_hidden
268 268 out = [ i for i in user_ns
269 269 if not i.startswith('_') \
270 270 and not i in user_ns_hidden ]
271 271
272 272 typelist = parameter_s.split()
273 273 if typelist:
274 274 typeset = set(typelist)
275 275 out = [i for i in out if type(user_ns[i]).__name__ in typeset]
276 276
277 277 out.sort()
278 278 return out
279 279
280 280 @skip_doctest
281 281 @line_magic
282 282 def who(self, parameter_s=''):
283 283 """Print all interactive variables, with some minimal formatting.
284 284
285 285 If any arguments are given, only variables whose type matches one of
286 286 these are printed. For example::
287 287
288 288 %who function str
289 289
290 290 will only list functions and strings, excluding all other types of
291 291 variables. To find the proper type names, simply use type(var) at a
292 292 command line to see how python prints type names. For example:
293 293
294 294 ::
295 295
296 296 In [1]: type('hello')\\
297 297 Out[1]: <type 'str'>
298 298
299 299 indicates that the type name for strings is 'str'.
300 300
301 301 ``%who`` always excludes executed names loaded through your configuration
302 302 file and things which are internal to IPython.
303 303
304 304 This is deliberate, as typically you may load many modules and the
305 305 purpose of %who is to show you only what you've manually defined.
306 306
307 307 Examples
308 308 --------
309 309
310 310 Define two variables and list them with who::
311 311
312 312 In [1]: alpha = 123
313 313
314 314 In [2]: beta = 'test'
315 315
316 316 In [3]: %who
317 317 alpha beta
318 318
319 319 In [4]: %who int
320 320 alpha
321 321
322 322 In [5]: %who str
323 323 beta
324 324 """
325 325
326 326 varlist = self.who_ls(parameter_s)
327 327 if not varlist:
328 328 if parameter_s:
329 329 print 'No variables match your requested type.'
330 330 else:
331 331 print 'Interactive namespace is empty.'
332 332 return
333 333
334 334 # if we have variables, move on...
335 335 count = 0
336 336 for i in varlist:
337 337 print i+'\t',
338 338 count += 1
339 339 if count > 8:
340 340 count = 0
341 341 print
342 342 print
343 343
344 344 @skip_doctest
345 345 @line_magic
346 346 def whos(self, parameter_s=''):
347 347 """Like %who, but gives some extra information about each variable.
348 348
349 349 The same type filtering of %who can be applied here.
350 350
351 351 For all variables, the type is printed. Additionally it prints:
352 352
353 353 - For {},[],(): their length.
354 354
355 355 - For numpy arrays, a summary with shape, number of
356 356 elements, typecode and size in memory.
357 357
358 358 - Everything else: a string representation, snipping their middle if
359 359 too long.
360 360
361 361 Examples
362 362 --------
363 363
364 364 Define two variables and list them with whos::
365 365
366 366 In [1]: alpha = 123
367 367
368 368 In [2]: beta = 'test'
369 369
370 370 In [3]: %whos
371 371 Variable Type Data/Info
372 372 --------------------------------
373 373 alpha int 123
374 374 beta str test
375 375 """
376 376
377 377 varnames = self.who_ls(parameter_s)
378 378 if not varnames:
379 379 if parameter_s:
380 380 print 'No variables match your requested type.'
381 381 else:
382 382 print 'Interactive namespace is empty.'
383 383 return
384 384
385 385 # if we have variables, move on...
386 386
387 387 # for these types, show len() instead of data:
388 388 seq_types = ['dict', 'list', 'tuple']
389 389
390 390 # for numpy arrays, display summary info
391 391 ndarray_type = None
392 392 if 'numpy' in sys.modules:
393 393 try:
394 394 from numpy import ndarray
395 395 except ImportError:
396 396 pass
397 397 else:
398 398 ndarray_type = ndarray.__name__
399 399
400 400 # Find all variable names and types so we can figure out column sizes
401 401 def get_vars(i):
402 402 return self.shell.user_ns[i]
403 403
404 404 # some types are well known and can be shorter
405 405 abbrevs = {'IPython.core.macro.Macro' : 'Macro'}
406 406 def type_name(v):
407 407 tn = type(v).__name__
408 408 return abbrevs.get(tn,tn)
409 409
410 410 varlist = map(get_vars,varnames)
411 411
412 412 typelist = []
413 413 for vv in varlist:
414 414 tt = type_name(vv)
415 415
416 416 if tt=='instance':
417 417 typelist.append( abbrevs.get(str(vv.__class__),
418 418 str(vv.__class__)))
419 419 else:
420 420 typelist.append(tt)
421 421
422 422 # column labels and # of spaces as separator
423 423 varlabel = 'Variable'
424 424 typelabel = 'Type'
425 425 datalabel = 'Data/Info'
426 426 colsep = 3
427 427 # variable format strings
428 428 vformat = "{0:<{varwidth}}{1:<{typewidth}}"
429 429 aformat = "%s: %s elems, type `%s`, %s bytes"
430 430 # find the size of the columns to format the output nicely
431 431 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
432 432 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
433 433 # table header
434 434 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
435 435 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
436 436 # and the table itself
437 437 kb = 1024
438 438 Mb = 1048576 # kb**2
439 439 for vname,var,vtype in zip(varnames,varlist,typelist):
440 440 print vformat.format(vname, vtype, varwidth=varwidth, typewidth=typewidth),
441 441 if vtype in seq_types:
442 442 print "n="+str(len(var))
443 443 elif vtype == ndarray_type:
444 444 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
445 445 if vtype==ndarray_type:
446 446 # numpy
447 447 vsize = var.size
448 448 vbytes = vsize*var.itemsize
449 449 vdtype = var.dtype
450 450
451 451 if vbytes < 100000:
452 452 print aformat % (vshape, vsize, vdtype, vbytes)
453 453 else:
454 454 print aformat % (vshape, vsize, vdtype, vbytes),
455 455 if vbytes < Mb:
456 456 print '(%s kb)' % (vbytes/kb,)
457 457 else:
458 458 print '(%s Mb)' % (vbytes/Mb,)
459 459 else:
460 460 try:
461 461 vstr = str(var)
462 462 except UnicodeEncodeError:
463 463 vstr = unicode(var).encode(DEFAULT_ENCODING,
464 464 'backslashreplace')
465 465 except:
466 466 vstr = "<object with id %d (str() failed)>" % id(var)
467 467 vstr = vstr.replace('\n', '\\n')
468 468 if len(vstr) < 50:
469 469 print vstr
470 470 else:
471 471 print vstr[:25] + "<...>" + vstr[-25:]
472 472
473 473 @line_magic
474 474 def reset(self, parameter_s=''):
475 475 """Resets the namespace by removing all names defined by the user, if
476 476 called without arguments, or by removing some types of objects, such
477 477 as everything currently in IPython's In[] and Out[] containers (see
478 478 the parameters for details).
479 479
480 480 Parameters
481 481 ----------
482 482 -f : force reset without asking for confirmation.
483 483
484 484 -s : 'Soft' reset: Only clears your namespace, leaving history intact.
485 485 References to objects may be kept. By default (without this option),
486 486 we do a 'hard' reset, giving you a new session and removing all
487 487 references to objects from the current session.
488 488
489 489 in : reset input history
490 490
491 491 out : reset output history
492 492
493 493 dhist : reset directory history
494 494
495 495 array : reset only variables that are NumPy arrays
496 496
497 497 See Also
498 498 --------
499 499 magic_reset_selective : invoked as ``%reset_selective``
500 500
501 501 Examples
502 502 --------
503 503 ::
504 504
505 505 In [6]: a = 1
506 506
507 507 In [7]: a
508 508 Out[7]: 1
509 509
510 510 In [8]: 'a' in _ip.user_ns
511 511 Out[8]: True
512 512
513 513 In [9]: %reset -f
514 514
515 515 In [1]: 'a' in _ip.user_ns
516 516 Out[1]: False
517 517
518 518 In [2]: %reset -f in
519 519 Flushing input history
520 520
521 521 In [3]: %reset -f dhist in
522 522 Flushing directory history
523 523 Flushing input history
524 524
525 525 Notes
526 526 -----
527 527 Calling this magic from clients that do not implement standard input,
528 528 such as the ipython notebook interface, will reset the namespace
529 529 without confirmation.
530 530 """
531 531 opts, args = self.parse_options(parameter_s,'sf', mode='list')
532 532 if 'f' in opts:
533 533 ans = True
534 534 else:
535 535 try:
536 536 ans = self.shell.ask_yes_no(
537 537 "Once deleted, variables cannot be recovered. Proceed (y/[n])?",
538 538 default='n')
539 539 except StdinNotImplementedError:
540 540 ans = True
541 541 if not ans:
542 542 print 'Nothing done.'
543 543 return
544 544
545 545 if 's' in opts: # Soft reset
546 546 user_ns = self.shell.user_ns
547 547 for i in self.who_ls():
548 548 del(user_ns[i])
549 549 elif len(args) == 0: # Hard reset
550 550 self.shell.reset(new_session = False)
551 551
552 552 # reset in/out/dhist/array: previously extensinions/clearcmd.py
553 553 ip = self.shell
554 554 user_ns = self.shell.user_ns # local lookup, heavily used
555 555
556 556 for target in args:
557 557 target = target.lower() # make matches case insensitive
558 558 if target == 'out':
559 559 print "Flushing output cache (%d entries)" % len(user_ns['_oh'])
560 560 self.shell.displayhook.flush()
561 561
562 562 elif target == 'in':
563 563 print "Flushing input history"
564 564 pc = self.shell.displayhook.prompt_count + 1
565 565 for n in range(1, pc):
566 566 key = '_i'+repr(n)
567 567 user_ns.pop(key,None)
568 568 user_ns.update(dict(_i=u'',_ii=u'',_iii=u''))
569 569 hm = ip.history_manager
570 570 # don't delete these, as %save and %macro depending on the
571 571 # length of these lists to be preserved
572 572 hm.input_hist_parsed[:] = [''] * pc
573 573 hm.input_hist_raw[:] = [''] * pc
574 574 # hm has internal machinery for _i,_ii,_iii, clear it out
575 575 hm._i = hm._ii = hm._iii = hm._i00 = u''
576 576
577 577 elif target == 'array':
578 578 # Support cleaning up numpy arrays
579 579 try:
580 580 from numpy import ndarray
581 581 # This must be done with items and not iteritems because
582 582 # we're going to modify the dict in-place.
583 583 for x,val in user_ns.items():
584 584 if isinstance(val,ndarray):
585 585 del user_ns[x]
586 586 except ImportError:
587 587 print "reset array only works if Numpy is available."
588 588
589 589 elif target == 'dhist':
590 590 print "Flushing directory history"
591 591 del user_ns['_dh'][:]
592 592
593 593 else:
594 594 print "Don't know how to reset ",
595 595 print target + ", please run `%reset?` for details"
596 596
597 597 gc.collect()
598 598
599 599 @line_magic
600 600 def reset_selective(self, parameter_s=''):
601 601 """Resets the namespace by removing names defined by the user.
602 602
603 603 Input/Output history are left around in case you need them.
604 604
605 605 %reset_selective [-f] regex
606 606
607 607 No action is taken if regex is not included
608 608
609 609 Options
610 610 -f : force reset without asking for confirmation.
611 611
612 612 See Also
613 613 --------
614 614 magic_reset : invoked as ``%reset``
615 615
616 616 Examples
617 617 --------
618 618
619 619 We first fully reset the namespace so your output looks identical to
620 620 this example for pedagogical reasons; in practice you do not need a
621 621 full reset::
622 622
623 623 In [1]: %reset -f
624 624
625 625 Now, with a clean namespace we can make a few variables and use
626 626 ``%reset_selective`` to only delete names that match our regexp::
627 627
628 628 In [2]: a=1; b=2; c=3; b1m=4; b2m=5; b3m=6; b4m=7; b2s=8
629 629
630 630 In [3]: who_ls
631 631 Out[3]: ['a', 'b', 'b1m', 'b2m', 'b2s', 'b3m', 'b4m', 'c']
632 632
633 633 In [4]: %reset_selective -f b[2-3]m
634 634
635 635 In [5]: who_ls
636 636 Out[5]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
637 637
638 638 In [6]: %reset_selective -f d
639 639
640 640 In [7]: who_ls
641 641 Out[7]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
642 642
643 643 In [8]: %reset_selective -f c
644 644
645 645 In [9]: who_ls
646 646 Out[9]: ['a', 'b', 'b1m', 'b2s', 'b4m']
647 647
648 648 In [10]: %reset_selective -f b
649 649
650 650 In [11]: who_ls
651 651 Out[11]: ['a']
652 652
653 653 Notes
654 654 -----
655 655 Calling this magic from clients that do not implement standard input,
656 656 such as the ipython notebook interface, will reset the namespace
657 657 without confirmation.
658 658 """
659 659
660 660 opts, regex = self.parse_options(parameter_s,'f')
661 661
662 662 if 'f' in opts:
663 663 ans = True
664 664 else:
665 665 try:
666 666 ans = self.shell.ask_yes_no(
667 667 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ",
668 668 default='n')
669 669 except StdinNotImplementedError:
670 670 ans = True
671 671 if not ans:
672 672 print 'Nothing done.'
673 673 return
674 674 user_ns = self.shell.user_ns
675 675 if not regex:
676 676 print 'No regex pattern specified. Nothing done.'
677 677 return
678 678 else:
679 679 try:
680 680 m = re.compile(regex)
681 681 except TypeError:
682 682 raise TypeError('regex must be a string or compiled pattern')
683 683 for i in self.who_ls():
684 684 if m.search(i):
685 685 del(user_ns[i])
686 686
687 687 @line_magic
688 688 def xdel(self, parameter_s=''):
689 689 """Delete a variable, trying to clear it from anywhere that
690 690 IPython's machinery has references to it. By default, this uses
691 691 the identity of the named object in the user namespace to remove
692 692 references held under other names. The object is also removed
693 693 from the output history.
694 694
695 695 Options
696 696 -n : Delete the specified name from all namespaces, without
697 697 checking their identity.
698 698 """
699 699 opts, varname = self.parse_options(parameter_s,'n')
700 700 try:
701 701 self.shell.del_var(varname, ('n' in opts))
702 702 except (NameError, ValueError) as e:
703 703 print type(e).__name__ +": "+ str(e)
General Comments 0
You need to be logged in to leave comments. Login now