##// END OF EJS Templates
Backport PR #12631: Mark initial frame as not hidden.
Matthias Bussonnier -
Show More
@@ -1,813 +1,820 b''
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 https://docs.python.org/2/license.html
17 17 """
18 18
19 19 #*****************************************************************************
20 20 #
21 21 # This file is licensed under the PSF license.
22 22 #
23 23 # Copyright (C) 2001 Python Software Foundation, www.python.org
24 24 # Copyright (C) 2005-2006 Fernando Perez. <fperez@colorado.edu>
25 25 #
26 26 #
27 27 #*****************************************************************************
28 28
29 29 import bdb
30 30 import functools
31 31 import inspect
32 32 import linecache
33 33 import sys
34 34 import warnings
35 35 import re
36 36
37 37 from IPython import get_ipython
38 38 from IPython.utils import PyColorize
39 39 from IPython.utils import coloransi, py3compat
40 40 from IPython.core.excolors import exception_colors
41 41 from IPython.testing.skipdoctest import skip_doctest
42 42
43 43
44 44 prompt = 'ipdb> '
45 45
46 46 #We have to check this directly from sys.argv, config struct not yet available
47 47 from pdb import Pdb as OldPdb
48 48
49 49 # Allow the set_trace code to operate outside of an ipython instance, even if
50 50 # it does so with some limitations. The rest of this support is implemented in
51 51 # the Tracer constructor.
52 52
53 53 def make_arrow(pad):
54 54 """generate the leading arrow in front of traceback or debugger"""
55 55 if pad >= 2:
56 56 return '-'*(pad-2) + '> '
57 57 elif pad == 1:
58 58 return '>'
59 59 return ''
60 60
61 61
62 62 def BdbQuit_excepthook(et, ev, tb, excepthook=None):
63 63 """Exception hook which handles `BdbQuit` exceptions.
64 64
65 65 All other exceptions are processed using the `excepthook`
66 66 parameter.
67 67 """
68 68 warnings.warn("`BdbQuit_excepthook` is deprecated since version 5.1",
69 69 DeprecationWarning, stacklevel=2)
70 70 if et==bdb.BdbQuit:
71 71 print('Exiting Debugger.')
72 72 elif excepthook is not None:
73 73 excepthook(et, ev, tb)
74 74 else:
75 75 # Backwards compatibility. Raise deprecation warning?
76 76 BdbQuit_excepthook.excepthook_ori(et,ev,tb)
77 77
78 78
79 79 def BdbQuit_IPython_excepthook(self,et,ev,tb,tb_offset=None):
80 80 warnings.warn(
81 81 "`BdbQuit_IPython_excepthook` is deprecated since version 5.1",
82 82 DeprecationWarning, stacklevel=2)
83 83 print('Exiting Debugger.')
84 84
85 85
86 86 class Tracer(object):
87 87 """
88 88 DEPRECATED
89 89
90 90 Class for local debugging, similar to pdb.set_trace.
91 91
92 92 Instances of this class, when called, behave like pdb.set_trace, but
93 93 providing IPython's enhanced capabilities.
94 94
95 95 This is implemented as a class which must be initialized in your own code
96 96 and not as a standalone function because we need to detect at runtime
97 97 whether IPython is already active or not. That detection is done in the
98 98 constructor, ensuring that this code plays nicely with a running IPython,
99 99 while functioning acceptably (though with limitations) if outside of it.
100 100 """
101 101
102 102 @skip_doctest
103 103 def __init__(self, colors=None):
104 104 """
105 105 DEPRECATED
106 106
107 107 Create a local debugger instance.
108 108
109 109 Parameters
110 110 ----------
111 111
112 112 colors : str, optional
113 113 The name of the color scheme to use, it must be one of IPython's
114 114 valid color schemes. If not given, the function will default to
115 115 the current IPython scheme when running inside IPython, and to
116 116 'NoColor' otherwise.
117 117
118 118 Examples
119 119 --------
120 120 ::
121 121
122 122 from IPython.core.debugger import Tracer; debug_here = Tracer()
123 123
124 124 Later in your code::
125 125
126 126 debug_here() # -> will open up the debugger at that point.
127 127
128 128 Once the debugger activates, you can use all of its regular commands to
129 129 step through code, set breakpoints, etc. See the pdb documentation
130 130 from the Python standard library for usage details.
131 131 """
132 132 warnings.warn("`Tracer` is deprecated since version 5.1, directly use "
133 133 "`IPython.core.debugger.Pdb.set_trace()`",
134 134 DeprecationWarning, stacklevel=2)
135 135
136 136 ip = get_ipython()
137 137 if ip is None:
138 138 # Outside of ipython, we set our own exception hook manually
139 139 sys.excepthook = functools.partial(BdbQuit_excepthook,
140 140 excepthook=sys.excepthook)
141 141 def_colors = 'NoColor'
142 142 else:
143 143 # In ipython, we use its custom exception handler mechanism
144 144 def_colors = ip.colors
145 145 ip.set_custom_exc((bdb.BdbQuit,), BdbQuit_IPython_excepthook)
146 146
147 147 if colors is None:
148 148 colors = def_colors
149 149
150 150 # The stdlib debugger internally uses a modified repr from the `repr`
151 151 # module, that limits the length of printed strings to a hardcoded
152 152 # limit of 30 characters. That much trimming is too aggressive, let's
153 153 # at least raise that limit to 80 chars, which should be enough for
154 154 # most interactive uses.
155 155 try:
156 156 from reprlib import aRepr
157 157 aRepr.maxstring = 80
158 158 except:
159 159 # This is only a user-facing convenience, so any error we encounter
160 160 # here can be warned about but can be otherwise ignored. These
161 161 # printouts will tell us about problems if this API changes
162 162 import traceback
163 163 traceback.print_exc()
164 164
165 165 self.debugger = Pdb(colors)
166 166
167 167 def __call__(self):
168 168 """Starts an interactive debugger at the point where called.
169 169
170 170 This is similar to the pdb.set_trace() function from the std lib, but
171 171 using IPython's enhanced debugger."""
172 172
173 173 self.debugger.set_trace(sys._getframe().f_back)
174 174
175 175
176 176 RGX_EXTRA_INDENT = re.compile(r'(?<=\n)\s+')
177 177
178 178
179 179 def strip_indentation(multiline_string):
180 180 return RGX_EXTRA_INDENT.sub('', multiline_string)
181 181
182 182
183 183 def decorate_fn_with_doc(new_fn, old_fn, additional_text=""):
184 184 """Make new_fn have old_fn's doc string. This is particularly useful
185 185 for the ``do_...`` commands that hook into the help system.
186 186 Adapted from from a comp.lang.python posting
187 187 by Duncan Booth."""
188 188 def wrapper(*args, **kw):
189 189 return new_fn(*args, **kw)
190 190 if old_fn.__doc__:
191 191 wrapper.__doc__ = strip_indentation(old_fn.__doc__) + additional_text
192 192 return wrapper
193 193
194 194
195 195 class Pdb(OldPdb):
196 196 """Modified Pdb class, does not load readline.
197 197
198 198 for a standalone version that uses prompt_toolkit, see
199 199 `IPython.terminal.debugger.TerminalPdb` and
200 200 `IPython.terminal.debugger.set_trace()`
201 201 """
202 202
203 203 def __init__(self, color_scheme=None, completekey=None,
204 204 stdin=None, stdout=None, context=5, **kwargs):
205 205 """Create a new IPython debugger.
206 206
207 207 :param color_scheme: Deprecated, do not use.
208 208 :param completekey: Passed to pdb.Pdb.
209 209 :param stdin: Passed to pdb.Pdb.
210 210 :param stdout: Passed to pdb.Pdb.
211 211 :param context: Number of lines of source code context to show when
212 212 displaying stacktrace information.
213 213 :param kwargs: Passed to pdb.Pdb.
214 214 The possibilities are python version dependent, see the python
215 215 docs for more info.
216 216 """
217 217
218 218 # Parent constructor:
219 219 try:
220 220 self.context = int(context)
221 221 if self.context <= 0:
222 222 raise ValueError("Context must be a positive integer")
223 223 except (TypeError, ValueError):
224 224 raise ValueError("Context must be a positive integer")
225 225
226 226 # `kwargs` ensures full compatibility with stdlib's `pdb.Pdb`.
227 227 OldPdb.__init__(self, completekey, stdin, stdout, **kwargs)
228 228
229 229 # IPython changes...
230 230 self.shell = get_ipython()
231 231
232 232 if self.shell is None:
233 233 save_main = sys.modules['__main__']
234 234 # No IPython instance running, we must create one
235 235 from IPython.terminal.interactiveshell import \
236 236 TerminalInteractiveShell
237 237 self.shell = TerminalInteractiveShell.instance()
238 238 # needed by any code which calls __import__("__main__") after
239 239 # the debugger was entered. See also #9941.
240 240 sys.modules['__main__'] = save_main
241 241
242 242 if color_scheme is not None:
243 243 warnings.warn(
244 244 "The `color_scheme` argument is deprecated since version 5.1",
245 245 DeprecationWarning, stacklevel=2)
246 246 else:
247 247 color_scheme = self.shell.colors
248 248
249 249 self.aliases = {}
250 250
251 251 # Create color table: we copy the default one from the traceback
252 252 # module and add a few attributes needed for debugging
253 253 self.color_scheme_table = exception_colors()
254 254
255 255 # shorthands
256 256 C = coloransi.TermColors
257 257 cst = self.color_scheme_table
258 258
259 259 cst['NoColor'].colors.prompt = C.NoColor
260 260 cst['NoColor'].colors.breakpoint_enabled = C.NoColor
261 261 cst['NoColor'].colors.breakpoint_disabled = C.NoColor
262 262
263 263 cst['Linux'].colors.prompt = C.Green
264 264 cst['Linux'].colors.breakpoint_enabled = C.LightRed
265 265 cst['Linux'].colors.breakpoint_disabled = C.Red
266 266
267 267 cst['LightBG'].colors.prompt = C.Blue
268 268 cst['LightBG'].colors.breakpoint_enabled = C.LightRed
269 269 cst['LightBG'].colors.breakpoint_disabled = C.Red
270 270
271 271 cst['Neutral'].colors.prompt = C.Blue
272 272 cst['Neutral'].colors.breakpoint_enabled = C.LightRed
273 273 cst['Neutral'].colors.breakpoint_disabled = C.Red
274 274
275 275
276 276 # Add a python parser so we can syntax highlight source while
277 277 # debugging.
278 278 self.parser = PyColorize.Parser(style=color_scheme)
279 279 self.set_colors(color_scheme)
280 280
281 281 # Set the prompt - the default prompt is '(Pdb)'
282 282 self.prompt = prompt
283 283 self.skip_hidden = True
284 284
285 285 def set_colors(self, scheme):
286 286 """Shorthand access to the color table scheme selector method."""
287 287 self.color_scheme_table.set_active_scheme(scheme)
288 288 self.parser.style = scheme
289 289
290 def set_trace(self, frame=None):
291 if frame is None:
292 frame = sys._getframe().f_back
293 self.initial_frame = frame
294 return super().set_trace(frame)
290 295
291 296 def hidden_frames(self, stack):
292 297 """
293 298 Given an index in the stack return wether it should be skipped.
294 299
295 300 This is used in up/down and where to skip frames.
296 301 """
297 302 # The f_locals dictionary is updated from the actual frame
298 303 # locals whenever the .f_locals accessor is called, so we
299 304 # avoid calling it here to preserve self.curframe_locals.
300 305 # Futhermore, there is no good reason to hide the current frame.
301 306 ip_hide = [
302 False if s[0] is self.curframe else s[0].f_locals.get(
303 "__tracebackhide__", False)
304 for s in stack]
307 False
308 if s[0] in (self.curframe, getattr(self, "initial_frame", None))
309 else s[0].f_locals.get("__tracebackhide__", False)
310 for s in stack
311 ]
305 312 ip_start = [i for i, s in enumerate(ip_hide) if s == "__ipython_bottom__"]
306 313 if ip_start:
307 314 ip_hide = [h if i > ip_start[0] else True for (i, h) in enumerate(ip_hide)]
308 315 return ip_hide
309 316
310 317 def interaction(self, frame, traceback):
311 318 try:
312 319 OldPdb.interaction(self, frame, traceback)
313 320 except KeyboardInterrupt:
314 321 self.stdout.write("\n" + self.shell.get_exception_only())
315 322
316 323 def new_do_frame(self, arg):
317 324 OldPdb.do_frame(self, arg)
318 325
319 326 def new_do_quit(self, arg):
320 327
321 328 if hasattr(self, 'old_all_completions'):
322 329 self.shell.Completer.all_completions=self.old_all_completions
323 330
324 331 return OldPdb.do_quit(self, arg)
325 332
326 333 do_q = do_quit = decorate_fn_with_doc(new_do_quit, OldPdb.do_quit)
327 334
328 335 def new_do_restart(self, arg):
329 336 """Restart command. In the context of ipython this is exactly the same
330 337 thing as 'quit'."""
331 338 self.msg("Restart doesn't make sense here. Using 'quit' instead.")
332 339 return self.do_quit(arg)
333 340
334 341 def print_stack_trace(self, context=None):
335 342 Colors = self.color_scheme_table.active_colors
336 343 ColorsNormal = Colors.Normal
337 344 if context is None:
338 345 context = self.context
339 346 try:
340 347 context=int(context)
341 348 if context <= 0:
342 349 raise ValueError("Context must be a positive integer")
343 350 except (TypeError, ValueError):
344 351 raise ValueError("Context must be a positive integer")
345 352 try:
346 353 skipped = 0
347 354 for hidden, frame_lineno in zip(self.hidden_frames(self.stack), self.stack):
348 355 if hidden and self.skip_hidden:
349 356 skipped += 1
350 357 continue
351 358 if skipped:
352 359 print(
353 360 f"{Colors.excName} [... skipping {skipped} hidden frame(s)]{ColorsNormal}\n"
354 361 )
355 362 skipped = 0
356 363 self.print_stack_entry(frame_lineno, context=context)
357 364 if skipped:
358 365 print(
359 366 f"{Colors.excName} [... skipping {skipped} hidden frame(s)]{ColorsNormal}\n"
360 367 )
361 368 except KeyboardInterrupt:
362 369 pass
363 370
364 371 def print_stack_entry(self, frame_lineno, prompt_prefix='\n-> ',
365 372 context=None):
366 373 if context is None:
367 374 context = self.context
368 375 try:
369 376 context=int(context)
370 377 if context <= 0:
371 378 raise ValueError("Context must be a positive integer")
372 379 except (TypeError, ValueError):
373 380 raise ValueError("Context must be a positive integer")
374 381 print(self.format_stack_entry(frame_lineno, '', context), file=self.stdout)
375 382
376 383 # vds: >>
377 384 frame, lineno = frame_lineno
378 385 filename = frame.f_code.co_filename
379 386 self.shell.hooks.synchronize_with_editor(filename, lineno, 0)
380 387 # vds: <<
381 388
382 389 def format_stack_entry(self, frame_lineno, lprefix=': ', context=None):
383 390 if context is None:
384 391 context = self.context
385 392 try:
386 393 context=int(context)
387 394 if context <= 0:
388 395 print("Context must be a positive integer", file=self.stdout)
389 396 except (TypeError, ValueError):
390 397 print("Context must be a positive integer", file=self.stdout)
391 398 try:
392 399 import reprlib # Py 3
393 400 except ImportError:
394 401 import repr as reprlib # Py 2
395 402
396 403 ret = []
397 404
398 405 Colors = self.color_scheme_table.active_colors
399 406 ColorsNormal = Colors.Normal
400 407 tpl_link = u'%s%%s%s' % (Colors.filenameEm, ColorsNormal)
401 408 tpl_call = u'%s%%s%s%%s%s' % (Colors.vName, Colors.valEm, ColorsNormal)
402 409 tpl_line = u'%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
403 410 tpl_line_em = u'%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line,
404 411 ColorsNormal)
405 412
406 413 frame, lineno = frame_lineno
407 414
408 415 return_value = ''
409 416 if '__return__' in frame.f_locals:
410 417 rv = frame.f_locals['__return__']
411 418 #return_value += '->'
412 419 return_value += reprlib.repr(rv) + '\n'
413 420 ret.append(return_value)
414 421
415 422 #s = filename + '(' + `lineno` + ')'
416 423 filename = self.canonic(frame.f_code.co_filename)
417 424 link = tpl_link % py3compat.cast_unicode(filename)
418 425
419 426 if frame.f_code.co_name:
420 427 func = frame.f_code.co_name
421 428 else:
422 429 func = "<lambda>"
423 430
424 431 call = ''
425 432 if func != '?':
426 433 if '__args__' in frame.f_locals:
427 434 args = reprlib.repr(frame.f_locals['__args__'])
428 435 else:
429 436 args = '()'
430 437 call = tpl_call % (func, args)
431 438
432 439 # The level info should be generated in the same format pdb uses, to
433 440 # avoid breaking the pdbtrack functionality of python-mode in *emacs.
434 441 if frame is self.curframe:
435 442 ret.append('> ')
436 443 else:
437 444 ret.append(' ')
438 445 ret.append(u'%s(%s)%s\n' % (link,lineno,call))
439 446
440 447 start = lineno - 1 - context//2
441 448 lines = linecache.getlines(filename)
442 449 start = min(start, len(lines) - context)
443 450 start = max(start, 0)
444 451 lines = lines[start : start + context]
445 452
446 453 for i,line in enumerate(lines):
447 454 show_arrow = (start + 1 + i == lineno)
448 455 linetpl = (frame is self.curframe or show_arrow) \
449 456 and tpl_line_em \
450 457 or tpl_line
451 458 ret.append(self.__format_line(linetpl, filename,
452 459 start + 1 + i, line,
453 460 arrow = show_arrow) )
454 461 return ''.join(ret)
455 462
456 463 def __format_line(self, tpl_line, filename, lineno, line, arrow = False):
457 464 bp_mark = ""
458 465 bp_mark_color = ""
459 466
460 467 new_line, err = self.parser.format2(line, 'str')
461 468 if not err:
462 469 line = new_line
463 470
464 471 bp = None
465 472 if lineno in self.get_file_breaks(filename):
466 473 bps = self.get_breaks(filename, lineno)
467 474 bp = bps[-1]
468 475
469 476 if bp:
470 477 Colors = self.color_scheme_table.active_colors
471 478 bp_mark = str(bp.number)
472 479 bp_mark_color = Colors.breakpoint_enabled
473 480 if not bp.enabled:
474 481 bp_mark_color = Colors.breakpoint_disabled
475 482
476 483 numbers_width = 7
477 484 if arrow:
478 485 # This is the line with the error
479 486 pad = numbers_width - len(str(lineno)) - len(bp_mark)
480 487 num = '%s%s' % (make_arrow(pad), str(lineno))
481 488 else:
482 489 num = '%*s' % (numbers_width - len(bp_mark), str(lineno))
483 490
484 491 return tpl_line % (bp_mark_color + bp_mark, num, line)
485 492
486 493
487 494 def print_list_lines(self, filename, first, last):
488 495 """The printing (as opposed to the parsing part of a 'list'
489 496 command."""
490 497 try:
491 498 Colors = self.color_scheme_table.active_colors
492 499 ColorsNormal = Colors.Normal
493 500 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
494 501 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal)
495 502 src = []
496 503 if filename == "<string>" and hasattr(self, "_exec_filename"):
497 504 filename = self._exec_filename
498 505
499 506 for lineno in range(first, last+1):
500 507 line = linecache.getline(filename, lineno)
501 508 if not line:
502 509 break
503 510
504 511 if lineno == self.curframe.f_lineno:
505 512 line = self.__format_line(tpl_line_em, filename, lineno, line, arrow = True)
506 513 else:
507 514 line = self.__format_line(tpl_line, filename, lineno, line, arrow = False)
508 515
509 516 src.append(line)
510 517 self.lineno = lineno
511 518
512 519 print(''.join(src), file=self.stdout)
513 520
514 521 except KeyboardInterrupt:
515 522 pass
516 523
517 524 def do_skip_hidden(self, arg):
518 525 """
519 526 Change whether or not we should skip frames with the
520 527 __tracebackhide__ attribute.
521 528 """
522 529 if arg.strip().lower() in ("true", "yes"):
523 530 self.skip_hidden = True
524 531 elif arg.strip().lower() in ("false", "no"):
525 532 self.skip_hidden = False
526 533
527 534 def do_list(self, arg):
528 535 """Print lines of code from the current stack frame
529 536 """
530 537 self.lastcmd = 'list'
531 538 last = None
532 539 if arg:
533 540 try:
534 541 x = eval(arg, {}, {})
535 542 if type(x) == type(()):
536 543 first, last = x
537 544 first = int(first)
538 545 last = int(last)
539 546 if last < first:
540 547 # Assume it's a count
541 548 last = first + last
542 549 else:
543 550 first = max(1, int(x) - 5)
544 551 except:
545 552 print('*** Error in argument:', repr(arg), file=self.stdout)
546 553 return
547 554 elif self.lineno is None:
548 555 first = max(1, self.curframe.f_lineno - 5)
549 556 else:
550 557 first = self.lineno + 1
551 558 if last is None:
552 559 last = first + 10
553 560 self.print_list_lines(self.curframe.f_code.co_filename, first, last)
554 561
555 562 # vds: >>
556 563 lineno = first
557 564 filename = self.curframe.f_code.co_filename
558 565 self.shell.hooks.synchronize_with_editor(filename, lineno, 0)
559 566 # vds: <<
560 567
561 568 do_l = do_list
562 569
563 570 def getsourcelines(self, obj):
564 571 lines, lineno = inspect.findsource(obj)
565 572 if inspect.isframe(obj) and obj.f_globals is obj.f_locals:
566 573 # must be a module frame: do not try to cut a block out of it
567 574 return lines, 1
568 575 elif inspect.ismodule(obj):
569 576 return lines, 1
570 577 return inspect.getblock(lines[lineno:]), lineno+1
571 578
572 579 def do_longlist(self, arg):
573 580 """Print lines of code from the current stack frame.
574 581
575 582 Shows more lines than 'list' does.
576 583 """
577 584 self.lastcmd = 'longlist'
578 585 try:
579 586 lines, lineno = self.getsourcelines(self.curframe)
580 587 except OSError as err:
581 588 self.error(err)
582 589 return
583 590 last = lineno + len(lines)
584 591 self.print_list_lines(self.curframe.f_code.co_filename, lineno, last)
585 592 do_ll = do_longlist
586 593
587 594 def do_debug(self, arg):
588 595 """debug code
589 596 Enter a recursive debugger that steps through the code
590 597 argument (which is an arbitrary expression or statement to be
591 598 executed in the current environment).
592 599 """
593 600 sys.settrace(None)
594 601 globals = self.curframe.f_globals
595 602 locals = self.curframe_locals
596 603 p = self.__class__(completekey=self.completekey,
597 604 stdin=self.stdin, stdout=self.stdout)
598 605 p.use_rawinput = self.use_rawinput
599 606 p.prompt = "(%s) " % self.prompt.strip()
600 607 self.message("ENTERING RECURSIVE DEBUGGER")
601 608 sys.call_tracing(p.run, (arg, globals, locals))
602 609 self.message("LEAVING RECURSIVE DEBUGGER")
603 610 sys.settrace(self.trace_dispatch)
604 611 self.lastcmd = p.lastcmd
605 612
606 613 def do_pdef(self, arg):
607 614 """Print the call signature for any callable object.
608 615
609 616 The debugger interface to %pdef"""
610 617 namespaces = [('Locals', self.curframe.f_locals),
611 618 ('Globals', self.curframe.f_globals)]
612 619 self.shell.find_line_magic('pdef')(arg, namespaces=namespaces)
613 620
614 621 def do_pdoc(self, arg):
615 622 """Print the docstring for an object.
616 623
617 624 The debugger interface to %pdoc."""
618 625 namespaces = [('Locals', self.curframe.f_locals),
619 626 ('Globals', self.curframe.f_globals)]
620 627 self.shell.find_line_magic('pdoc')(arg, namespaces=namespaces)
621 628
622 629 def do_pfile(self, arg):
623 630 """Print (or run through pager) the file where an object is defined.
624 631
625 632 The debugger interface to %pfile.
626 633 """
627 634 namespaces = [('Locals', self.curframe.f_locals),
628 635 ('Globals', self.curframe.f_globals)]
629 636 self.shell.find_line_magic('pfile')(arg, namespaces=namespaces)
630 637
631 638 def do_pinfo(self, arg):
632 639 """Provide detailed information about an object.
633 640
634 641 The debugger interface to %pinfo, i.e., obj?."""
635 642 namespaces = [('Locals', self.curframe.f_locals),
636 643 ('Globals', self.curframe.f_globals)]
637 644 self.shell.find_line_magic('pinfo')(arg, namespaces=namespaces)
638 645
639 646 def do_pinfo2(self, arg):
640 647 """Provide extra detailed information about an object.
641 648
642 649 The debugger interface to %pinfo2, i.e., obj??."""
643 650 namespaces = [('Locals', self.curframe.f_locals),
644 651 ('Globals', self.curframe.f_globals)]
645 652 self.shell.find_line_magic('pinfo2')(arg, namespaces=namespaces)
646 653
647 654 def do_psource(self, arg):
648 655 """Print (or run through pager) the source code for an object."""
649 656 namespaces = [('Locals', self.curframe.f_locals),
650 657 ('Globals', self.curframe.f_globals)]
651 658 self.shell.find_line_magic('psource')(arg, namespaces=namespaces)
652 659
653 660 def do_where(self, arg):
654 661 """w(here)
655 662 Print a stack trace, with the most recent frame at the bottom.
656 663 An arrow indicates the "current frame", which determines the
657 664 context of most commands. 'bt' is an alias for this command.
658 665
659 666 Take a number as argument as an (optional) number of context line to
660 667 print"""
661 668 if arg:
662 669 try:
663 670 context = int(arg)
664 671 except ValueError as err:
665 672 self.error(err)
666 673 return
667 674 self.print_stack_trace(context)
668 675 else:
669 676 self.print_stack_trace()
670 677
671 678 do_w = do_where
672 679
673 680 def stop_here(self, frame):
674 681 """Check if pdb should stop here"""
675 682 if not super().stop_here(frame):
676 683 return False
677 684 if self.skip_hidden and frame.f_locals.get("__tracebackhide__", False):
678 685 if self._wait_for_mainpyfile:
679 686 return False
680 687 Colors = self.color_scheme_table.active_colors
681 688 ColorsNormal = Colors.Normal
682 689 print(f"{Colors.excName} [... skipped 1 hidden frame]{ColorsNormal}\n")
683 690 return False
684 691 return True
685 692
686 693 def do_up(self, arg):
687 694 """u(p) [count]
688 695 Move the current frame count (default one) levels up in the
689 696 stack trace (to an older frame).
690 697
691 698 Will skip hidden frames.
692 699 """
693 700 ## modified version of upstream that skips
694 701 # frames with __tracebackide__
695 702 if self.curindex == 0:
696 703 self.error("Oldest frame")
697 704 return
698 705 try:
699 706 count = int(arg or 1)
700 707 except ValueError:
701 708 self.error("Invalid frame count (%s)" % arg)
702 709 return
703 710 skipped = 0
704 711 if count < 0:
705 712 _newframe = 0
706 713 else:
707 714 _newindex = self.curindex
708 715 counter = 0
709 716 hidden_frames = self.hidden_frames(self.stack)
710 717 for i in range(self.curindex - 1, -1, -1):
711 718 frame = self.stack[i][0]
712 719 if hidden_frames[i] and self.skip_hidden:
713 720 skipped += 1
714 721 continue
715 722 counter += 1
716 723 if counter >= count:
717 724 break
718 725 else:
719 726 # if no break occured.
720 727 self.error("all frames above hidden")
721 728 return
722 729
723 730 Colors = self.color_scheme_table.active_colors
724 731 ColorsNormal = Colors.Normal
725 732 _newframe = i
726 733 self._select_frame(_newframe)
727 734 if skipped:
728 735 print(
729 736 f"{Colors.excName} [... skipped {skipped} hidden frame(s)]{ColorsNormal}\n"
730 737 )
731 738
732 739 def do_down(self, arg):
733 740 """d(own) [count]
734 741 Move the current frame count (default one) levels down in the
735 742 stack trace (to a newer frame).
736 743
737 744 Will skip hidden frames.
738 745 """
739 746 if self.curindex + 1 == len(self.stack):
740 747 self.error("Newest frame")
741 748 return
742 749 try:
743 750 count = int(arg or 1)
744 751 except ValueError:
745 752 self.error("Invalid frame count (%s)" % arg)
746 753 return
747 754 if count < 0:
748 755 _newframe = len(self.stack) - 1
749 756 else:
750 757 _newindex = self.curindex
751 758 counter = 0
752 759 skipped = 0
753 760 hidden_frames = self.hidden_frames(self.stack)
754 761 for i in range(self.curindex + 1, len(self.stack)):
755 762 frame = self.stack[i][0]
756 763 if hidden_frames[i] and self.skip_hidden:
757 764 skipped += 1
758 765 continue
759 766 counter += 1
760 767 if counter >= count:
761 768 break
762 769 else:
763 770 self.error("all frames bellow hidden")
764 771 return
765 772
766 773 Colors = self.color_scheme_table.active_colors
767 774 ColorsNormal = Colors.Normal
768 775 if skipped:
769 776 print(
770 777 f"{Colors.excName} [... skipped {skipped} hidden frame(s)]{ColorsNormal}\n"
771 778 )
772 779 _newframe = i
773 780
774 781 self._select_frame(_newframe)
775 782
776 783 do_d = do_down
777 784 do_u = do_up
778 785
779 786 class InterruptiblePdb(Pdb):
780 787 """Version of debugger where KeyboardInterrupt exits the debugger altogether."""
781 788
782 789 def cmdloop(self):
783 790 """Wrap cmdloop() such that KeyboardInterrupt stops the debugger."""
784 791 try:
785 792 return OldPdb.cmdloop(self)
786 793 except KeyboardInterrupt:
787 794 self.stop_here = lambda frame: False
788 795 self.do_quit("")
789 796 sys.settrace(None)
790 797 self.quitting = False
791 798 raise
792 799
793 800 def _cmdloop(self):
794 801 while True:
795 802 try:
796 803 # keyboard interrupts allow for an easy way to cancel
797 804 # the current command, so allow them during interactive input
798 805 self.allow_kbdint = True
799 806 self.cmdloop()
800 807 self.allow_kbdint = False
801 808 break
802 809 except KeyboardInterrupt:
803 810 self.message('--KeyboardInterrupt--')
804 811 raise
805 812
806 813
807 814 def set_trace(frame=None):
808 815 """
809 816 Start debugging from `frame`.
810 817
811 818 If frame is not specified, debugging starts from caller's frame.
812 819 """
813 820 Pdb().set_trace(frame or sys._getframe().f_back)
@@ -1,3799 +1,3800 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Main IPython class."""
3 3
4 4 #-----------------------------------------------------------------------------
5 5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
6 6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
7 7 # Copyright (C) 2008-2011 The IPython Development Team
8 8 #
9 9 # Distributed under the terms of the BSD License. The full license is in
10 10 # the file COPYING, distributed as part of this software.
11 11 #-----------------------------------------------------------------------------
12 12
13 13
14 14 import abc
15 15 import ast
16 16 import atexit
17 17 import builtins as builtin_mod
18 18 import functools
19 19 import inspect
20 20 import os
21 21 import re
22 22 import runpy
23 23 import sys
24 24 import tempfile
25 25 import traceback
26 26 import types
27 27 import subprocess
28 28 import warnings
29 29 from io import open as io_open
30 30
31 31 from pickleshare import PickleShareDB
32 32
33 33 from traitlets.config.configurable import SingletonConfigurable
34 34 from traitlets.utils.importstring import import_item
35 35 from IPython.core import oinspect
36 36 from IPython.core import magic
37 37 from IPython.core import page
38 38 from IPython.core import prefilter
39 39 from IPython.core import ultratb
40 40 from IPython.core.alias import Alias, AliasManager
41 41 from IPython.core.autocall import ExitAutocall
42 42 from IPython.core.builtin_trap import BuiltinTrap
43 43 from IPython.core.events import EventManager, available_events
44 44 from IPython.core.compilerop import CachingCompiler, check_linecache_ipython
45 45 from IPython.core.debugger import Pdb
46 46 from IPython.core.display_trap import DisplayTrap
47 47 from IPython.core.displayhook import DisplayHook
48 48 from IPython.core.displaypub import DisplayPublisher
49 49 from IPython.core.error import InputRejected, UsageError
50 50 from IPython.core.extensions import ExtensionManager
51 51 from IPython.core.formatters import DisplayFormatter
52 52 from IPython.core.history import HistoryManager
53 53 from IPython.core.inputtransformer2 import ESC_MAGIC, ESC_MAGIC2
54 54 from IPython.core.logger import Logger
55 55 from IPython.core.macro import Macro
56 56 from IPython.core.payload import PayloadManager
57 57 from IPython.core.prefilter import PrefilterManager
58 58 from IPython.core.profiledir import ProfileDir
59 59 from IPython.core.usage import default_banner
60 60 from IPython.display import display
61 61 from IPython.testing.skipdoctest import skip_doctest
62 62 from IPython.utils import PyColorize
63 63 from IPython.utils import io
64 64 from IPython.utils import py3compat
65 65 from IPython.utils import openpy
66 66 from IPython.utils.decorators import undoc
67 67 from IPython.utils.io import ask_yes_no
68 68 from IPython.utils.ipstruct import Struct
69 69 from IPython.paths import get_ipython_dir
70 70 from IPython.utils.path import get_home_dir, get_py_filename, ensure_dir_exists
71 71 from IPython.utils.process import system, getoutput
72 72 from IPython.utils.strdispatch import StrDispatch
73 73 from IPython.utils.syspathcontext import prepended_to_syspath
74 74 from IPython.utils.text import format_screen, LSString, SList, DollarFormatter
75 75 from IPython.utils.tempdir import TemporaryDirectory
76 76 from traitlets import (
77 77 Integer, Bool, CaselessStrEnum, Enum, List, Dict, Unicode, Instance, Type,
78 78 observe, default, validate, Any
79 79 )
80 80 from warnings import warn
81 81 from logging import error
82 82 import IPython.core.hooks
83 83
84 84 from typing import List as ListType, Tuple, Optional
85 85 from ast import AST
86 86
87 87 # NoOpContext is deprecated, but ipykernel imports it from here.
88 88 # See https://github.com/ipython/ipykernel/issues/157
89 89 # (2016, let's try to remove than in IPython 8.0)
90 90 from IPython.utils.contexts import NoOpContext
91 91
92 92 try:
93 93 import docrepr.sphinxify as sphx
94 94
95 95 def sphinxify(doc):
96 96 with TemporaryDirectory() as dirname:
97 97 return {
98 98 'text/html': sphx.sphinxify(doc, dirname),
99 99 'text/plain': doc
100 100 }
101 101 except ImportError:
102 102 sphinxify = None
103 103
104 104
105 105 class ProvisionalWarning(DeprecationWarning):
106 106 """
107 107 Warning class for unstable features
108 108 """
109 109 pass
110 110
111 111 if sys.version_info > (3,8):
112 112 from ast import Module
113 113 else :
114 114 # mock the new API, ignore second argument
115 115 # see https://github.com/ipython/ipython/issues/11590
116 116 from ast import Module as OriginalModule
117 117 Module = lambda nodelist, type_ignores: OriginalModule(nodelist)
118 118
119 119 if sys.version_info > (3,6):
120 120 _assign_nodes = (ast.AugAssign, ast.AnnAssign, ast.Assign)
121 121 _single_targets_nodes = (ast.AugAssign, ast.AnnAssign)
122 122 else:
123 123 _assign_nodes = (ast.AugAssign, ast.Assign )
124 124 _single_targets_nodes = (ast.AugAssign, )
125 125
126 126 #-----------------------------------------------------------------------------
127 127 # Await Helpers
128 128 #-----------------------------------------------------------------------------
129 129
130 130 def removed_co_newlocals(function:types.FunctionType) -> types.FunctionType:
131 131 """Return a function that do not create a new local scope.
132 132
133 133 Given a function, create a clone of this function where the co_newlocal flag
134 134 has been removed, making this function code actually run in the sourounding
135 135 scope.
136 136
137 137 We need this in order to run asynchronous code in user level namespace.
138 138 """
139 139 from types import CodeType, FunctionType
140 140 CO_NEWLOCALS = 0x0002
141 141 code = function.__code__
142 142 new_co_flags = code.co_flags & ~CO_NEWLOCALS
143 143 if sys.version_info > (3, 8, 0, 'alpha', 3):
144 144 new_code = code.replace(co_flags=new_co_flags)
145 145 else:
146 146 new_code = CodeType(
147 147 code.co_argcount,
148 148 code.co_kwonlyargcount,
149 149 code.co_nlocals,
150 150 code.co_stacksize,
151 151 new_co_flags,
152 152 code.co_code,
153 153 code.co_consts,
154 154 code.co_names,
155 155 code.co_varnames,
156 156 code.co_filename,
157 157 code.co_name,
158 158 code.co_firstlineno,
159 159 code.co_lnotab,
160 160 code.co_freevars,
161 161 code.co_cellvars
162 162 )
163 163 return FunctionType(new_code, globals(), function.__name__, function.__defaults__)
164 164
165 165
166 166 # we still need to run things using the asyncio eventloop, but there is no
167 167 # async integration
168 168 from .async_helpers import (_asyncio_runner, _asyncify, _pseudo_sync_runner)
169 169 from .async_helpers import _curio_runner, _trio_runner, _should_be_async
170 170
171 171
172 172 def _ast_asyncify(cell:str, wrapper_name:str) -> ast.Module:
173 173 """
174 174 Parse a cell with top-level await and modify the AST to be able to run it later.
175 175
176 176 Parameter
177 177 ---------
178 178
179 179 cell: str
180 180 The code cell to asyncronify
181 181 wrapper_name: str
182 182 The name of the function to be used to wrap the passed `cell`. It is
183 183 advised to **not** use a python identifier in order to not pollute the
184 184 global namespace in which the function will be ran.
185 185
186 186 Return
187 187 ------
188 188
189 189 A module object AST containing **one** function named `wrapper_name`.
190 190
191 191 The given code is wrapped in a async-def function, parsed into an AST, and
192 192 the resulting function definition AST is modified to return the last
193 193 expression.
194 194
195 195 The last expression or await node is moved into a return statement at the
196 196 end of the function, and removed from its original location. If the last
197 197 node is not Expr or Await nothing is done.
198 198
199 199 The function `__code__` will need to be later modified (by
200 200 ``removed_co_newlocals``) in a subsequent step to not create new `locals()`
201 201 meaning that the local and global scope are the same, ie as if the body of
202 202 the function was at module level.
203 203
204 204 Lastly a call to `locals()` is made just before the last expression of the
205 205 function, or just after the last assignment or statement to make sure the
206 206 global dict is updated as python function work with a local fast cache which
207 207 is updated only on `local()` calls.
208 208 """
209 209
210 210 from ast import Expr, Await, Return
211 211 if sys.version_info >= (3,8):
212 212 return ast.parse(cell)
213 213 tree = ast.parse(_asyncify(cell))
214 214
215 215 function_def = tree.body[0]
216 216 function_def.name = wrapper_name
217 217 try_block = function_def.body[0]
218 218 lastexpr = try_block.body[-1]
219 219 if isinstance(lastexpr, (Expr, Await)):
220 220 try_block.body[-1] = Return(lastexpr.value)
221 221 ast.fix_missing_locations(tree)
222 222 return tree
223 223 #-----------------------------------------------------------------------------
224 224 # Globals
225 225 #-----------------------------------------------------------------------------
226 226
227 227 # compiled regexps for autoindent management
228 228 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
229 229
230 230 #-----------------------------------------------------------------------------
231 231 # Utilities
232 232 #-----------------------------------------------------------------------------
233 233
234 234 @undoc
235 235 def softspace(file, newvalue):
236 236 """Copied from code.py, to remove the dependency"""
237 237
238 238 oldvalue = 0
239 239 try:
240 240 oldvalue = file.softspace
241 241 except AttributeError:
242 242 pass
243 243 try:
244 244 file.softspace = newvalue
245 245 except (AttributeError, TypeError):
246 246 # "attribute-less object" or "read-only attributes"
247 247 pass
248 248 return oldvalue
249 249
250 250 @undoc
251 251 def no_op(*a, **kw):
252 252 pass
253 253
254 254
255 255 class SpaceInInput(Exception): pass
256 256
257 257
258 258 def get_default_colors():
259 259 "DEPRECATED"
260 260 warn('get_default_color is deprecated since IPython 5.0, and returns `Neutral` on all platforms.',
261 261 DeprecationWarning, stacklevel=2)
262 262 return 'Neutral'
263 263
264 264
265 265 class SeparateUnicode(Unicode):
266 266 r"""A Unicode subclass to validate separate_in, separate_out, etc.
267 267
268 268 This is a Unicode based trait that converts '0'->'' and ``'\\n'->'\n'``.
269 269 """
270 270
271 271 def validate(self, obj, value):
272 272 if value == '0': value = ''
273 273 value = value.replace('\\n','\n')
274 274 return super(SeparateUnicode, self).validate(obj, value)
275 275
276 276
277 277 @undoc
278 278 class DummyMod(object):
279 279 """A dummy module used for IPython's interactive module when
280 280 a namespace must be assigned to the module's __dict__."""
281 281 __spec__ = None
282 282
283 283
284 284 class ExecutionInfo(object):
285 285 """The arguments used for a call to :meth:`InteractiveShell.run_cell`
286 286
287 287 Stores information about what is going to happen.
288 288 """
289 289 raw_cell = None
290 290 store_history = False
291 291 silent = False
292 292 shell_futures = True
293 293
294 294 def __init__(self, raw_cell, store_history, silent, shell_futures):
295 295 self.raw_cell = raw_cell
296 296 self.store_history = store_history
297 297 self.silent = silent
298 298 self.shell_futures = shell_futures
299 299
300 300 def __repr__(self):
301 301 name = self.__class__.__qualname__
302 302 raw_cell = ((self.raw_cell[:50] + '..')
303 303 if len(self.raw_cell) > 50 else self.raw_cell)
304 304 return '<%s object at %x, raw_cell="%s" store_history=%s silent=%s shell_futures=%s>' %\
305 305 (name, id(self), raw_cell, self.store_history, self.silent, self.shell_futures)
306 306
307 307
308 308 class ExecutionResult(object):
309 309 """The result of a call to :meth:`InteractiveShell.run_cell`
310 310
311 311 Stores information about what took place.
312 312 """
313 313 execution_count = None
314 314 error_before_exec = None
315 315 error_in_exec = None
316 316 info = None
317 317 result = None
318 318
319 319 def __init__(self, info):
320 320 self.info = info
321 321
322 322 @property
323 323 def success(self):
324 324 return (self.error_before_exec is None) and (self.error_in_exec is None)
325 325
326 326 def raise_error(self):
327 327 """Reraises error if `success` is `False`, otherwise does nothing"""
328 328 if self.error_before_exec is not None:
329 329 raise self.error_before_exec
330 330 if self.error_in_exec is not None:
331 331 raise self.error_in_exec
332 332
333 333 def __repr__(self):
334 334 name = self.__class__.__qualname__
335 335 return '<%s object at %x, execution_count=%s error_before_exec=%s error_in_exec=%s info=%s result=%s>' %\
336 336 (name, id(self), self.execution_count, self.error_before_exec, self.error_in_exec, repr(self.info), repr(self.result))
337 337
338 338
339 339 class InteractiveShell(SingletonConfigurable):
340 340 """An enhanced, interactive shell for Python."""
341 341
342 342 _instance = None
343 343
344 344 ast_transformers = List([], help=
345 345 """
346 346 A list of ast.NodeTransformer subclass instances, which will be applied
347 347 to user input before code is run.
348 348 """
349 349 ).tag(config=True)
350 350
351 351 autocall = Enum((0,1,2), default_value=0, help=
352 352 """
353 353 Make IPython automatically call any callable object even if you didn't
354 354 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
355 355 automatically. The value can be '0' to disable the feature, '1' for
356 356 'smart' autocall, where it is not applied if there are no more
357 357 arguments on the line, and '2' for 'full' autocall, where all callable
358 358 objects are automatically called (even if no arguments are present).
359 359 """
360 360 ).tag(config=True)
361 361
362 362 autoindent = Bool(True, help=
363 363 """
364 364 Autoindent IPython code entered interactively.
365 365 """
366 366 ).tag(config=True)
367 367
368 368 autoawait = Bool(True, help=
369 369 """
370 370 Automatically run await statement in the top level repl.
371 371 """
372 372 ).tag(config=True)
373 373
374 374 loop_runner_map ={
375 375 'asyncio':(_asyncio_runner, True),
376 376 'curio':(_curio_runner, True),
377 377 'trio':(_trio_runner, True),
378 378 'sync': (_pseudo_sync_runner, False)
379 379 }
380 380
381 381 loop_runner = Any(default_value="IPython.core.interactiveshell._asyncio_runner",
382 382 allow_none=True,
383 383 help="""Select the loop runner that will be used to execute top-level asynchronous code"""
384 384 ).tag(config=True)
385 385
386 386 @default('loop_runner')
387 387 def _default_loop_runner(self):
388 388 return import_item("IPython.core.interactiveshell._asyncio_runner")
389 389
390 390 @validate('loop_runner')
391 391 def _import_runner(self, proposal):
392 392 if isinstance(proposal.value, str):
393 393 if proposal.value in self.loop_runner_map:
394 394 runner, autoawait = self.loop_runner_map[proposal.value]
395 395 self.autoawait = autoawait
396 396 return runner
397 397 runner = import_item(proposal.value)
398 398 if not callable(runner):
399 399 raise ValueError('loop_runner must be callable')
400 400 return runner
401 401 if not callable(proposal.value):
402 402 raise ValueError('loop_runner must be callable')
403 403 return proposal.value
404 404
405 405 automagic = Bool(True, help=
406 406 """
407 407 Enable magic commands to be called without the leading %.
408 408 """
409 409 ).tag(config=True)
410 410
411 411 banner1 = Unicode(default_banner,
412 412 help="""The part of the banner to be printed before the profile"""
413 413 ).tag(config=True)
414 414 banner2 = Unicode('',
415 415 help="""The part of the banner to be printed after the profile"""
416 416 ).tag(config=True)
417 417
418 418 cache_size = Integer(1000, help=
419 419 """
420 420 Set the size of the output cache. The default is 1000, you can
421 421 change it permanently in your config file. Setting it to 0 completely
422 422 disables the caching system, and the minimum value accepted is 3 (if
423 423 you provide a value less than 3, it is reset to 0 and a warning is
424 424 issued). This limit is defined because otherwise you'll spend more
425 425 time re-flushing a too small cache than working
426 426 """
427 427 ).tag(config=True)
428 428 color_info = Bool(True, help=
429 429 """
430 430 Use colors for displaying information about objects. Because this
431 431 information is passed through a pager (like 'less'), and some pagers
432 432 get confused with color codes, this capability can be turned off.
433 433 """
434 434 ).tag(config=True)
435 435 colors = CaselessStrEnum(('Neutral', 'NoColor','LightBG','Linux'),
436 436 default_value='Neutral',
437 437 help="Set the color scheme (NoColor, Neutral, Linux, or LightBG)."
438 438 ).tag(config=True)
439 439 debug = Bool(False).tag(config=True)
440 440 disable_failing_post_execute = Bool(False,
441 441 help="Don't call post-execute functions that have failed in the past."
442 442 ).tag(config=True)
443 443 display_formatter = Instance(DisplayFormatter, allow_none=True)
444 444 displayhook_class = Type(DisplayHook)
445 445 display_pub_class = Type(DisplayPublisher)
446 446
447 447 sphinxify_docstring = Bool(False, help=
448 448 """
449 449 Enables rich html representation of docstrings. (This requires the
450 450 docrepr module).
451 451 """).tag(config=True)
452 452
453 453 @observe("sphinxify_docstring")
454 454 def _sphinxify_docstring_changed(self, change):
455 455 if change['new']:
456 456 warn("`sphinxify_docstring` is provisional since IPython 5.0 and might change in future versions." , ProvisionalWarning)
457 457
458 458 enable_html_pager = Bool(False, help=
459 459 """
460 460 (Provisional API) enables html representation in mime bundles sent
461 461 to pagers.
462 462 """).tag(config=True)
463 463
464 464 @observe("enable_html_pager")
465 465 def _enable_html_pager_changed(self, change):
466 466 if change['new']:
467 467 warn("`enable_html_pager` is provisional since IPython 5.0 and might change in future versions.", ProvisionalWarning)
468 468
469 469 data_pub_class = None
470 470
471 471 exit_now = Bool(False)
472 472 exiter = Instance(ExitAutocall)
473 473 @default('exiter')
474 474 def _exiter_default(self):
475 475 return ExitAutocall(self)
476 476 # Monotonically increasing execution counter
477 477 execution_count = Integer(1)
478 478 filename = Unicode("<ipython console>")
479 479 ipython_dir= Unicode('').tag(config=True) # Set to get_ipython_dir() in __init__
480 480
481 481 # Used to transform cells before running them, and check whether code is complete
482 482 input_transformer_manager = Instance('IPython.core.inputtransformer2.TransformerManager',
483 483 ())
484 484
485 485 @property
486 486 def input_transformers_cleanup(self):
487 487 return self.input_transformer_manager.cleanup_transforms
488 488
489 489 input_transformers_post = List([],
490 490 help="A list of string input transformers, to be applied after IPython's "
491 491 "own input transformations."
492 492 )
493 493
494 494 @property
495 495 def input_splitter(self):
496 496 """Make this available for backward compatibility (pre-7.0 release) with existing code.
497 497
498 498 For example, ipykernel ipykernel currently uses
499 499 `shell.input_splitter.check_complete`
500 500 """
501 501 from warnings import warn
502 502 warn("`input_splitter` is deprecated since IPython 7.0, prefer `input_transformer_manager`.",
503 503 DeprecationWarning, stacklevel=2
504 504 )
505 505 return self.input_transformer_manager
506 506
507 507 logstart = Bool(False, help=
508 508 """
509 509 Start logging to the default log file in overwrite mode.
510 510 Use `logappend` to specify a log file to **append** logs to.
511 511 """
512 512 ).tag(config=True)
513 513 logfile = Unicode('', help=
514 514 """
515 515 The name of the logfile to use.
516 516 """
517 517 ).tag(config=True)
518 518 logappend = Unicode('', help=
519 519 """
520 520 Start logging to the given file in append mode.
521 521 Use `logfile` to specify a log file to **overwrite** logs to.
522 522 """
523 523 ).tag(config=True)
524 524 object_info_string_level = Enum((0,1,2), default_value=0,
525 525 ).tag(config=True)
526 526 pdb = Bool(False, help=
527 527 """
528 528 Automatically call the pdb debugger after every exception.
529 529 """
530 530 ).tag(config=True)
531 531 display_page = Bool(False,
532 532 help="""If True, anything that would be passed to the pager
533 533 will be displayed as regular output instead."""
534 534 ).tag(config=True)
535 535
536 536 # deprecated prompt traits:
537 537
538 538 prompt_in1 = Unicode('In [\\#]: ',
539 539 help="Deprecated since IPython 4.0 and ignored since 5.0, set TerminalInteractiveShell.prompts object directly."
540 540 ).tag(config=True)
541 541 prompt_in2 = Unicode(' .\\D.: ',
542 542 help="Deprecated since IPython 4.0 and ignored since 5.0, set TerminalInteractiveShell.prompts object directly."
543 543 ).tag(config=True)
544 544 prompt_out = Unicode('Out[\\#]: ',
545 545 help="Deprecated since IPython 4.0 and ignored since 5.0, set TerminalInteractiveShell.prompts object directly."
546 546 ).tag(config=True)
547 547 prompts_pad_left = Bool(True,
548 548 help="Deprecated since IPython 4.0 and ignored since 5.0, set TerminalInteractiveShell.prompts object directly."
549 549 ).tag(config=True)
550 550
551 551 @observe('prompt_in1', 'prompt_in2', 'prompt_out', 'prompt_pad_left')
552 552 def _prompt_trait_changed(self, change):
553 553 name = change['name']
554 554 warn("InteractiveShell.{name} is deprecated since IPython 4.0"
555 555 " and ignored since 5.0, set TerminalInteractiveShell.prompts"
556 556 " object directly.".format(name=name))
557 557
558 558 # protect against weird cases where self.config may not exist:
559 559
560 560 show_rewritten_input = Bool(True,
561 561 help="Show rewritten input, e.g. for autocall."
562 562 ).tag(config=True)
563 563
564 564 quiet = Bool(False).tag(config=True)
565 565
566 566 history_length = Integer(10000,
567 567 help='Total length of command history'
568 568 ).tag(config=True)
569 569
570 570 history_load_length = Integer(1000, help=
571 571 """
572 572 The number of saved history entries to be loaded
573 573 into the history buffer at startup.
574 574 """
575 575 ).tag(config=True)
576 576
577 577 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none', 'last_expr_or_assign'],
578 578 default_value='last_expr',
579 579 help="""
580 580 'all', 'last', 'last_expr' or 'none', 'last_expr_or_assign' specifying
581 581 which nodes should be run interactively (displaying output from expressions).
582 582 """
583 583 ).tag(config=True)
584 584
585 585 # TODO: this part of prompt management should be moved to the frontends.
586 586 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
587 587 separate_in = SeparateUnicode('\n').tag(config=True)
588 588 separate_out = SeparateUnicode('').tag(config=True)
589 589 separate_out2 = SeparateUnicode('').tag(config=True)
590 590 wildcards_case_sensitive = Bool(True).tag(config=True)
591 591 xmode = CaselessStrEnum(('Context', 'Plain', 'Verbose', 'Minimal'),
592 592 default_value='Context',
593 593 help="Switch modes for the IPython exception handlers."
594 594 ).tag(config=True)
595 595
596 596 # Subcomponents of InteractiveShell
597 597 alias_manager = Instance('IPython.core.alias.AliasManager', allow_none=True)
598 598 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager', allow_none=True)
599 599 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap', allow_none=True)
600 600 display_trap = Instance('IPython.core.display_trap.DisplayTrap', allow_none=True)
601 601 extension_manager = Instance('IPython.core.extensions.ExtensionManager', allow_none=True)
602 602 payload_manager = Instance('IPython.core.payload.PayloadManager', allow_none=True)
603 603 history_manager = Instance('IPython.core.history.HistoryAccessorBase', allow_none=True)
604 604 magics_manager = Instance('IPython.core.magic.MagicsManager', allow_none=True)
605 605
606 606 profile_dir = Instance('IPython.core.application.ProfileDir', allow_none=True)
607 607 @property
608 608 def profile(self):
609 609 if self.profile_dir is not None:
610 610 name = os.path.basename(self.profile_dir.location)
611 611 return name.replace('profile_','')
612 612
613 613
614 614 # Private interface
615 615 _post_execute = Dict()
616 616
617 617 # Tracks any GUI loop loaded for pylab
618 618 pylab_gui_select = None
619 619
620 620 last_execution_succeeded = Bool(True, help='Did last executed command succeeded')
621 621
622 622 last_execution_result = Instance('IPython.core.interactiveshell.ExecutionResult', help='Result of executing the last command', allow_none=True)
623 623
624 624 def __init__(self, ipython_dir=None, profile_dir=None,
625 625 user_module=None, user_ns=None,
626 626 custom_exceptions=((), None), **kwargs):
627 627
628 628 # This is where traits with a config_key argument are updated
629 629 # from the values on config.
630 630 super(InteractiveShell, self).__init__(**kwargs)
631 631 if 'PromptManager' in self.config:
632 632 warn('As of IPython 5.0 `PromptManager` config will have no effect'
633 633 ' and has been replaced by TerminalInteractiveShell.prompts_class')
634 634 self.configurables = [self]
635 635
636 636 # These are relatively independent and stateless
637 637 self.init_ipython_dir(ipython_dir)
638 638 self.init_profile_dir(profile_dir)
639 639 self.init_instance_attrs()
640 640 self.init_environment()
641 641
642 642 # Check if we're in a virtualenv, and set up sys.path.
643 643 self.init_virtualenv()
644 644
645 645 # Create namespaces (user_ns, user_global_ns, etc.)
646 646 self.init_create_namespaces(user_module, user_ns)
647 647 # This has to be done after init_create_namespaces because it uses
648 648 # something in self.user_ns, but before init_sys_modules, which
649 649 # is the first thing to modify sys.
650 650 # TODO: When we override sys.stdout and sys.stderr before this class
651 651 # is created, we are saving the overridden ones here. Not sure if this
652 652 # is what we want to do.
653 653 self.save_sys_module_state()
654 654 self.init_sys_modules()
655 655
656 656 # While we're trying to have each part of the code directly access what
657 657 # it needs without keeping redundant references to objects, we have too
658 658 # much legacy code that expects ip.db to exist.
659 659 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
660 660
661 661 self.init_history()
662 662 self.init_encoding()
663 663 self.init_prefilter()
664 664
665 665 self.init_syntax_highlighting()
666 666 self.init_hooks()
667 667 self.init_events()
668 668 self.init_pushd_popd_magic()
669 669 self.init_user_ns()
670 670 self.init_logger()
671 671 self.init_builtins()
672 672
673 673 # The following was in post_config_initialization
674 674 self.init_inspector()
675 675 self.raw_input_original = input
676 676 self.init_completer()
677 677 # TODO: init_io() needs to happen before init_traceback handlers
678 678 # because the traceback handlers hardcode the stdout/stderr streams.
679 679 # This logic in in debugger.Pdb and should eventually be changed.
680 680 self.init_io()
681 681 self.init_traceback_handlers(custom_exceptions)
682 682 self.init_prompts()
683 683 self.init_display_formatter()
684 684 self.init_display_pub()
685 685 self.init_data_pub()
686 686 self.init_displayhook()
687 687 self.init_magics()
688 688 self.init_alias()
689 689 self.init_logstart()
690 690 self.init_pdb()
691 691 self.init_extension_manager()
692 692 self.init_payload()
693 693 self.init_deprecation_warnings()
694 694 self.hooks.late_startup_hook()
695 695 self.events.trigger('shell_initialized', self)
696 696 atexit.register(self.atexit_operations)
697 697
698 698 # The trio runner is used for running Trio in the foreground thread. It
699 699 # is different from `_trio_runner(async_fn)` in `async_helpers.py`
700 700 # which calls `trio.run()` for every cell. This runner runs all cells
701 701 # inside a single Trio event loop. If used, it is set from
702 702 # `ipykernel.kernelapp`.
703 703 self.trio_runner = None
704 704
705 705 def get_ipython(self):
706 706 """Return the currently running IPython instance."""
707 707 return self
708 708
709 709 #-------------------------------------------------------------------------
710 710 # Trait changed handlers
711 711 #-------------------------------------------------------------------------
712 712 @observe('ipython_dir')
713 713 def _ipython_dir_changed(self, change):
714 714 ensure_dir_exists(change['new'])
715 715
716 716 def set_autoindent(self,value=None):
717 717 """Set the autoindent flag.
718 718
719 719 If called with no arguments, it acts as a toggle."""
720 720 if value is None:
721 721 self.autoindent = not self.autoindent
722 722 else:
723 723 self.autoindent = value
724 724
725 725 def set_trio_runner(self, tr):
726 726 self.trio_runner = tr
727 727
728 728 #-------------------------------------------------------------------------
729 729 # init_* methods called by __init__
730 730 #-------------------------------------------------------------------------
731 731
732 732 def init_ipython_dir(self, ipython_dir):
733 733 if ipython_dir is not None:
734 734 self.ipython_dir = ipython_dir
735 735 return
736 736
737 737 self.ipython_dir = get_ipython_dir()
738 738
739 739 def init_profile_dir(self, profile_dir):
740 740 if profile_dir is not None:
741 741 self.profile_dir = profile_dir
742 742 return
743 self.profile_dir =\
744 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
743 self.profile_dir = ProfileDir.create_profile_dir_by_name(
744 self.ipython_dir, "default"
745 )
745 746
746 747 def init_instance_attrs(self):
747 748 self.more = False
748 749
749 750 # command compiler
750 751 self.compile = CachingCompiler()
751 752
752 753 # Make an empty namespace, which extension writers can rely on both
753 754 # existing and NEVER being used by ipython itself. This gives them a
754 755 # convenient location for storing additional information and state
755 756 # their extensions may require, without fear of collisions with other
756 757 # ipython names that may develop later.
757 758 self.meta = Struct()
758 759
759 760 # Temporary files used for various purposes. Deleted at exit.
760 761 self.tempfiles = []
761 762 self.tempdirs = []
762 763
763 764 # keep track of where we started running (mainly for crash post-mortem)
764 765 # This is not being used anywhere currently.
765 766 self.starting_dir = os.getcwd()
766 767
767 768 # Indentation management
768 769 self.indent_current_nsp = 0
769 770
770 771 # Dict to track post-execution functions that have been registered
771 772 self._post_execute = {}
772 773
773 774 def init_environment(self):
774 775 """Any changes we need to make to the user's environment."""
775 776 pass
776 777
777 778 def init_encoding(self):
778 779 # Get system encoding at startup time. Certain terminals (like Emacs
779 780 # under Win32 have it set to None, and we need to have a known valid
780 781 # encoding to use in the raw_input() method
781 782 try:
782 783 self.stdin_encoding = sys.stdin.encoding or 'ascii'
783 784 except AttributeError:
784 785 self.stdin_encoding = 'ascii'
785 786
786 787
787 788 @observe('colors')
788 789 def init_syntax_highlighting(self, changes=None):
789 790 # Python source parser/formatter for syntax highlighting
790 791 pyformat = PyColorize.Parser(style=self.colors, parent=self).format
791 792 self.pycolorize = lambda src: pyformat(src,'str')
792 793
793 794 def refresh_style(self):
794 795 # No-op here, used in subclass
795 796 pass
796 797
797 798 def init_pushd_popd_magic(self):
798 799 # for pushd/popd management
799 800 self.home_dir = get_home_dir()
800 801
801 802 self.dir_stack = []
802 803
803 804 def init_logger(self):
804 805 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
805 806 logmode='rotate')
806 807
807 808 def init_logstart(self):
808 809 """Initialize logging in case it was requested at the command line.
809 810 """
810 811 if self.logappend:
811 812 self.magic('logstart %s append' % self.logappend)
812 813 elif self.logfile:
813 814 self.magic('logstart %s' % self.logfile)
814 815 elif self.logstart:
815 816 self.magic('logstart')
816 817
817 818 def init_deprecation_warnings(self):
818 819 """
819 820 register default filter for deprecation warning.
820 821
821 822 This will allow deprecation warning of function used interactively to show
822 823 warning to users, and still hide deprecation warning from libraries import.
823 824 """
824 825 if sys.version_info < (3,7):
825 826 warnings.filterwarnings("default", category=DeprecationWarning, module=self.user_ns.get("__name__"))
826 827
827 828
828 829 def init_builtins(self):
829 830 # A single, static flag that we set to True. Its presence indicates
830 831 # that an IPython shell has been created, and we make no attempts at
831 832 # removing on exit or representing the existence of more than one
832 833 # IPython at a time.
833 834 builtin_mod.__dict__['__IPYTHON__'] = True
834 835 builtin_mod.__dict__['display'] = display
835 836
836 837 self.builtin_trap = BuiltinTrap(shell=self)
837 838
838 839 @observe('colors')
839 840 def init_inspector(self, changes=None):
840 841 # Object inspector
841 842 self.inspector = oinspect.Inspector(oinspect.InspectColors,
842 843 PyColorize.ANSICodeColors,
843 844 self.colors,
844 845 self.object_info_string_level)
845 846
846 847 def init_io(self):
847 848 # This will just use sys.stdout and sys.stderr. If you want to
848 849 # override sys.stdout and sys.stderr themselves, you need to do that
849 850 # *before* instantiating this class, because io holds onto
850 851 # references to the underlying streams.
851 852 # io.std* are deprecated, but don't show our own deprecation warnings
852 853 # during initialization of the deprecated API.
853 854 with warnings.catch_warnings():
854 855 warnings.simplefilter('ignore', DeprecationWarning)
855 856 io.stdout = io.IOStream(sys.stdout)
856 857 io.stderr = io.IOStream(sys.stderr)
857 858
858 859 def init_prompts(self):
859 860 # Set system prompts, so that scripts can decide if they are running
860 861 # interactively.
861 862 sys.ps1 = 'In : '
862 863 sys.ps2 = '...: '
863 864 sys.ps3 = 'Out: '
864 865
865 866 def init_display_formatter(self):
866 867 self.display_formatter = DisplayFormatter(parent=self)
867 868 self.configurables.append(self.display_formatter)
868 869
869 870 def init_display_pub(self):
870 871 self.display_pub = self.display_pub_class(parent=self, shell=self)
871 872 self.configurables.append(self.display_pub)
872 873
873 874 def init_data_pub(self):
874 875 if not self.data_pub_class:
875 876 self.data_pub = None
876 877 return
877 878 self.data_pub = self.data_pub_class(parent=self)
878 879 self.configurables.append(self.data_pub)
879 880
880 881 def init_displayhook(self):
881 882 # Initialize displayhook, set in/out prompts and printing system
882 883 self.displayhook = self.displayhook_class(
883 884 parent=self,
884 885 shell=self,
885 886 cache_size=self.cache_size,
886 887 )
887 888 self.configurables.append(self.displayhook)
888 889 # This is a context manager that installs/revmoes the displayhook at
889 890 # the appropriate time.
890 891 self.display_trap = DisplayTrap(hook=self.displayhook)
891 892
892 893 def init_virtualenv(self):
893 894 """Add a virtualenv to sys.path so the user can import modules from it.
894 895 This isn't perfect: it doesn't use the Python interpreter with which the
895 896 virtualenv was built, and it ignores the --no-site-packages option. A
896 897 warning will appear suggesting the user installs IPython in the
897 898 virtualenv, but for many cases, it probably works well enough.
898 899
899 900 Adapted from code snippets online.
900 901
901 902 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
902 903 """
903 904 if 'VIRTUAL_ENV' not in os.environ:
904 905 # Not in a virtualenv
905 906 return
906 907
907 908 p = os.path.normcase(sys.executable)
908 909 p_venv = os.path.normcase(os.environ['VIRTUAL_ENV'])
909 910
910 911 # executable path should end like /bin/python or \\scripts\\python.exe
911 912 p_exe_up2 = os.path.dirname(os.path.dirname(p))
912 913 if p_exe_up2 and os.path.exists(p_venv) and os.path.samefile(p_exe_up2, p_venv):
913 914 # Our exe is inside the virtualenv, don't need to do anything.
914 915 return
915 916
916 917 # fallback venv detection:
917 918 # stdlib venv may symlink sys.executable, so we can't use realpath.
918 919 # but others can symlink *to* the venv Python, so we can't just use sys.executable.
919 920 # So we just check every item in the symlink tree (generally <= 3)
920 921 paths = [p]
921 922 while os.path.islink(p):
922 923 p = os.path.normcase(os.path.join(os.path.dirname(p), os.readlink(p)))
923 924 paths.append(p)
924 925
925 926 # In Cygwin paths like "c:\..." and '\cygdrive\c\...' are possible
926 927 if p_venv.startswith('\\cygdrive'):
927 928 p_venv = p_venv[11:]
928 929 elif len(p_venv) >= 2 and p_venv[1] == ':':
929 930 p_venv = p_venv[2:]
930 931
931 932 if any(p_venv in p for p in paths):
932 933 # Running properly in the virtualenv, don't need to do anything
933 934 return
934 935
935 936 warn("Attempting to work in a virtualenv. If you encounter problems, please "
936 937 "install IPython inside the virtualenv.")
937 938 if sys.platform == "win32":
938 939 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
939 940 else:
940 941 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
941 942 'python%d.%d' % sys.version_info[:2], 'site-packages')
942 943
943 944 import site
944 945 sys.path.insert(0, virtual_env)
945 946 site.addsitedir(virtual_env)
946 947
947 948 #-------------------------------------------------------------------------
948 949 # Things related to injections into the sys module
949 950 #-------------------------------------------------------------------------
950 951
951 952 def save_sys_module_state(self):
952 953 """Save the state of hooks in the sys module.
953 954
954 955 This has to be called after self.user_module is created.
955 956 """
956 957 self._orig_sys_module_state = {'stdin': sys.stdin,
957 958 'stdout': sys.stdout,
958 959 'stderr': sys.stderr,
959 960 'excepthook': sys.excepthook}
960 961 self._orig_sys_modules_main_name = self.user_module.__name__
961 962 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
962 963
963 964 def restore_sys_module_state(self):
964 965 """Restore the state of the sys module."""
965 966 try:
966 967 for k, v in self._orig_sys_module_state.items():
967 968 setattr(sys, k, v)
968 969 except AttributeError:
969 970 pass
970 971 # Reset what what done in self.init_sys_modules
971 972 if self._orig_sys_modules_main_mod is not None:
972 973 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
973 974
974 975 #-------------------------------------------------------------------------
975 976 # Things related to the banner
976 977 #-------------------------------------------------------------------------
977 978
978 979 @property
979 980 def banner(self):
980 981 banner = self.banner1
981 982 if self.profile and self.profile != 'default':
982 983 banner += '\nIPython profile: %s\n' % self.profile
983 984 if self.banner2:
984 985 banner += '\n' + self.banner2
985 986 return banner
986 987
987 988 def show_banner(self, banner=None):
988 989 if banner is None:
989 990 banner = self.banner
990 991 sys.stdout.write(banner)
991 992
992 993 #-------------------------------------------------------------------------
993 994 # Things related to hooks
994 995 #-------------------------------------------------------------------------
995 996
996 997 def init_hooks(self):
997 998 # hooks holds pointers used for user-side customizations
998 999 self.hooks = Struct()
999 1000
1000 1001 self.strdispatchers = {}
1001 1002
1002 1003 # Set all default hooks, defined in the IPython.hooks module.
1003 1004 hooks = IPython.core.hooks
1004 1005 for hook_name in hooks.__all__:
1005 1006 # default hooks have priority 100, i.e. low; user hooks should have
1006 1007 # 0-100 priority
1007 1008 self.set_hook(hook_name,getattr(hooks,hook_name), 100, _warn_deprecated=False)
1008 1009
1009 1010 if self.display_page:
1010 1011 self.set_hook('show_in_pager', page.as_hook(page.display_page), 90)
1011 1012
1012 1013 def set_hook(self,name,hook, priority=50, str_key=None, re_key=None,
1013 1014 _warn_deprecated=True):
1014 1015 """set_hook(name,hook) -> sets an internal IPython hook.
1015 1016
1016 1017 IPython exposes some of its internal API as user-modifiable hooks. By
1017 1018 adding your function to one of these hooks, you can modify IPython's
1018 1019 behavior to call at runtime your own routines."""
1019 1020
1020 1021 # At some point in the future, this should validate the hook before it
1021 1022 # accepts it. Probably at least check that the hook takes the number
1022 1023 # of args it's supposed to.
1023 1024
1024 1025 f = types.MethodType(hook,self)
1025 1026
1026 1027 # check if the hook is for strdispatcher first
1027 1028 if str_key is not None:
1028 1029 sdp = self.strdispatchers.get(name, StrDispatch())
1029 1030 sdp.add_s(str_key, f, priority )
1030 1031 self.strdispatchers[name] = sdp
1031 1032 return
1032 1033 if re_key is not None:
1033 1034 sdp = self.strdispatchers.get(name, StrDispatch())
1034 1035 sdp.add_re(re.compile(re_key), f, priority )
1035 1036 self.strdispatchers[name] = sdp
1036 1037 return
1037 1038
1038 1039 dp = getattr(self.hooks, name, None)
1039 1040 if name not in IPython.core.hooks.__all__:
1040 1041 print("Warning! Hook '%s' is not one of %s" % \
1041 1042 (name, IPython.core.hooks.__all__ ))
1042 1043
1043 1044 if _warn_deprecated and (name in IPython.core.hooks.deprecated):
1044 1045 alternative = IPython.core.hooks.deprecated[name]
1045 1046 warn("Hook {} is deprecated. Use {} instead.".format(name, alternative), stacklevel=2)
1046 1047
1047 1048 if not dp:
1048 1049 dp = IPython.core.hooks.CommandChainDispatcher()
1049 1050
1050 1051 try:
1051 1052 dp.add(f,priority)
1052 1053 except AttributeError:
1053 1054 # it was not commandchain, plain old func - replace
1054 1055 dp = f
1055 1056
1056 1057 setattr(self.hooks,name, dp)
1057 1058
1058 1059 #-------------------------------------------------------------------------
1059 1060 # Things related to events
1060 1061 #-------------------------------------------------------------------------
1061 1062
1062 1063 def init_events(self):
1063 1064 self.events = EventManager(self, available_events)
1064 1065
1065 1066 self.events.register("pre_execute", self._clear_warning_registry)
1066 1067
1067 1068 def register_post_execute(self, func):
1068 1069 """DEPRECATED: Use ip.events.register('post_run_cell', func)
1069 1070
1070 1071 Register a function for calling after code execution.
1071 1072 """
1072 1073 warn("ip.register_post_execute is deprecated, use "
1073 1074 "ip.events.register('post_run_cell', func) instead.", stacklevel=2)
1074 1075 self.events.register('post_run_cell', func)
1075 1076
1076 1077 def _clear_warning_registry(self):
1077 1078 # clear the warning registry, so that different code blocks with
1078 1079 # overlapping line number ranges don't cause spurious suppression of
1079 1080 # warnings (see gh-6611 for details)
1080 1081 if "__warningregistry__" in self.user_global_ns:
1081 1082 del self.user_global_ns["__warningregistry__"]
1082 1083
1083 1084 #-------------------------------------------------------------------------
1084 1085 # Things related to the "main" module
1085 1086 #-------------------------------------------------------------------------
1086 1087
1087 1088 def new_main_mod(self, filename, modname):
1088 1089 """Return a new 'main' module object for user code execution.
1089 1090
1090 1091 ``filename`` should be the path of the script which will be run in the
1091 1092 module. Requests with the same filename will get the same module, with
1092 1093 its namespace cleared.
1093 1094
1094 1095 ``modname`` should be the module name - normally either '__main__' or
1095 1096 the basename of the file without the extension.
1096 1097
1097 1098 When scripts are executed via %run, we must keep a reference to their
1098 1099 __main__ module around so that Python doesn't
1099 1100 clear it, rendering references to module globals useless.
1100 1101
1101 1102 This method keeps said reference in a private dict, keyed by the
1102 1103 absolute path of the script. This way, for multiple executions of the
1103 1104 same script we only keep one copy of the namespace (the last one),
1104 1105 thus preventing memory leaks from old references while allowing the
1105 1106 objects from the last execution to be accessible.
1106 1107 """
1107 1108 filename = os.path.abspath(filename)
1108 1109 try:
1109 1110 main_mod = self._main_mod_cache[filename]
1110 1111 except KeyError:
1111 1112 main_mod = self._main_mod_cache[filename] = types.ModuleType(
1112 1113 modname,
1113 1114 doc="Module created for script run in IPython")
1114 1115 else:
1115 1116 main_mod.__dict__.clear()
1116 1117 main_mod.__name__ = modname
1117 1118
1118 1119 main_mod.__file__ = filename
1119 1120 # It seems pydoc (and perhaps others) needs any module instance to
1120 1121 # implement a __nonzero__ method
1121 1122 main_mod.__nonzero__ = lambda : True
1122 1123
1123 1124 return main_mod
1124 1125
1125 1126 def clear_main_mod_cache(self):
1126 1127 """Clear the cache of main modules.
1127 1128
1128 1129 Mainly for use by utilities like %reset.
1129 1130
1130 1131 Examples
1131 1132 --------
1132 1133
1133 1134 In [15]: import IPython
1134 1135
1135 1136 In [16]: m = _ip.new_main_mod(IPython.__file__, 'IPython')
1136 1137
1137 1138 In [17]: len(_ip._main_mod_cache) > 0
1138 1139 Out[17]: True
1139 1140
1140 1141 In [18]: _ip.clear_main_mod_cache()
1141 1142
1142 1143 In [19]: len(_ip._main_mod_cache) == 0
1143 1144 Out[19]: True
1144 1145 """
1145 1146 self._main_mod_cache.clear()
1146 1147
1147 1148 #-------------------------------------------------------------------------
1148 1149 # Things related to debugging
1149 1150 #-------------------------------------------------------------------------
1150 1151
1151 1152 def init_pdb(self):
1152 1153 # Set calling of pdb on exceptions
1153 1154 # self.call_pdb is a property
1154 1155 self.call_pdb = self.pdb
1155 1156
1156 1157 def _get_call_pdb(self):
1157 1158 return self._call_pdb
1158 1159
1159 1160 def _set_call_pdb(self,val):
1160 1161
1161 1162 if val not in (0,1,False,True):
1162 1163 raise ValueError('new call_pdb value must be boolean')
1163 1164
1164 1165 # store value in instance
1165 1166 self._call_pdb = val
1166 1167
1167 1168 # notify the actual exception handlers
1168 1169 self.InteractiveTB.call_pdb = val
1169 1170
1170 1171 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
1171 1172 'Control auto-activation of pdb at exceptions')
1172 1173
1173 1174 def debugger(self,force=False):
1174 1175 """Call the pdb debugger.
1175 1176
1176 1177 Keywords:
1177 1178
1178 1179 - force(False): by default, this routine checks the instance call_pdb
1179 1180 flag and does not actually invoke the debugger if the flag is false.
1180 1181 The 'force' option forces the debugger to activate even if the flag
1181 1182 is false.
1182 1183 """
1183 1184
1184 1185 if not (force or self.call_pdb):
1185 1186 return
1186 1187
1187 1188 if not hasattr(sys,'last_traceback'):
1188 1189 error('No traceback has been produced, nothing to debug.')
1189 1190 return
1190 1191
1191 1192 self.InteractiveTB.debugger(force=True)
1192 1193
1193 1194 #-------------------------------------------------------------------------
1194 1195 # Things related to IPython's various namespaces
1195 1196 #-------------------------------------------------------------------------
1196 1197 default_user_namespaces = True
1197 1198
1198 1199 def init_create_namespaces(self, user_module=None, user_ns=None):
1199 1200 # Create the namespace where the user will operate. user_ns is
1200 1201 # normally the only one used, and it is passed to the exec calls as
1201 1202 # the locals argument. But we do carry a user_global_ns namespace
1202 1203 # given as the exec 'globals' argument, This is useful in embedding
1203 1204 # situations where the ipython shell opens in a context where the
1204 1205 # distinction between locals and globals is meaningful. For
1205 1206 # non-embedded contexts, it is just the same object as the user_ns dict.
1206 1207
1207 1208 # FIXME. For some strange reason, __builtins__ is showing up at user
1208 1209 # level as a dict instead of a module. This is a manual fix, but I
1209 1210 # should really track down where the problem is coming from. Alex
1210 1211 # Schmolck reported this problem first.
1211 1212
1212 1213 # A useful post by Alex Martelli on this topic:
1213 1214 # Re: inconsistent value from __builtins__
1214 1215 # Von: Alex Martelli <aleaxit@yahoo.com>
1215 1216 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
1216 1217 # Gruppen: comp.lang.python
1217 1218
1218 1219 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
1219 1220 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
1220 1221 # > <type 'dict'>
1221 1222 # > >>> print type(__builtins__)
1222 1223 # > <type 'module'>
1223 1224 # > Is this difference in return value intentional?
1224 1225
1225 1226 # Well, it's documented that '__builtins__' can be either a dictionary
1226 1227 # or a module, and it's been that way for a long time. Whether it's
1227 1228 # intentional (or sensible), I don't know. In any case, the idea is
1228 1229 # that if you need to access the built-in namespace directly, you
1229 1230 # should start with "import __builtin__" (note, no 's') which will
1230 1231 # definitely give you a module. Yeah, it's somewhat confusing:-(.
1231 1232
1232 1233 # These routines return a properly built module and dict as needed by
1233 1234 # the rest of the code, and can also be used by extension writers to
1234 1235 # generate properly initialized namespaces.
1235 1236 if (user_ns is not None) or (user_module is not None):
1236 1237 self.default_user_namespaces = False
1237 1238 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
1238 1239
1239 1240 # A record of hidden variables we have added to the user namespace, so
1240 1241 # we can list later only variables defined in actual interactive use.
1241 1242 self.user_ns_hidden = {}
1242 1243
1243 1244 # Now that FakeModule produces a real module, we've run into a nasty
1244 1245 # problem: after script execution (via %run), the module where the user
1245 1246 # code ran is deleted. Now that this object is a true module (needed
1246 1247 # so doctest and other tools work correctly), the Python module
1247 1248 # teardown mechanism runs over it, and sets to None every variable
1248 1249 # present in that module. Top-level references to objects from the
1249 1250 # script survive, because the user_ns is updated with them. However,
1250 1251 # calling functions defined in the script that use other things from
1251 1252 # the script will fail, because the function's closure had references
1252 1253 # to the original objects, which are now all None. So we must protect
1253 1254 # these modules from deletion by keeping a cache.
1254 1255 #
1255 1256 # To avoid keeping stale modules around (we only need the one from the
1256 1257 # last run), we use a dict keyed with the full path to the script, so
1257 1258 # only the last version of the module is held in the cache. Note,
1258 1259 # however, that we must cache the module *namespace contents* (their
1259 1260 # __dict__). Because if we try to cache the actual modules, old ones
1260 1261 # (uncached) could be destroyed while still holding references (such as
1261 1262 # those held by GUI objects that tend to be long-lived)>
1262 1263 #
1263 1264 # The %reset command will flush this cache. See the cache_main_mod()
1264 1265 # and clear_main_mod_cache() methods for details on use.
1265 1266
1266 1267 # This is the cache used for 'main' namespaces
1267 1268 self._main_mod_cache = {}
1268 1269
1269 1270 # A table holding all the namespaces IPython deals with, so that
1270 1271 # introspection facilities can search easily.
1271 1272 self.ns_table = {'user_global':self.user_module.__dict__,
1272 1273 'user_local':self.user_ns,
1273 1274 'builtin':builtin_mod.__dict__
1274 1275 }
1275 1276
1276 1277 @property
1277 1278 def user_global_ns(self):
1278 1279 return self.user_module.__dict__
1279 1280
1280 1281 def prepare_user_module(self, user_module=None, user_ns=None):
1281 1282 """Prepare the module and namespace in which user code will be run.
1282 1283
1283 1284 When IPython is started normally, both parameters are None: a new module
1284 1285 is created automatically, and its __dict__ used as the namespace.
1285 1286
1286 1287 If only user_module is provided, its __dict__ is used as the namespace.
1287 1288 If only user_ns is provided, a dummy module is created, and user_ns
1288 1289 becomes the global namespace. If both are provided (as they may be
1289 1290 when embedding), user_ns is the local namespace, and user_module
1290 1291 provides the global namespace.
1291 1292
1292 1293 Parameters
1293 1294 ----------
1294 1295 user_module : module, optional
1295 1296 The current user module in which IPython is being run. If None,
1296 1297 a clean module will be created.
1297 1298 user_ns : dict, optional
1298 1299 A namespace in which to run interactive commands.
1299 1300
1300 1301 Returns
1301 1302 -------
1302 1303 A tuple of user_module and user_ns, each properly initialised.
1303 1304 """
1304 1305 if user_module is None and user_ns is not None:
1305 1306 user_ns.setdefault("__name__", "__main__")
1306 1307 user_module = DummyMod()
1307 1308 user_module.__dict__ = user_ns
1308 1309
1309 1310 if user_module is None:
1310 1311 user_module = types.ModuleType("__main__",
1311 1312 doc="Automatically created module for IPython interactive environment")
1312 1313
1313 1314 # We must ensure that __builtin__ (without the final 's') is always
1314 1315 # available and pointing to the __builtin__ *module*. For more details:
1315 1316 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1316 1317 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1317 1318 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1318 1319
1319 1320 if user_ns is None:
1320 1321 user_ns = user_module.__dict__
1321 1322
1322 1323 return user_module, user_ns
1323 1324
1324 1325 def init_sys_modules(self):
1325 1326 # We need to insert into sys.modules something that looks like a
1326 1327 # module but which accesses the IPython namespace, for shelve and
1327 1328 # pickle to work interactively. Normally they rely on getting
1328 1329 # everything out of __main__, but for embedding purposes each IPython
1329 1330 # instance has its own private namespace, so we can't go shoving
1330 1331 # everything into __main__.
1331 1332
1332 1333 # note, however, that we should only do this for non-embedded
1333 1334 # ipythons, which really mimic the __main__.__dict__ with their own
1334 1335 # namespace. Embedded instances, on the other hand, should not do
1335 1336 # this because they need to manage the user local/global namespaces
1336 1337 # only, but they live within a 'normal' __main__ (meaning, they
1337 1338 # shouldn't overtake the execution environment of the script they're
1338 1339 # embedded in).
1339 1340
1340 1341 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1341 1342 main_name = self.user_module.__name__
1342 1343 sys.modules[main_name] = self.user_module
1343 1344
1344 1345 def init_user_ns(self):
1345 1346 """Initialize all user-visible namespaces to their minimum defaults.
1346 1347
1347 1348 Certain history lists are also initialized here, as they effectively
1348 1349 act as user namespaces.
1349 1350
1350 1351 Notes
1351 1352 -----
1352 1353 All data structures here are only filled in, they are NOT reset by this
1353 1354 method. If they were not empty before, data will simply be added to
1354 1355 them.
1355 1356 """
1356 1357 # This function works in two parts: first we put a few things in
1357 1358 # user_ns, and we sync that contents into user_ns_hidden so that these
1358 1359 # initial variables aren't shown by %who. After the sync, we add the
1359 1360 # rest of what we *do* want the user to see with %who even on a new
1360 1361 # session (probably nothing, so they really only see their own stuff)
1361 1362
1362 1363 # The user dict must *always* have a __builtin__ reference to the
1363 1364 # Python standard __builtin__ namespace, which must be imported.
1364 1365 # This is so that certain operations in prompt evaluation can be
1365 1366 # reliably executed with builtins. Note that we can NOT use
1366 1367 # __builtins__ (note the 's'), because that can either be a dict or a
1367 1368 # module, and can even mutate at runtime, depending on the context
1368 1369 # (Python makes no guarantees on it). In contrast, __builtin__ is
1369 1370 # always a module object, though it must be explicitly imported.
1370 1371
1371 1372 # For more details:
1372 1373 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1373 1374 ns = {}
1374 1375
1375 1376 # make global variables for user access to the histories
1376 1377 ns['_ih'] = self.history_manager.input_hist_parsed
1377 1378 ns['_oh'] = self.history_manager.output_hist
1378 1379 ns['_dh'] = self.history_manager.dir_hist
1379 1380
1380 1381 # user aliases to input and output histories. These shouldn't show up
1381 1382 # in %who, as they can have very large reprs.
1382 1383 ns['In'] = self.history_manager.input_hist_parsed
1383 1384 ns['Out'] = self.history_manager.output_hist
1384 1385
1385 1386 # Store myself as the public api!!!
1386 1387 ns['get_ipython'] = self.get_ipython
1387 1388
1388 1389 ns['exit'] = self.exiter
1389 1390 ns['quit'] = self.exiter
1390 1391
1391 1392 # Sync what we've added so far to user_ns_hidden so these aren't seen
1392 1393 # by %who
1393 1394 self.user_ns_hidden.update(ns)
1394 1395
1395 1396 # Anything put into ns now would show up in %who. Think twice before
1396 1397 # putting anything here, as we really want %who to show the user their
1397 1398 # stuff, not our variables.
1398 1399
1399 1400 # Finally, update the real user's namespace
1400 1401 self.user_ns.update(ns)
1401 1402
1402 1403 @property
1403 1404 def all_ns_refs(self):
1404 1405 """Get a list of references to all the namespace dictionaries in which
1405 1406 IPython might store a user-created object.
1406 1407
1407 1408 Note that this does not include the displayhook, which also caches
1408 1409 objects from the output."""
1409 1410 return [self.user_ns, self.user_global_ns, self.user_ns_hidden] + \
1410 1411 [m.__dict__ for m in self._main_mod_cache.values()]
1411 1412
1412 1413 def reset(self, new_session=True):
1413 1414 """Clear all internal namespaces, and attempt to release references to
1414 1415 user objects.
1415 1416
1416 1417 If new_session is True, a new history session will be opened.
1417 1418 """
1418 1419 # Clear histories
1419 1420 self.history_manager.reset(new_session)
1420 1421 # Reset counter used to index all histories
1421 1422 if new_session:
1422 1423 self.execution_count = 1
1423 1424
1424 1425 # Reset last execution result
1425 1426 self.last_execution_succeeded = True
1426 1427 self.last_execution_result = None
1427 1428
1428 1429 # Flush cached output items
1429 1430 if self.displayhook.do_full_cache:
1430 1431 self.displayhook.flush()
1431 1432
1432 1433 # The main execution namespaces must be cleared very carefully,
1433 1434 # skipping the deletion of the builtin-related keys, because doing so
1434 1435 # would cause errors in many object's __del__ methods.
1435 1436 if self.user_ns is not self.user_global_ns:
1436 1437 self.user_ns.clear()
1437 1438 ns = self.user_global_ns
1438 1439 drop_keys = set(ns.keys())
1439 1440 drop_keys.discard('__builtin__')
1440 1441 drop_keys.discard('__builtins__')
1441 1442 drop_keys.discard('__name__')
1442 1443 for k in drop_keys:
1443 1444 del ns[k]
1444 1445
1445 1446 self.user_ns_hidden.clear()
1446 1447
1447 1448 # Restore the user namespaces to minimal usability
1448 1449 self.init_user_ns()
1449 1450
1450 1451 # Restore the default and user aliases
1451 1452 self.alias_manager.clear_aliases()
1452 1453 self.alias_manager.init_aliases()
1453 1454
1454 1455 # Now define aliases that only make sense on the terminal, because they
1455 1456 # need direct access to the console in a way that we can't emulate in
1456 1457 # GUI or web frontend
1457 1458 if os.name == 'posix':
1458 1459 for cmd in ('clear', 'more', 'less', 'man'):
1459 1460 if cmd not in self.magics_manager.magics['line']:
1460 1461 self.alias_manager.soft_define_alias(cmd, cmd)
1461 1462
1462 1463 # Flush the private list of module references kept for script
1463 1464 # execution protection
1464 1465 self.clear_main_mod_cache()
1465 1466
1466 1467 def del_var(self, varname, by_name=False):
1467 1468 """Delete a variable from the various namespaces, so that, as
1468 1469 far as possible, we're not keeping any hidden references to it.
1469 1470
1470 1471 Parameters
1471 1472 ----------
1472 1473 varname : str
1473 1474 The name of the variable to delete.
1474 1475 by_name : bool
1475 1476 If True, delete variables with the given name in each
1476 1477 namespace. If False (default), find the variable in the user
1477 1478 namespace, and delete references to it.
1478 1479 """
1479 1480 if varname in ('__builtin__', '__builtins__'):
1480 1481 raise ValueError("Refusing to delete %s" % varname)
1481 1482
1482 1483 ns_refs = self.all_ns_refs
1483 1484
1484 1485 if by_name: # Delete by name
1485 1486 for ns in ns_refs:
1486 1487 try:
1487 1488 del ns[varname]
1488 1489 except KeyError:
1489 1490 pass
1490 1491 else: # Delete by object
1491 1492 try:
1492 1493 obj = self.user_ns[varname]
1493 1494 except KeyError:
1494 1495 raise NameError("name '%s' is not defined" % varname)
1495 1496 # Also check in output history
1496 1497 ns_refs.append(self.history_manager.output_hist)
1497 1498 for ns in ns_refs:
1498 1499 to_delete = [n for n, o in ns.items() if o is obj]
1499 1500 for name in to_delete:
1500 1501 del ns[name]
1501 1502
1502 1503 # Ensure it is removed from the last execution result
1503 1504 if self.last_execution_result.result is obj:
1504 1505 self.last_execution_result = None
1505 1506
1506 1507 # displayhook keeps extra references, but not in a dictionary
1507 1508 for name in ('_', '__', '___'):
1508 1509 if getattr(self.displayhook, name) is obj:
1509 1510 setattr(self.displayhook, name, None)
1510 1511
1511 1512 def reset_selective(self, regex=None):
1512 1513 """Clear selective variables from internal namespaces based on a
1513 1514 specified regular expression.
1514 1515
1515 1516 Parameters
1516 1517 ----------
1517 1518 regex : string or compiled pattern, optional
1518 1519 A regular expression pattern that will be used in searching
1519 1520 variable names in the users namespaces.
1520 1521 """
1521 1522 if regex is not None:
1522 1523 try:
1523 1524 m = re.compile(regex)
1524 1525 except TypeError:
1525 1526 raise TypeError('regex must be a string or compiled pattern')
1526 1527 # Search for keys in each namespace that match the given regex
1527 1528 # If a match is found, delete the key/value pair.
1528 1529 for ns in self.all_ns_refs:
1529 1530 for var in ns:
1530 1531 if m.search(var):
1531 1532 del ns[var]
1532 1533
1533 1534 def push(self, variables, interactive=True):
1534 1535 """Inject a group of variables into the IPython user namespace.
1535 1536
1536 1537 Parameters
1537 1538 ----------
1538 1539 variables : dict, str or list/tuple of str
1539 1540 The variables to inject into the user's namespace. If a dict, a
1540 1541 simple update is done. If a str, the string is assumed to have
1541 1542 variable names separated by spaces. A list/tuple of str can also
1542 1543 be used to give the variable names. If just the variable names are
1543 1544 give (list/tuple/str) then the variable values looked up in the
1544 1545 callers frame.
1545 1546 interactive : bool
1546 1547 If True (default), the variables will be listed with the ``who``
1547 1548 magic.
1548 1549 """
1549 1550 vdict = None
1550 1551
1551 1552 # We need a dict of name/value pairs to do namespace updates.
1552 1553 if isinstance(variables, dict):
1553 1554 vdict = variables
1554 1555 elif isinstance(variables, (str, list, tuple)):
1555 1556 if isinstance(variables, str):
1556 1557 vlist = variables.split()
1557 1558 else:
1558 1559 vlist = variables
1559 1560 vdict = {}
1560 1561 cf = sys._getframe(1)
1561 1562 for name in vlist:
1562 1563 try:
1563 1564 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1564 1565 except:
1565 1566 print('Could not get variable %s from %s' %
1566 1567 (name,cf.f_code.co_name))
1567 1568 else:
1568 1569 raise ValueError('variables must be a dict/str/list/tuple')
1569 1570
1570 1571 # Propagate variables to user namespace
1571 1572 self.user_ns.update(vdict)
1572 1573
1573 1574 # And configure interactive visibility
1574 1575 user_ns_hidden = self.user_ns_hidden
1575 1576 if interactive:
1576 1577 for name in vdict:
1577 1578 user_ns_hidden.pop(name, None)
1578 1579 else:
1579 1580 user_ns_hidden.update(vdict)
1580 1581
1581 1582 def drop_by_id(self, variables):
1582 1583 """Remove a dict of variables from the user namespace, if they are the
1583 1584 same as the values in the dictionary.
1584 1585
1585 1586 This is intended for use by extensions: variables that they've added can
1586 1587 be taken back out if they are unloaded, without removing any that the
1587 1588 user has overwritten.
1588 1589
1589 1590 Parameters
1590 1591 ----------
1591 1592 variables : dict
1592 1593 A dictionary mapping object names (as strings) to the objects.
1593 1594 """
1594 1595 for name, obj in variables.items():
1595 1596 if name in self.user_ns and self.user_ns[name] is obj:
1596 1597 del self.user_ns[name]
1597 1598 self.user_ns_hidden.pop(name, None)
1598 1599
1599 1600 #-------------------------------------------------------------------------
1600 1601 # Things related to object introspection
1601 1602 #-------------------------------------------------------------------------
1602 1603
1603 1604 def _ofind(self, oname, namespaces=None):
1604 1605 """Find an object in the available namespaces.
1605 1606
1606 1607 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1607 1608
1608 1609 Has special code to detect magic functions.
1609 1610 """
1610 1611 oname = oname.strip()
1611 1612 if not oname.startswith(ESC_MAGIC) and \
1612 1613 not oname.startswith(ESC_MAGIC2) and \
1613 1614 not all(a.isidentifier() for a in oname.split(".")):
1614 1615 return {'found': False}
1615 1616
1616 1617 if namespaces is None:
1617 1618 # Namespaces to search in:
1618 1619 # Put them in a list. The order is important so that we
1619 1620 # find things in the same order that Python finds them.
1620 1621 namespaces = [ ('Interactive', self.user_ns),
1621 1622 ('Interactive (global)', self.user_global_ns),
1622 1623 ('Python builtin', builtin_mod.__dict__),
1623 1624 ]
1624 1625
1625 1626 ismagic = False
1626 1627 isalias = False
1627 1628 found = False
1628 1629 ospace = None
1629 1630 parent = None
1630 1631 obj = None
1631 1632
1632 1633
1633 1634 # Look for the given name by splitting it in parts. If the head is
1634 1635 # found, then we look for all the remaining parts as members, and only
1635 1636 # declare success if we can find them all.
1636 1637 oname_parts = oname.split('.')
1637 1638 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1638 1639 for nsname,ns in namespaces:
1639 1640 try:
1640 1641 obj = ns[oname_head]
1641 1642 except KeyError:
1642 1643 continue
1643 1644 else:
1644 1645 for idx, part in enumerate(oname_rest):
1645 1646 try:
1646 1647 parent = obj
1647 1648 # The last part is looked up in a special way to avoid
1648 1649 # descriptor invocation as it may raise or have side
1649 1650 # effects.
1650 1651 if idx == len(oname_rest) - 1:
1651 1652 obj = self._getattr_property(obj, part)
1652 1653 else:
1653 1654 obj = getattr(obj, part)
1654 1655 except:
1655 1656 # Blanket except b/c some badly implemented objects
1656 1657 # allow __getattr__ to raise exceptions other than
1657 1658 # AttributeError, which then crashes IPython.
1658 1659 break
1659 1660 else:
1660 1661 # If we finish the for loop (no break), we got all members
1661 1662 found = True
1662 1663 ospace = nsname
1663 1664 break # namespace loop
1664 1665
1665 1666 # Try to see if it's magic
1666 1667 if not found:
1667 1668 obj = None
1668 1669 if oname.startswith(ESC_MAGIC2):
1669 1670 oname = oname.lstrip(ESC_MAGIC2)
1670 1671 obj = self.find_cell_magic(oname)
1671 1672 elif oname.startswith(ESC_MAGIC):
1672 1673 oname = oname.lstrip(ESC_MAGIC)
1673 1674 obj = self.find_line_magic(oname)
1674 1675 else:
1675 1676 # search without prefix, so run? will find %run?
1676 1677 obj = self.find_line_magic(oname)
1677 1678 if obj is None:
1678 1679 obj = self.find_cell_magic(oname)
1679 1680 if obj is not None:
1680 1681 found = True
1681 1682 ospace = 'IPython internal'
1682 1683 ismagic = True
1683 1684 isalias = isinstance(obj, Alias)
1684 1685
1685 1686 # Last try: special-case some literals like '', [], {}, etc:
1686 1687 if not found and oname_head in ["''",'""','[]','{}','()']:
1687 1688 obj = eval(oname_head)
1688 1689 found = True
1689 1690 ospace = 'Interactive'
1690 1691
1691 1692 return {
1692 1693 'obj':obj,
1693 1694 'found':found,
1694 1695 'parent':parent,
1695 1696 'ismagic':ismagic,
1696 1697 'isalias':isalias,
1697 1698 'namespace':ospace
1698 1699 }
1699 1700
1700 1701 @staticmethod
1701 1702 def _getattr_property(obj, attrname):
1702 1703 """Property-aware getattr to use in object finding.
1703 1704
1704 1705 If attrname represents a property, return it unevaluated (in case it has
1705 1706 side effects or raises an error.
1706 1707
1707 1708 """
1708 1709 if not isinstance(obj, type):
1709 1710 try:
1710 1711 # `getattr(type(obj), attrname)` is not guaranteed to return
1711 1712 # `obj`, but does so for property:
1712 1713 #
1713 1714 # property.__get__(self, None, cls) -> self
1714 1715 #
1715 1716 # The universal alternative is to traverse the mro manually
1716 1717 # searching for attrname in class dicts.
1717 1718 attr = getattr(type(obj), attrname)
1718 1719 except AttributeError:
1719 1720 pass
1720 1721 else:
1721 1722 # This relies on the fact that data descriptors (with both
1722 1723 # __get__ & __set__ magic methods) take precedence over
1723 1724 # instance-level attributes:
1724 1725 #
1725 1726 # class A(object):
1726 1727 # @property
1727 1728 # def foobar(self): return 123
1728 1729 # a = A()
1729 1730 # a.__dict__['foobar'] = 345
1730 1731 # a.foobar # == 123
1731 1732 #
1732 1733 # So, a property may be returned right away.
1733 1734 if isinstance(attr, property):
1734 1735 return attr
1735 1736
1736 1737 # Nothing helped, fall back.
1737 1738 return getattr(obj, attrname)
1738 1739
1739 1740 def _object_find(self, oname, namespaces=None):
1740 1741 """Find an object and return a struct with info about it."""
1741 1742 return Struct(self._ofind(oname, namespaces))
1742 1743
1743 1744 def _inspect(self, meth, oname, namespaces=None, **kw):
1744 1745 """Generic interface to the inspector system.
1745 1746
1746 1747 This function is meant to be called by pdef, pdoc & friends.
1747 1748 """
1748 1749 info = self._object_find(oname, namespaces)
1749 1750 docformat = sphinxify if self.sphinxify_docstring else None
1750 1751 if info.found:
1751 1752 pmethod = getattr(self.inspector, meth)
1752 1753 # TODO: only apply format_screen to the plain/text repr of the mime
1753 1754 # bundle.
1754 1755 formatter = format_screen if info.ismagic else docformat
1755 1756 if meth == 'pdoc':
1756 1757 pmethod(info.obj, oname, formatter)
1757 1758 elif meth == 'pinfo':
1758 1759 pmethod(info.obj, oname, formatter, info,
1759 1760 enable_html_pager=self.enable_html_pager, **kw)
1760 1761 else:
1761 1762 pmethod(info.obj, oname)
1762 1763 else:
1763 1764 print('Object `%s` not found.' % oname)
1764 1765 return 'not found' # so callers can take other action
1765 1766
1766 1767 def object_inspect(self, oname, detail_level=0):
1767 1768 """Get object info about oname"""
1768 1769 with self.builtin_trap:
1769 1770 info = self._object_find(oname)
1770 1771 if info.found:
1771 1772 return self.inspector.info(info.obj, oname, info=info,
1772 1773 detail_level=detail_level
1773 1774 )
1774 1775 else:
1775 1776 return oinspect.object_info(name=oname, found=False)
1776 1777
1777 1778 def object_inspect_text(self, oname, detail_level=0):
1778 1779 """Get object info as formatted text"""
1779 1780 return self.object_inspect_mime(oname, detail_level)['text/plain']
1780 1781
1781 1782 def object_inspect_mime(self, oname, detail_level=0):
1782 1783 """Get object info as a mimebundle of formatted representations.
1783 1784
1784 1785 A mimebundle is a dictionary, keyed by mime-type.
1785 1786 It must always have the key `'text/plain'`.
1786 1787 """
1787 1788 with self.builtin_trap:
1788 1789 info = self._object_find(oname)
1789 1790 if info.found:
1790 1791 return self.inspector._get_info(info.obj, oname, info=info,
1791 1792 detail_level=detail_level
1792 1793 )
1793 1794 else:
1794 1795 raise KeyError(oname)
1795 1796
1796 1797 #-------------------------------------------------------------------------
1797 1798 # Things related to history management
1798 1799 #-------------------------------------------------------------------------
1799 1800
1800 1801 def init_history(self):
1801 1802 """Sets up the command history, and starts regular autosaves."""
1802 1803 self.history_manager = HistoryManager(shell=self, parent=self)
1803 1804 self.configurables.append(self.history_manager)
1804 1805
1805 1806 #-------------------------------------------------------------------------
1806 1807 # Things related to exception handling and tracebacks (not debugging)
1807 1808 #-------------------------------------------------------------------------
1808 1809
1809 1810 debugger_cls = Pdb
1810 1811
1811 1812 def init_traceback_handlers(self, custom_exceptions):
1812 1813 # Syntax error handler.
1813 1814 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor', parent=self)
1814 1815
1815 1816 # The interactive one is initialized with an offset, meaning we always
1816 1817 # want to remove the topmost item in the traceback, which is our own
1817 1818 # internal code. Valid modes: ['Plain','Context','Verbose','Minimal']
1818 1819 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1819 1820 color_scheme='NoColor',
1820 1821 tb_offset = 1,
1821 1822 check_cache=check_linecache_ipython,
1822 1823 debugger_cls=self.debugger_cls, parent=self)
1823 1824
1824 1825 # The instance will store a pointer to the system-wide exception hook,
1825 1826 # so that runtime code (such as magics) can access it. This is because
1826 1827 # during the read-eval loop, it may get temporarily overwritten.
1827 1828 self.sys_excepthook = sys.excepthook
1828 1829
1829 1830 # and add any custom exception handlers the user may have specified
1830 1831 self.set_custom_exc(*custom_exceptions)
1831 1832
1832 1833 # Set the exception mode
1833 1834 self.InteractiveTB.set_mode(mode=self.xmode)
1834 1835
1835 1836 def set_custom_exc(self, exc_tuple, handler):
1836 1837 """set_custom_exc(exc_tuple, handler)
1837 1838
1838 1839 Set a custom exception handler, which will be called if any of the
1839 1840 exceptions in exc_tuple occur in the mainloop (specifically, in the
1840 1841 run_code() method).
1841 1842
1842 1843 Parameters
1843 1844 ----------
1844 1845
1845 1846 exc_tuple : tuple of exception classes
1846 1847 A *tuple* of exception classes, for which to call the defined
1847 1848 handler. It is very important that you use a tuple, and NOT A
1848 1849 LIST here, because of the way Python's except statement works. If
1849 1850 you only want to trap a single exception, use a singleton tuple::
1850 1851
1851 1852 exc_tuple == (MyCustomException,)
1852 1853
1853 1854 handler : callable
1854 1855 handler must have the following signature::
1855 1856
1856 1857 def my_handler(self, etype, value, tb, tb_offset=None):
1857 1858 ...
1858 1859 return structured_traceback
1859 1860
1860 1861 Your handler must return a structured traceback (a list of strings),
1861 1862 or None.
1862 1863
1863 1864 This will be made into an instance method (via types.MethodType)
1864 1865 of IPython itself, and it will be called if any of the exceptions
1865 1866 listed in the exc_tuple are caught. If the handler is None, an
1866 1867 internal basic one is used, which just prints basic info.
1867 1868
1868 1869 To protect IPython from crashes, if your handler ever raises an
1869 1870 exception or returns an invalid result, it will be immediately
1870 1871 disabled.
1871 1872
1872 1873 WARNING: by putting in your own exception handler into IPython's main
1873 1874 execution loop, you run a very good chance of nasty crashes. This
1874 1875 facility should only be used if you really know what you are doing."""
1875 1876 if not isinstance(exc_tuple, tuple):
1876 1877 raise TypeError("The custom exceptions must be given as a tuple.")
1877 1878
1878 1879 def dummy_handler(self, etype, value, tb, tb_offset=None):
1879 1880 print('*** Simple custom exception handler ***')
1880 1881 print('Exception type :', etype)
1881 1882 print('Exception value:', value)
1882 1883 print('Traceback :', tb)
1883 1884
1884 1885 def validate_stb(stb):
1885 1886 """validate structured traceback return type
1886 1887
1887 1888 return type of CustomTB *should* be a list of strings, but allow
1888 1889 single strings or None, which are harmless.
1889 1890
1890 1891 This function will *always* return a list of strings,
1891 1892 and will raise a TypeError if stb is inappropriate.
1892 1893 """
1893 1894 msg = "CustomTB must return list of strings, not %r" % stb
1894 1895 if stb is None:
1895 1896 return []
1896 1897 elif isinstance(stb, str):
1897 1898 return [stb]
1898 1899 elif not isinstance(stb, list):
1899 1900 raise TypeError(msg)
1900 1901 # it's a list
1901 1902 for line in stb:
1902 1903 # check every element
1903 1904 if not isinstance(line, str):
1904 1905 raise TypeError(msg)
1905 1906 return stb
1906 1907
1907 1908 if handler is None:
1908 1909 wrapped = dummy_handler
1909 1910 else:
1910 1911 def wrapped(self,etype,value,tb,tb_offset=None):
1911 1912 """wrap CustomTB handler, to protect IPython from user code
1912 1913
1913 1914 This makes it harder (but not impossible) for custom exception
1914 1915 handlers to crash IPython.
1915 1916 """
1916 1917 try:
1917 1918 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1918 1919 return validate_stb(stb)
1919 1920 except:
1920 1921 # clear custom handler immediately
1921 1922 self.set_custom_exc((), None)
1922 1923 print("Custom TB Handler failed, unregistering", file=sys.stderr)
1923 1924 # show the exception in handler first
1924 1925 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1925 1926 print(self.InteractiveTB.stb2text(stb))
1926 1927 print("The original exception:")
1927 1928 stb = self.InteractiveTB.structured_traceback(
1928 1929 (etype,value,tb), tb_offset=tb_offset
1929 1930 )
1930 1931 return stb
1931 1932
1932 1933 self.CustomTB = types.MethodType(wrapped,self)
1933 1934 self.custom_exceptions = exc_tuple
1934 1935
1935 1936 def excepthook(self, etype, value, tb):
1936 1937 """One more defense for GUI apps that call sys.excepthook.
1937 1938
1938 1939 GUI frameworks like wxPython trap exceptions and call
1939 1940 sys.excepthook themselves. I guess this is a feature that
1940 1941 enables them to keep running after exceptions that would
1941 1942 otherwise kill their mainloop. This is a bother for IPython
1942 1943 which excepts to catch all of the program exceptions with a try:
1943 1944 except: statement.
1944 1945
1945 1946 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1946 1947 any app directly invokes sys.excepthook, it will look to the user like
1947 1948 IPython crashed. In order to work around this, we can disable the
1948 1949 CrashHandler and replace it with this excepthook instead, which prints a
1949 1950 regular traceback using our InteractiveTB. In this fashion, apps which
1950 1951 call sys.excepthook will generate a regular-looking exception from
1951 1952 IPython, and the CrashHandler will only be triggered by real IPython
1952 1953 crashes.
1953 1954
1954 1955 This hook should be used sparingly, only in places which are not likely
1955 1956 to be true IPython errors.
1956 1957 """
1957 1958 self.showtraceback((etype, value, tb), tb_offset=0)
1958 1959
1959 1960 def _get_exc_info(self, exc_tuple=None):
1960 1961 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
1961 1962
1962 1963 Ensures sys.last_type,value,traceback hold the exc_info we found,
1963 1964 from whichever source.
1964 1965
1965 1966 raises ValueError if none of these contain any information
1966 1967 """
1967 1968 if exc_tuple is None:
1968 1969 etype, value, tb = sys.exc_info()
1969 1970 else:
1970 1971 etype, value, tb = exc_tuple
1971 1972
1972 1973 if etype is None:
1973 1974 if hasattr(sys, 'last_type'):
1974 1975 etype, value, tb = sys.last_type, sys.last_value, \
1975 1976 sys.last_traceback
1976 1977
1977 1978 if etype is None:
1978 1979 raise ValueError("No exception to find")
1979 1980
1980 1981 # Now store the exception info in sys.last_type etc.
1981 1982 # WARNING: these variables are somewhat deprecated and not
1982 1983 # necessarily safe to use in a threaded environment, but tools
1983 1984 # like pdb depend on their existence, so let's set them. If we
1984 1985 # find problems in the field, we'll need to revisit their use.
1985 1986 sys.last_type = etype
1986 1987 sys.last_value = value
1987 1988 sys.last_traceback = tb
1988 1989
1989 1990 return etype, value, tb
1990 1991
1991 1992 def show_usage_error(self, exc):
1992 1993 """Show a short message for UsageErrors
1993 1994
1994 1995 These are special exceptions that shouldn't show a traceback.
1995 1996 """
1996 1997 print("UsageError: %s" % exc, file=sys.stderr)
1997 1998
1998 1999 def get_exception_only(self, exc_tuple=None):
1999 2000 """
2000 2001 Return as a string (ending with a newline) the exception that
2001 2002 just occurred, without any traceback.
2002 2003 """
2003 2004 etype, value, tb = self._get_exc_info(exc_tuple)
2004 2005 msg = traceback.format_exception_only(etype, value)
2005 2006 return ''.join(msg)
2006 2007
2007 2008 def showtraceback(self, exc_tuple=None, filename=None, tb_offset=None,
2008 2009 exception_only=False, running_compiled_code=False):
2009 2010 """Display the exception that just occurred.
2010 2011
2011 2012 If nothing is known about the exception, this is the method which
2012 2013 should be used throughout the code for presenting user tracebacks,
2013 2014 rather than directly invoking the InteractiveTB object.
2014 2015
2015 2016 A specific showsyntaxerror() also exists, but this method can take
2016 2017 care of calling it if needed, so unless you are explicitly catching a
2017 2018 SyntaxError exception, don't try to analyze the stack manually and
2018 2019 simply call this method."""
2019 2020
2020 2021 try:
2021 2022 try:
2022 2023 etype, value, tb = self._get_exc_info(exc_tuple)
2023 2024 except ValueError:
2024 2025 print('No traceback available to show.', file=sys.stderr)
2025 2026 return
2026 2027
2027 2028 if issubclass(etype, SyntaxError):
2028 2029 # Though this won't be called by syntax errors in the input
2029 2030 # line, there may be SyntaxError cases with imported code.
2030 2031 self.showsyntaxerror(filename, running_compiled_code)
2031 2032 elif etype is UsageError:
2032 2033 self.show_usage_error(value)
2033 2034 else:
2034 2035 if exception_only:
2035 2036 stb = ['An exception has occurred, use %tb to see '
2036 2037 'the full traceback.\n']
2037 2038 stb.extend(self.InteractiveTB.get_exception_only(etype,
2038 2039 value))
2039 2040 else:
2040 2041 try:
2041 2042 # Exception classes can customise their traceback - we
2042 2043 # use this in IPython.parallel for exceptions occurring
2043 2044 # in the engines. This should return a list of strings.
2044 2045 stb = value._render_traceback_()
2045 2046 except Exception:
2046 2047 stb = self.InteractiveTB.structured_traceback(etype,
2047 2048 value, tb, tb_offset=tb_offset)
2048 2049
2049 2050 self._showtraceback(etype, value, stb)
2050 2051 if self.call_pdb:
2051 2052 # drop into debugger
2052 2053 self.debugger(force=True)
2053 2054 return
2054 2055
2055 2056 # Actually show the traceback
2056 2057 self._showtraceback(etype, value, stb)
2057 2058
2058 2059 except KeyboardInterrupt:
2059 2060 print('\n' + self.get_exception_only(), file=sys.stderr)
2060 2061
2061 2062 def _showtraceback(self, etype, evalue, stb):
2062 2063 """Actually show a traceback.
2063 2064
2064 2065 Subclasses may override this method to put the traceback on a different
2065 2066 place, like a side channel.
2066 2067 """
2067 2068 print(self.InteractiveTB.stb2text(stb))
2068 2069
2069 2070 def showsyntaxerror(self, filename=None, running_compiled_code=False):
2070 2071 """Display the syntax error that just occurred.
2071 2072
2072 2073 This doesn't display a stack trace because there isn't one.
2073 2074
2074 2075 If a filename is given, it is stuffed in the exception instead
2075 2076 of what was there before (because Python's parser always uses
2076 2077 "<string>" when reading from a string).
2077 2078
2078 2079 If the syntax error occurred when running a compiled code (i.e. running_compile_code=True),
2079 2080 longer stack trace will be displayed.
2080 2081 """
2081 2082 etype, value, last_traceback = self._get_exc_info()
2082 2083
2083 2084 if filename and issubclass(etype, SyntaxError):
2084 2085 try:
2085 2086 value.filename = filename
2086 2087 except:
2087 2088 # Not the format we expect; leave it alone
2088 2089 pass
2089 2090
2090 2091 # If the error occurred when executing compiled code, we should provide full stacktrace.
2091 2092 elist = traceback.extract_tb(last_traceback) if running_compiled_code else []
2092 2093 stb = self.SyntaxTB.structured_traceback(etype, value, elist)
2093 2094 self._showtraceback(etype, value, stb)
2094 2095
2095 2096 # This is overridden in TerminalInteractiveShell to show a message about
2096 2097 # the %paste magic.
2097 2098 def showindentationerror(self):
2098 2099 """Called by _run_cell when there's an IndentationError in code entered
2099 2100 at the prompt.
2100 2101
2101 2102 This is overridden in TerminalInteractiveShell to show a message about
2102 2103 the %paste magic."""
2103 2104 self.showsyntaxerror()
2104 2105
2105 2106 #-------------------------------------------------------------------------
2106 2107 # Things related to readline
2107 2108 #-------------------------------------------------------------------------
2108 2109
2109 2110 def init_readline(self):
2110 2111 """DEPRECATED
2111 2112
2112 2113 Moved to terminal subclass, here only to simplify the init logic."""
2113 2114 # Set a number of methods that depend on readline to be no-op
2114 2115 warnings.warn('`init_readline` is no-op since IPython 5.0 and is Deprecated',
2115 2116 DeprecationWarning, stacklevel=2)
2116 2117 self.set_custom_completer = no_op
2117 2118
2118 2119 @skip_doctest
2119 2120 def set_next_input(self, s, replace=False):
2120 2121 """ Sets the 'default' input string for the next command line.
2121 2122
2122 2123 Example::
2123 2124
2124 2125 In [1]: _ip.set_next_input("Hello Word")
2125 2126 In [2]: Hello Word_ # cursor is here
2126 2127 """
2127 2128 self.rl_next_input = s
2128 2129
2129 2130 def _indent_current_str(self):
2130 2131 """return the current level of indentation as a string"""
2131 2132 return self.input_splitter.get_indent_spaces() * ' '
2132 2133
2133 2134 #-------------------------------------------------------------------------
2134 2135 # Things related to text completion
2135 2136 #-------------------------------------------------------------------------
2136 2137
2137 2138 def init_completer(self):
2138 2139 """Initialize the completion machinery.
2139 2140
2140 2141 This creates completion machinery that can be used by client code,
2141 2142 either interactively in-process (typically triggered by the readline
2142 2143 library), programmatically (such as in test suites) or out-of-process
2143 2144 (typically over the network by remote frontends).
2144 2145 """
2145 2146 from IPython.core.completer import IPCompleter
2146 2147 from IPython.core.completerlib import (module_completer,
2147 2148 magic_run_completer, cd_completer, reset_completer)
2148 2149
2149 2150 self.Completer = IPCompleter(shell=self,
2150 2151 namespace=self.user_ns,
2151 2152 global_namespace=self.user_global_ns,
2152 2153 parent=self,
2153 2154 )
2154 2155 self.configurables.append(self.Completer)
2155 2156
2156 2157 # Add custom completers to the basic ones built into IPCompleter
2157 2158 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
2158 2159 self.strdispatchers['complete_command'] = sdisp
2159 2160 self.Completer.custom_completers = sdisp
2160 2161
2161 2162 self.set_hook('complete_command', module_completer, str_key = 'import')
2162 2163 self.set_hook('complete_command', module_completer, str_key = 'from')
2163 2164 self.set_hook('complete_command', module_completer, str_key = '%aimport')
2164 2165 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
2165 2166 self.set_hook('complete_command', cd_completer, str_key = '%cd')
2166 2167 self.set_hook('complete_command', reset_completer, str_key = '%reset')
2167 2168
2168 2169 @skip_doctest
2169 2170 def complete(self, text, line=None, cursor_pos=None):
2170 2171 """Return the completed text and a list of completions.
2171 2172
2172 2173 Parameters
2173 2174 ----------
2174 2175
2175 2176 text : string
2176 2177 A string of text to be completed on. It can be given as empty and
2177 2178 instead a line/position pair are given. In this case, the
2178 2179 completer itself will split the line like readline does.
2179 2180
2180 2181 line : string, optional
2181 2182 The complete line that text is part of.
2182 2183
2183 2184 cursor_pos : int, optional
2184 2185 The position of the cursor on the input line.
2185 2186
2186 2187 Returns
2187 2188 -------
2188 2189 text : string
2189 2190 The actual text that was completed.
2190 2191
2191 2192 matches : list
2192 2193 A sorted list with all possible completions.
2193 2194
2194 2195 The optional arguments allow the completion to take more context into
2195 2196 account, and are part of the low-level completion API.
2196 2197
2197 2198 This is a wrapper around the completion mechanism, similar to what
2198 2199 readline does at the command line when the TAB key is hit. By
2199 2200 exposing it as a method, it can be used by other non-readline
2200 2201 environments (such as GUIs) for text completion.
2201 2202
2202 2203 Simple usage example:
2203 2204
2204 2205 In [1]: x = 'hello'
2205 2206
2206 2207 In [2]: _ip.complete('x.l')
2207 2208 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
2208 2209 """
2209 2210
2210 2211 # Inject names into __builtin__ so we can complete on the added names.
2211 2212 with self.builtin_trap:
2212 2213 return self.Completer.complete(text, line, cursor_pos)
2213 2214
2214 2215 def set_custom_completer(self, completer, pos=0) -> None:
2215 2216 """Adds a new custom completer function.
2216 2217
2217 2218 The position argument (defaults to 0) is the index in the completers
2218 2219 list where you want the completer to be inserted.
2219 2220
2220 2221 `completer` should have the following signature::
2221 2222
2222 2223 def completion(self: Completer, text: string) -> List[str]:
2223 2224 raise NotImplementedError
2224 2225
2225 2226 It will be bound to the current Completer instance and pass some text
2226 2227 and return a list with current completions to suggest to the user.
2227 2228 """
2228 2229
2229 2230 newcomp = types.MethodType(completer, self.Completer)
2230 2231 self.Completer.custom_matchers.insert(pos,newcomp)
2231 2232
2232 2233 def set_completer_frame(self, frame=None):
2233 2234 """Set the frame of the completer."""
2234 2235 if frame:
2235 2236 self.Completer.namespace = frame.f_locals
2236 2237 self.Completer.global_namespace = frame.f_globals
2237 2238 else:
2238 2239 self.Completer.namespace = self.user_ns
2239 2240 self.Completer.global_namespace = self.user_global_ns
2240 2241
2241 2242 #-------------------------------------------------------------------------
2242 2243 # Things related to magics
2243 2244 #-------------------------------------------------------------------------
2244 2245
2245 2246 def init_magics(self):
2246 2247 from IPython.core import magics as m
2247 2248 self.magics_manager = magic.MagicsManager(shell=self,
2248 2249 parent=self,
2249 2250 user_magics=m.UserMagics(self))
2250 2251 self.configurables.append(self.magics_manager)
2251 2252
2252 2253 # Expose as public API from the magics manager
2253 2254 self.register_magics = self.magics_manager.register
2254 2255
2255 2256 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2256 2257 m.ConfigMagics, m.DisplayMagics, m.ExecutionMagics,
2257 2258 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2258 2259 m.NamespaceMagics, m.OSMagics, m.PackagingMagics,
2259 2260 m.PylabMagics, m.ScriptMagics,
2260 2261 )
2261 2262 self.register_magics(m.AsyncMagics)
2262 2263
2263 2264 # Register Magic Aliases
2264 2265 mman = self.magics_manager
2265 2266 # FIXME: magic aliases should be defined by the Magics classes
2266 2267 # or in MagicsManager, not here
2267 2268 mman.register_alias('ed', 'edit')
2268 2269 mman.register_alias('hist', 'history')
2269 2270 mman.register_alias('rep', 'recall')
2270 2271 mman.register_alias('SVG', 'svg', 'cell')
2271 2272 mman.register_alias('HTML', 'html', 'cell')
2272 2273 mman.register_alias('file', 'writefile', 'cell')
2273 2274
2274 2275 # FIXME: Move the color initialization to the DisplayHook, which
2275 2276 # should be split into a prompt manager and displayhook. We probably
2276 2277 # even need a centralize colors management object.
2277 2278 self.run_line_magic('colors', self.colors)
2278 2279
2279 2280 # Defined here so that it's included in the documentation
2280 2281 @functools.wraps(magic.MagicsManager.register_function)
2281 2282 def register_magic_function(self, func, magic_kind='line', magic_name=None):
2282 2283 self.magics_manager.register_function(func,
2283 2284 magic_kind=magic_kind, magic_name=magic_name)
2284 2285
2285 2286 def run_line_magic(self, magic_name, line, _stack_depth=1):
2286 2287 """Execute the given line magic.
2287 2288
2288 2289 Parameters
2289 2290 ----------
2290 2291 magic_name : str
2291 2292 Name of the desired magic function, without '%' prefix.
2292 2293
2293 2294 line : str
2294 2295 The rest of the input line as a single string.
2295 2296
2296 2297 _stack_depth : int
2297 2298 If run_line_magic() is called from magic() then _stack_depth=2.
2298 2299 This is added to ensure backward compatibility for use of 'get_ipython().magic()'
2299 2300 """
2300 2301 fn = self.find_line_magic(magic_name)
2301 2302 if fn is None:
2302 2303 cm = self.find_cell_magic(magic_name)
2303 2304 etpl = "Line magic function `%%%s` not found%s."
2304 2305 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2305 2306 'did you mean that instead?)' % magic_name )
2306 2307 raise UsageError(etpl % (magic_name, extra))
2307 2308 else:
2308 2309 # Note: this is the distance in the stack to the user's frame.
2309 2310 # This will need to be updated if the internal calling logic gets
2310 2311 # refactored, or else we'll be expanding the wrong variables.
2311 2312
2312 2313 # Determine stack_depth depending on where run_line_magic() has been called
2313 2314 stack_depth = _stack_depth
2314 2315 if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False):
2315 2316 # magic has opted out of var_expand
2316 2317 magic_arg_s = line
2317 2318 else:
2318 2319 magic_arg_s = self.var_expand(line, stack_depth)
2319 2320 # Put magic args in a list so we can call with f(*a) syntax
2320 2321 args = [magic_arg_s]
2321 2322 kwargs = {}
2322 2323 # Grab local namespace if we need it:
2323 2324 if getattr(fn, "needs_local_scope", False):
2324 2325 kwargs['local_ns'] = self.get_local_scope(stack_depth)
2325 2326 with self.builtin_trap:
2326 2327 result = fn(*args, **kwargs)
2327 2328 return result
2328 2329
2329 2330 def get_local_scope(self, stack_depth):
2330 2331 """Get local scope at given stack depth.
2331 2332
2332 2333 Parameters
2333 2334 ----------
2334 2335 stack_depth : int
2335 2336 Depth relative to calling frame
2336 2337 """
2337 2338 return sys._getframe(stack_depth + 1).f_locals
2338 2339
2339 2340 def run_cell_magic(self, magic_name, line, cell):
2340 2341 """Execute the given cell magic.
2341 2342
2342 2343 Parameters
2343 2344 ----------
2344 2345 magic_name : str
2345 2346 Name of the desired magic function, without '%' prefix.
2346 2347
2347 2348 line : str
2348 2349 The rest of the first input line as a single string.
2349 2350
2350 2351 cell : str
2351 2352 The body of the cell as a (possibly multiline) string.
2352 2353 """
2353 2354 fn = self.find_cell_magic(magic_name)
2354 2355 if fn is None:
2355 2356 lm = self.find_line_magic(magic_name)
2356 2357 etpl = "Cell magic `%%{0}` not found{1}."
2357 2358 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2358 2359 'did you mean that instead?)'.format(magic_name))
2359 2360 raise UsageError(etpl.format(magic_name, extra))
2360 2361 elif cell == '':
2361 2362 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2362 2363 if self.find_line_magic(magic_name) is not None:
2363 2364 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2364 2365 raise UsageError(message)
2365 2366 else:
2366 2367 # Note: this is the distance in the stack to the user's frame.
2367 2368 # This will need to be updated if the internal calling logic gets
2368 2369 # refactored, or else we'll be expanding the wrong variables.
2369 2370 stack_depth = 2
2370 2371 if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False):
2371 2372 # magic has opted out of var_expand
2372 2373 magic_arg_s = line
2373 2374 else:
2374 2375 magic_arg_s = self.var_expand(line, stack_depth)
2375 2376 kwargs = {}
2376 2377 if getattr(fn, "needs_local_scope", False):
2377 2378 kwargs['local_ns'] = self.user_ns
2378 2379
2379 2380 with self.builtin_trap:
2380 2381 args = (magic_arg_s, cell)
2381 2382 result = fn(*args, **kwargs)
2382 2383 return result
2383 2384
2384 2385 def find_line_magic(self, magic_name):
2385 2386 """Find and return a line magic by name.
2386 2387
2387 2388 Returns None if the magic isn't found."""
2388 2389 return self.magics_manager.magics['line'].get(magic_name)
2389 2390
2390 2391 def find_cell_magic(self, magic_name):
2391 2392 """Find and return a cell magic by name.
2392 2393
2393 2394 Returns None if the magic isn't found."""
2394 2395 return self.magics_manager.magics['cell'].get(magic_name)
2395 2396
2396 2397 def find_magic(self, magic_name, magic_kind='line'):
2397 2398 """Find and return a magic of the given type by name.
2398 2399
2399 2400 Returns None if the magic isn't found."""
2400 2401 return self.magics_manager.magics[magic_kind].get(magic_name)
2401 2402
2402 2403 def magic(self, arg_s):
2403 2404 """DEPRECATED. Use run_line_magic() instead.
2404 2405
2405 2406 Call a magic function by name.
2406 2407
2407 2408 Input: a string containing the name of the magic function to call and
2408 2409 any additional arguments to be passed to the magic.
2409 2410
2410 2411 magic('name -opt foo bar') is equivalent to typing at the ipython
2411 2412 prompt:
2412 2413
2413 2414 In[1]: %name -opt foo bar
2414 2415
2415 2416 To call a magic without arguments, simply use magic('name').
2416 2417
2417 2418 This provides a proper Python function to call IPython's magics in any
2418 2419 valid Python code you can type at the interpreter, including loops and
2419 2420 compound statements.
2420 2421 """
2421 2422 # TODO: should we issue a loud deprecation warning here?
2422 2423 magic_name, _, magic_arg_s = arg_s.partition(' ')
2423 2424 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2424 2425 return self.run_line_magic(magic_name, magic_arg_s, _stack_depth=2)
2425 2426
2426 2427 #-------------------------------------------------------------------------
2427 2428 # Things related to macros
2428 2429 #-------------------------------------------------------------------------
2429 2430
2430 2431 def define_macro(self, name, themacro):
2431 2432 """Define a new macro
2432 2433
2433 2434 Parameters
2434 2435 ----------
2435 2436 name : str
2436 2437 The name of the macro.
2437 2438 themacro : str or Macro
2438 2439 The action to do upon invoking the macro. If a string, a new
2439 2440 Macro object is created by passing the string to it.
2440 2441 """
2441 2442
2442 2443 from IPython.core import macro
2443 2444
2444 2445 if isinstance(themacro, str):
2445 2446 themacro = macro.Macro(themacro)
2446 2447 if not isinstance(themacro, macro.Macro):
2447 2448 raise ValueError('A macro must be a string or a Macro instance.')
2448 2449 self.user_ns[name] = themacro
2449 2450
2450 2451 #-------------------------------------------------------------------------
2451 2452 # Things related to the running of system commands
2452 2453 #-------------------------------------------------------------------------
2453 2454
2454 2455 def system_piped(self, cmd):
2455 2456 """Call the given cmd in a subprocess, piping stdout/err
2456 2457
2457 2458 Parameters
2458 2459 ----------
2459 2460 cmd : str
2460 2461 Command to execute (can not end in '&', as background processes are
2461 2462 not supported. Should not be a command that expects input
2462 2463 other than simple text.
2463 2464 """
2464 2465 if cmd.rstrip().endswith('&'):
2465 2466 # this is *far* from a rigorous test
2466 2467 # We do not support backgrounding processes because we either use
2467 2468 # pexpect or pipes to read from. Users can always just call
2468 2469 # os.system() or use ip.system=ip.system_raw
2469 2470 # if they really want a background process.
2470 2471 raise OSError("Background processes not supported.")
2471 2472
2472 2473 # we explicitly do NOT return the subprocess status code, because
2473 2474 # a non-None value would trigger :func:`sys.displayhook` calls.
2474 2475 # Instead, we store the exit_code in user_ns.
2475 2476 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2476 2477
2477 2478 def system_raw(self, cmd):
2478 2479 """Call the given cmd in a subprocess using os.system on Windows or
2479 2480 subprocess.call using the system shell on other platforms.
2480 2481
2481 2482 Parameters
2482 2483 ----------
2483 2484 cmd : str
2484 2485 Command to execute.
2485 2486 """
2486 2487 cmd = self.var_expand(cmd, depth=1)
2487 2488 # protect os.system from UNC paths on Windows, which it can't handle:
2488 2489 if sys.platform == 'win32':
2489 2490 from IPython.utils._process_win32 import AvoidUNCPath
2490 2491 with AvoidUNCPath() as path:
2491 2492 if path is not None:
2492 2493 cmd = '"pushd %s &&"%s' % (path, cmd)
2493 2494 try:
2494 2495 ec = os.system(cmd)
2495 2496 except KeyboardInterrupt:
2496 2497 print('\n' + self.get_exception_only(), file=sys.stderr)
2497 2498 ec = -2
2498 2499 else:
2499 2500 # For posix the result of the subprocess.call() below is an exit
2500 2501 # code, which by convention is zero for success, positive for
2501 2502 # program failure. Exit codes above 128 are reserved for signals,
2502 2503 # and the formula for converting a signal to an exit code is usually
2503 2504 # signal_number+128. To more easily differentiate between exit
2504 2505 # codes and signals, ipython uses negative numbers. For instance
2505 2506 # since control-c is signal 2 but exit code 130, ipython's
2506 2507 # _exit_code variable will read -2. Note that some shells like
2507 2508 # csh and fish don't follow sh/bash conventions for exit codes.
2508 2509 executable = os.environ.get('SHELL', None)
2509 2510 try:
2510 2511 # Use env shell instead of default /bin/sh
2511 2512 ec = subprocess.call(cmd, shell=True, executable=executable)
2512 2513 except KeyboardInterrupt:
2513 2514 # intercept control-C; a long traceback is not useful here
2514 2515 print('\n' + self.get_exception_only(), file=sys.stderr)
2515 2516 ec = 130
2516 2517 if ec > 128:
2517 2518 ec = -(ec - 128)
2518 2519
2519 2520 # We explicitly do NOT return the subprocess status code, because
2520 2521 # a non-None value would trigger :func:`sys.displayhook` calls.
2521 2522 # Instead, we store the exit_code in user_ns. Note the semantics
2522 2523 # of _exit_code: for control-c, _exit_code == -signal.SIGNIT,
2523 2524 # but raising SystemExit(_exit_code) will give status 254!
2524 2525 self.user_ns['_exit_code'] = ec
2525 2526
2526 2527 # use piped system by default, because it is better behaved
2527 2528 system = system_piped
2528 2529
2529 2530 def getoutput(self, cmd, split=True, depth=0):
2530 2531 """Get output (possibly including stderr) from a subprocess.
2531 2532
2532 2533 Parameters
2533 2534 ----------
2534 2535 cmd : str
2535 2536 Command to execute (can not end in '&', as background processes are
2536 2537 not supported.
2537 2538 split : bool, optional
2538 2539 If True, split the output into an IPython SList. Otherwise, an
2539 2540 IPython LSString is returned. These are objects similar to normal
2540 2541 lists and strings, with a few convenience attributes for easier
2541 2542 manipulation of line-based output. You can use '?' on them for
2542 2543 details.
2543 2544 depth : int, optional
2544 2545 How many frames above the caller are the local variables which should
2545 2546 be expanded in the command string? The default (0) assumes that the
2546 2547 expansion variables are in the stack frame calling this function.
2547 2548 """
2548 2549 if cmd.rstrip().endswith('&'):
2549 2550 # this is *far* from a rigorous test
2550 2551 raise OSError("Background processes not supported.")
2551 2552 out = getoutput(self.var_expand(cmd, depth=depth+1))
2552 2553 if split:
2553 2554 out = SList(out.splitlines())
2554 2555 else:
2555 2556 out = LSString(out)
2556 2557 return out
2557 2558
2558 2559 #-------------------------------------------------------------------------
2559 2560 # Things related to aliases
2560 2561 #-------------------------------------------------------------------------
2561 2562
2562 2563 def init_alias(self):
2563 2564 self.alias_manager = AliasManager(shell=self, parent=self)
2564 2565 self.configurables.append(self.alias_manager)
2565 2566
2566 2567 #-------------------------------------------------------------------------
2567 2568 # Things related to extensions
2568 2569 #-------------------------------------------------------------------------
2569 2570
2570 2571 def init_extension_manager(self):
2571 2572 self.extension_manager = ExtensionManager(shell=self, parent=self)
2572 2573 self.configurables.append(self.extension_manager)
2573 2574
2574 2575 #-------------------------------------------------------------------------
2575 2576 # Things related to payloads
2576 2577 #-------------------------------------------------------------------------
2577 2578
2578 2579 def init_payload(self):
2579 2580 self.payload_manager = PayloadManager(parent=self)
2580 2581 self.configurables.append(self.payload_manager)
2581 2582
2582 2583 #-------------------------------------------------------------------------
2583 2584 # Things related to the prefilter
2584 2585 #-------------------------------------------------------------------------
2585 2586
2586 2587 def init_prefilter(self):
2587 2588 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2588 2589 self.configurables.append(self.prefilter_manager)
2589 2590 # Ultimately this will be refactored in the new interpreter code, but
2590 2591 # for now, we should expose the main prefilter method (there's legacy
2591 2592 # code out there that may rely on this).
2592 2593 self.prefilter = self.prefilter_manager.prefilter_lines
2593 2594
2594 2595 def auto_rewrite_input(self, cmd):
2595 2596 """Print to the screen the rewritten form of the user's command.
2596 2597
2597 2598 This shows visual feedback by rewriting input lines that cause
2598 2599 automatic calling to kick in, like::
2599 2600
2600 2601 /f x
2601 2602
2602 2603 into::
2603 2604
2604 2605 ------> f(x)
2605 2606
2606 2607 after the user's input prompt. This helps the user understand that the
2607 2608 input line was transformed automatically by IPython.
2608 2609 """
2609 2610 if not self.show_rewritten_input:
2610 2611 return
2611 2612
2612 2613 # This is overridden in TerminalInteractiveShell to use fancy prompts
2613 2614 print("------> " + cmd)
2614 2615
2615 2616 #-------------------------------------------------------------------------
2616 2617 # Things related to extracting values/expressions from kernel and user_ns
2617 2618 #-------------------------------------------------------------------------
2618 2619
2619 2620 def _user_obj_error(self):
2620 2621 """return simple exception dict
2621 2622
2622 2623 for use in user_expressions
2623 2624 """
2624 2625
2625 2626 etype, evalue, tb = self._get_exc_info()
2626 2627 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2627 2628
2628 2629 exc_info = {
2629 2630 u'status' : 'error',
2630 2631 u'traceback' : stb,
2631 2632 u'ename' : etype.__name__,
2632 2633 u'evalue' : py3compat.safe_unicode(evalue),
2633 2634 }
2634 2635
2635 2636 return exc_info
2636 2637
2637 2638 def _format_user_obj(self, obj):
2638 2639 """format a user object to display dict
2639 2640
2640 2641 for use in user_expressions
2641 2642 """
2642 2643
2643 2644 data, md = self.display_formatter.format(obj)
2644 2645 value = {
2645 2646 'status' : 'ok',
2646 2647 'data' : data,
2647 2648 'metadata' : md,
2648 2649 }
2649 2650 return value
2650 2651
2651 2652 def user_expressions(self, expressions):
2652 2653 """Evaluate a dict of expressions in the user's namespace.
2653 2654
2654 2655 Parameters
2655 2656 ----------
2656 2657 expressions : dict
2657 2658 A dict with string keys and string values. The expression values
2658 2659 should be valid Python expressions, each of which will be evaluated
2659 2660 in the user namespace.
2660 2661
2661 2662 Returns
2662 2663 -------
2663 2664 A dict, keyed like the input expressions dict, with the rich mime-typed
2664 2665 display_data of each value.
2665 2666 """
2666 2667 out = {}
2667 2668 user_ns = self.user_ns
2668 2669 global_ns = self.user_global_ns
2669 2670
2670 2671 for key, expr in expressions.items():
2671 2672 try:
2672 2673 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2673 2674 except:
2674 2675 value = self._user_obj_error()
2675 2676 out[key] = value
2676 2677 return out
2677 2678
2678 2679 #-------------------------------------------------------------------------
2679 2680 # Things related to the running of code
2680 2681 #-------------------------------------------------------------------------
2681 2682
2682 2683 def ex(self, cmd):
2683 2684 """Execute a normal python statement in user namespace."""
2684 2685 with self.builtin_trap:
2685 2686 exec(cmd, self.user_global_ns, self.user_ns)
2686 2687
2687 2688 def ev(self, expr):
2688 2689 """Evaluate python expression expr in user namespace.
2689 2690
2690 2691 Returns the result of evaluation
2691 2692 """
2692 2693 with self.builtin_trap:
2693 2694 return eval(expr, self.user_global_ns, self.user_ns)
2694 2695
2695 2696 def safe_execfile(self, fname, *where, exit_ignore=False, raise_exceptions=False, shell_futures=False):
2696 2697 """A safe version of the builtin execfile().
2697 2698
2698 2699 This version will never throw an exception, but instead print
2699 2700 helpful error messages to the screen. This only works on pure
2700 2701 Python files with the .py extension.
2701 2702
2702 2703 Parameters
2703 2704 ----------
2704 2705 fname : string
2705 2706 The name of the file to be executed.
2706 2707 where : tuple
2707 2708 One or two namespaces, passed to execfile() as (globals,locals).
2708 2709 If only one is given, it is passed as both.
2709 2710 exit_ignore : bool (False)
2710 2711 If True, then silence SystemExit for non-zero status (it is always
2711 2712 silenced for zero status, as it is so common).
2712 2713 raise_exceptions : bool (False)
2713 2714 If True raise exceptions everywhere. Meant for testing.
2714 2715 shell_futures : bool (False)
2715 2716 If True, the code will share future statements with the interactive
2716 2717 shell. It will both be affected by previous __future__ imports, and
2717 2718 any __future__ imports in the code will affect the shell. If False,
2718 2719 __future__ imports are not shared in either direction.
2719 2720
2720 2721 """
2721 2722 fname = os.path.abspath(os.path.expanduser(fname))
2722 2723
2723 2724 # Make sure we can open the file
2724 2725 try:
2725 2726 with open(fname):
2726 2727 pass
2727 2728 except:
2728 2729 warn('Could not open file <%s> for safe execution.' % fname)
2729 2730 return
2730 2731
2731 2732 # Find things also in current directory. This is needed to mimic the
2732 2733 # behavior of running a script from the system command line, where
2733 2734 # Python inserts the script's directory into sys.path
2734 2735 dname = os.path.dirname(fname)
2735 2736
2736 2737 with prepended_to_syspath(dname), self.builtin_trap:
2737 2738 try:
2738 2739 glob, loc = (where + (None, ))[:2]
2739 2740 py3compat.execfile(
2740 2741 fname, glob, loc,
2741 2742 self.compile if shell_futures else None)
2742 2743 except SystemExit as status:
2743 2744 # If the call was made with 0 or None exit status (sys.exit(0)
2744 2745 # or sys.exit() ), don't bother showing a traceback, as both of
2745 2746 # these are considered normal by the OS:
2746 2747 # > python -c'import sys;sys.exit(0)'; echo $?
2747 2748 # 0
2748 2749 # > python -c'import sys;sys.exit()'; echo $?
2749 2750 # 0
2750 2751 # For other exit status, we show the exception unless
2751 2752 # explicitly silenced, but only in short form.
2752 2753 if status.code:
2753 2754 if raise_exceptions:
2754 2755 raise
2755 2756 if not exit_ignore:
2756 2757 self.showtraceback(exception_only=True)
2757 2758 except:
2758 2759 if raise_exceptions:
2759 2760 raise
2760 2761 # tb offset is 2 because we wrap execfile
2761 2762 self.showtraceback(tb_offset=2)
2762 2763
2763 2764 def safe_execfile_ipy(self, fname, shell_futures=False, raise_exceptions=False):
2764 2765 """Like safe_execfile, but for .ipy or .ipynb files with IPython syntax.
2765 2766
2766 2767 Parameters
2767 2768 ----------
2768 2769 fname : str
2769 2770 The name of the file to execute. The filename must have a
2770 2771 .ipy or .ipynb extension.
2771 2772 shell_futures : bool (False)
2772 2773 If True, the code will share future statements with the interactive
2773 2774 shell. It will both be affected by previous __future__ imports, and
2774 2775 any __future__ imports in the code will affect the shell. If False,
2775 2776 __future__ imports are not shared in either direction.
2776 2777 raise_exceptions : bool (False)
2777 2778 If True raise exceptions everywhere. Meant for testing.
2778 2779 """
2779 2780 fname = os.path.abspath(os.path.expanduser(fname))
2780 2781
2781 2782 # Make sure we can open the file
2782 2783 try:
2783 2784 with open(fname):
2784 2785 pass
2785 2786 except:
2786 2787 warn('Could not open file <%s> for safe execution.' % fname)
2787 2788 return
2788 2789
2789 2790 # Find things also in current directory. This is needed to mimic the
2790 2791 # behavior of running a script from the system command line, where
2791 2792 # Python inserts the script's directory into sys.path
2792 2793 dname = os.path.dirname(fname)
2793 2794
2794 2795 def get_cells():
2795 2796 """generator for sequence of code blocks to run"""
2796 2797 if fname.endswith('.ipynb'):
2797 2798 from nbformat import read
2798 2799 nb = read(fname, as_version=4)
2799 2800 if not nb.cells:
2800 2801 return
2801 2802 for cell in nb.cells:
2802 2803 if cell.cell_type == 'code':
2803 2804 yield cell.source
2804 2805 else:
2805 2806 with open(fname) as f:
2806 2807 yield f.read()
2807 2808
2808 2809 with prepended_to_syspath(dname):
2809 2810 try:
2810 2811 for cell in get_cells():
2811 2812 result = self.run_cell(cell, silent=True, shell_futures=shell_futures)
2812 2813 if raise_exceptions:
2813 2814 result.raise_error()
2814 2815 elif not result.success:
2815 2816 break
2816 2817 except:
2817 2818 if raise_exceptions:
2818 2819 raise
2819 2820 self.showtraceback()
2820 2821 warn('Unknown failure executing file: <%s>' % fname)
2821 2822
2822 2823 def safe_run_module(self, mod_name, where):
2823 2824 """A safe version of runpy.run_module().
2824 2825
2825 2826 This version will never throw an exception, but instead print
2826 2827 helpful error messages to the screen.
2827 2828
2828 2829 `SystemExit` exceptions with status code 0 or None are ignored.
2829 2830
2830 2831 Parameters
2831 2832 ----------
2832 2833 mod_name : string
2833 2834 The name of the module to be executed.
2834 2835 where : dict
2835 2836 The globals namespace.
2836 2837 """
2837 2838 try:
2838 2839 try:
2839 2840 where.update(
2840 2841 runpy.run_module(str(mod_name), run_name="__main__",
2841 2842 alter_sys=True)
2842 2843 )
2843 2844 except SystemExit as status:
2844 2845 if status.code:
2845 2846 raise
2846 2847 except:
2847 2848 self.showtraceback()
2848 2849 warn('Unknown failure executing module: <%s>' % mod_name)
2849 2850
2850 2851 def run_cell(self, raw_cell, store_history=False, silent=False, shell_futures=True):
2851 2852 """Run a complete IPython cell.
2852 2853
2853 2854 Parameters
2854 2855 ----------
2855 2856 raw_cell : str
2856 2857 The code (including IPython code such as %magic functions) to run.
2857 2858 store_history : bool
2858 2859 If True, the raw and translated cell will be stored in IPython's
2859 2860 history. For user code calling back into IPython's machinery, this
2860 2861 should be set to False.
2861 2862 silent : bool
2862 2863 If True, avoid side-effects, such as implicit displayhooks and
2863 2864 and logging. silent=True forces store_history=False.
2864 2865 shell_futures : bool
2865 2866 If True, the code will share future statements with the interactive
2866 2867 shell. It will both be affected by previous __future__ imports, and
2867 2868 any __future__ imports in the code will affect the shell. If False,
2868 2869 __future__ imports are not shared in either direction.
2869 2870
2870 2871 Returns
2871 2872 -------
2872 2873 result : :class:`ExecutionResult`
2873 2874 """
2874 2875 result = None
2875 2876 try:
2876 2877 result = self._run_cell(
2877 2878 raw_cell, store_history, silent, shell_futures)
2878 2879 finally:
2879 2880 self.events.trigger('post_execute')
2880 2881 if not silent:
2881 2882 self.events.trigger('post_run_cell', result)
2882 2883 return result
2883 2884
2884 2885 def _run_cell(self, raw_cell:str, store_history:bool, silent:bool, shell_futures:bool):
2885 2886 """Internal method to run a complete IPython cell."""
2886 2887
2887 2888 # we need to avoid calling self.transform_cell multiple time on the same thing
2888 2889 # so we need to store some results:
2889 2890 preprocessing_exc_tuple = None
2890 2891 try:
2891 2892 transformed_cell = self.transform_cell(raw_cell)
2892 2893 except Exception:
2893 2894 transformed_cell = raw_cell
2894 2895 preprocessing_exc_tuple = sys.exc_info()
2895 2896
2896 2897 assert transformed_cell is not None
2897 2898 coro = self.run_cell_async(
2898 2899 raw_cell,
2899 2900 store_history=store_history,
2900 2901 silent=silent,
2901 2902 shell_futures=shell_futures,
2902 2903 transformed_cell=transformed_cell,
2903 2904 preprocessing_exc_tuple=preprocessing_exc_tuple,
2904 2905 )
2905 2906
2906 2907 # run_cell_async is async, but may not actually need an eventloop.
2907 2908 # when this is the case, we want to run it using the pseudo_sync_runner
2908 2909 # so that code can invoke eventloops (for example via the %run , and
2909 2910 # `%paste` magic.
2910 2911 if self.trio_runner:
2911 2912 runner = self.trio_runner
2912 2913 elif self.should_run_async(
2913 2914 raw_cell,
2914 2915 transformed_cell=transformed_cell,
2915 2916 preprocessing_exc_tuple=preprocessing_exc_tuple,
2916 2917 ):
2917 2918 runner = self.loop_runner
2918 2919 else:
2919 2920 runner = _pseudo_sync_runner
2920 2921
2921 2922 try:
2922 2923 return runner(coro)
2923 2924 except BaseException as e:
2924 2925 info = ExecutionInfo(raw_cell, store_history, silent, shell_futures)
2925 2926 result = ExecutionResult(info)
2926 2927 result.error_in_exec = e
2927 2928 self.showtraceback(running_compiled_code=True)
2928 2929 return result
2929 2930 return
2930 2931
2931 2932 def should_run_async(
2932 2933 self, raw_cell: str, *, transformed_cell=None, preprocessing_exc_tuple=None
2933 2934 ) -> bool:
2934 2935 """Return whether a cell should be run asynchronously via a coroutine runner
2935 2936
2936 2937 Parameters
2937 2938 ----------
2938 2939 raw_cell: str
2939 2940 The code to be executed
2940 2941
2941 2942 Returns
2942 2943 -------
2943 2944 result: bool
2944 2945 Whether the code needs to be run with a coroutine runner or not
2945 2946
2946 2947 .. versionadded: 7.0
2947 2948 """
2948 2949 if not self.autoawait:
2949 2950 return False
2950 2951 if preprocessing_exc_tuple is not None:
2951 2952 return False
2952 2953 assert preprocessing_exc_tuple is None
2953 2954 if transformed_cell is None:
2954 2955 warnings.warn(
2955 2956 "`should_run_async` will not call `transform_cell`"
2956 2957 " automatically in the future. Please pass the result to"
2957 2958 " `transformed_cell` argument and any exception that happen"
2958 2959 " during the"
2959 2960 "transform in `preprocessing_exc_tuple` in"
2960 2961 " IPython 7.17 and above.",
2961 2962 DeprecationWarning,
2962 2963 stacklevel=2,
2963 2964 )
2964 2965 try:
2965 2966 cell = self.transform_cell(raw_cell)
2966 2967 except Exception:
2967 2968 # any exception during transform will be raised
2968 2969 # prior to execution
2969 2970 return False
2970 2971 else:
2971 2972 cell = transformed_cell
2972 2973 return _should_be_async(cell)
2973 2974
2974 2975 async def run_cell_async(
2975 2976 self,
2976 2977 raw_cell: str,
2977 2978 store_history=False,
2978 2979 silent=False,
2979 2980 shell_futures=True,
2980 2981 *,
2981 2982 transformed_cell: Optional[str] = None,
2982 2983 preprocessing_exc_tuple: Optional[Any] = None
2983 2984 ) -> ExecutionResult:
2984 2985 """Run a complete IPython cell asynchronously.
2985 2986
2986 2987 Parameters
2987 2988 ----------
2988 2989 raw_cell : str
2989 2990 The code (including IPython code such as %magic functions) to run.
2990 2991 store_history : bool
2991 2992 If True, the raw and translated cell will be stored in IPython's
2992 2993 history. For user code calling back into IPython's machinery, this
2993 2994 should be set to False.
2994 2995 silent : bool
2995 2996 If True, avoid side-effects, such as implicit displayhooks and
2996 2997 and logging. silent=True forces store_history=False.
2997 2998 shell_futures : bool
2998 2999 If True, the code will share future statements with the interactive
2999 3000 shell. It will both be affected by previous __future__ imports, and
3000 3001 any __future__ imports in the code will affect the shell. If False,
3001 3002 __future__ imports are not shared in either direction.
3002 3003 transformed_cell: str
3003 3004 cell that was passed through transformers
3004 3005 preprocessing_exc_tuple:
3005 3006 trace if the transformation failed.
3006 3007
3007 3008 Returns
3008 3009 -------
3009 3010 result : :class:`ExecutionResult`
3010 3011
3011 3012 .. versionadded: 7.0
3012 3013 """
3013 3014 info = ExecutionInfo(
3014 3015 raw_cell, store_history, silent, shell_futures)
3015 3016 result = ExecutionResult(info)
3016 3017
3017 3018 if (not raw_cell) or raw_cell.isspace():
3018 3019 self.last_execution_succeeded = True
3019 3020 self.last_execution_result = result
3020 3021 return result
3021 3022
3022 3023 if silent:
3023 3024 store_history = False
3024 3025
3025 3026 if store_history:
3026 3027 result.execution_count = self.execution_count
3027 3028
3028 3029 def error_before_exec(value):
3029 3030 if store_history:
3030 3031 self.execution_count += 1
3031 3032 result.error_before_exec = value
3032 3033 self.last_execution_succeeded = False
3033 3034 self.last_execution_result = result
3034 3035 return result
3035 3036
3036 3037 self.events.trigger('pre_execute')
3037 3038 if not silent:
3038 3039 self.events.trigger('pre_run_cell', info)
3039 3040
3040 3041 if transformed_cell is None:
3041 3042 warnings.warn(
3042 3043 "`run_cell_async` will not call `transform_cell`"
3043 3044 " automatically in the future. Please pass the result to"
3044 3045 " `transformed_cell` argument and any exception that happen"
3045 3046 " during the"
3046 3047 "transform in `preprocessing_exc_tuple` in"
3047 3048 " IPython 7.17 and above.",
3048 3049 DeprecationWarning,
3049 3050 stacklevel=2,
3050 3051 )
3051 3052 # If any of our input transformation (input_transformer_manager or
3052 3053 # prefilter_manager) raises an exception, we store it in this variable
3053 3054 # so that we can display the error after logging the input and storing
3054 3055 # it in the history.
3055 3056 try:
3056 3057 cell = self.transform_cell(raw_cell)
3057 3058 except Exception:
3058 3059 preprocessing_exc_tuple = sys.exc_info()
3059 3060 cell = raw_cell # cell has to exist so it can be stored/logged
3060 3061 else:
3061 3062 preprocessing_exc_tuple = None
3062 3063 else:
3063 3064 if preprocessing_exc_tuple is None:
3064 3065 cell = transformed_cell
3065 3066 else:
3066 3067 cell = raw_cell
3067 3068
3068 3069 # Store raw and processed history
3069 3070 if store_history:
3070 3071 self.history_manager.store_inputs(self.execution_count,
3071 3072 cell, raw_cell)
3072 3073 if not silent:
3073 3074 self.logger.log(cell, raw_cell)
3074 3075
3075 3076 # Display the exception if input processing failed.
3076 3077 if preprocessing_exc_tuple is not None:
3077 3078 self.showtraceback(preprocessing_exc_tuple)
3078 3079 if store_history:
3079 3080 self.execution_count += 1
3080 3081 return error_before_exec(preprocessing_exc_tuple[1])
3081 3082
3082 3083 # Our own compiler remembers the __future__ environment. If we want to
3083 3084 # run code with a separate __future__ environment, use the default
3084 3085 # compiler
3085 3086 compiler = self.compile if shell_futures else CachingCompiler()
3086 3087
3087 3088 _run_async = False
3088 3089
3089 3090 with self.builtin_trap:
3090 3091 cell_name = self.compile.cache(cell, self.execution_count)
3091 3092
3092 3093 with self.display_trap:
3093 3094 # Compile to bytecode
3094 3095 try:
3095 3096 if sys.version_info < (3,8) and self.autoawait:
3096 3097 if _should_be_async(cell):
3097 3098 # the code AST below will not be user code: we wrap it
3098 3099 # in an `async def`. This will likely make some AST
3099 3100 # transformer below miss some transform opportunity and
3100 3101 # introduce a small coupling to run_code (in which we
3101 3102 # bake some assumptions of what _ast_asyncify returns.
3102 3103 # they are ways around (like grafting part of the ast
3103 3104 # later:
3104 3105 # - Here, return code_ast.body[0].body[1:-1], as well
3105 3106 # as last expression in return statement which is
3106 3107 # the user code part.
3107 3108 # - Let it go through the AST transformers, and graft
3108 3109 # - it back after the AST transform
3109 3110 # But that seem unreasonable, at least while we
3110 3111 # do not need it.
3111 3112 code_ast = _ast_asyncify(cell, 'async-def-wrapper')
3112 3113 _run_async = True
3113 3114 else:
3114 3115 code_ast = compiler.ast_parse(cell, filename=cell_name)
3115 3116 else:
3116 3117 code_ast = compiler.ast_parse(cell, filename=cell_name)
3117 3118 except self.custom_exceptions as e:
3118 3119 etype, value, tb = sys.exc_info()
3119 3120 self.CustomTB(etype, value, tb)
3120 3121 return error_before_exec(e)
3121 3122 except IndentationError as e:
3122 3123 self.showindentationerror()
3123 3124 return error_before_exec(e)
3124 3125 except (OverflowError, SyntaxError, ValueError, TypeError,
3125 3126 MemoryError) as e:
3126 3127 self.showsyntaxerror()
3127 3128 return error_before_exec(e)
3128 3129
3129 3130 # Apply AST transformations
3130 3131 try:
3131 3132 code_ast = self.transform_ast(code_ast)
3132 3133 except InputRejected as e:
3133 3134 self.showtraceback()
3134 3135 return error_before_exec(e)
3135 3136
3136 3137 # Give the displayhook a reference to our ExecutionResult so it
3137 3138 # can fill in the output value.
3138 3139 self.displayhook.exec_result = result
3139 3140
3140 3141 # Execute the user code
3141 3142 interactivity = "none" if silent else self.ast_node_interactivity
3142 3143 if _run_async:
3143 3144 interactivity = 'async'
3144 3145
3145 3146 has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
3146 3147 interactivity=interactivity, compiler=compiler, result=result)
3147 3148
3148 3149 self.last_execution_succeeded = not has_raised
3149 3150 self.last_execution_result = result
3150 3151
3151 3152 # Reset this so later displayed values do not modify the
3152 3153 # ExecutionResult
3153 3154 self.displayhook.exec_result = None
3154 3155
3155 3156 if store_history:
3156 3157 # Write output to the database. Does nothing unless
3157 3158 # history output logging is enabled.
3158 3159 self.history_manager.store_output(self.execution_count)
3159 3160 # Each cell is a *single* input, regardless of how many lines it has
3160 3161 self.execution_count += 1
3161 3162
3162 3163 return result
3163 3164
3164 3165 def transform_cell(self, raw_cell):
3165 3166 """Transform an input cell before parsing it.
3166 3167
3167 3168 Static transformations, implemented in IPython.core.inputtransformer2,
3168 3169 deal with things like ``%magic`` and ``!system`` commands.
3169 3170 These run on all input.
3170 3171 Dynamic transformations, for things like unescaped magics and the exit
3171 3172 autocall, depend on the state of the interpreter.
3172 3173 These only apply to single line inputs.
3173 3174
3174 3175 These string-based transformations are followed by AST transformations;
3175 3176 see :meth:`transform_ast`.
3176 3177 """
3177 3178 # Static input transformations
3178 3179 cell = self.input_transformer_manager.transform_cell(raw_cell)
3179 3180
3180 3181 if len(cell.splitlines()) == 1:
3181 3182 # Dynamic transformations - only applied for single line commands
3182 3183 with self.builtin_trap:
3183 3184 # use prefilter_lines to handle trailing newlines
3184 3185 # restore trailing newline for ast.parse
3185 3186 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
3186 3187
3187 3188 lines = cell.splitlines(keepends=True)
3188 3189 for transform in self.input_transformers_post:
3189 3190 lines = transform(lines)
3190 3191 cell = ''.join(lines)
3191 3192
3192 3193 return cell
3193 3194
3194 3195 def transform_ast(self, node):
3195 3196 """Apply the AST transformations from self.ast_transformers
3196 3197
3197 3198 Parameters
3198 3199 ----------
3199 3200 node : ast.Node
3200 3201 The root node to be transformed. Typically called with the ast.Module
3201 3202 produced by parsing user input.
3202 3203
3203 3204 Returns
3204 3205 -------
3205 3206 An ast.Node corresponding to the node it was called with. Note that it
3206 3207 may also modify the passed object, so don't rely on references to the
3207 3208 original AST.
3208 3209 """
3209 3210 for transformer in self.ast_transformers:
3210 3211 try:
3211 3212 node = transformer.visit(node)
3212 3213 except InputRejected:
3213 3214 # User-supplied AST transformers can reject an input by raising
3214 3215 # an InputRejected. Short-circuit in this case so that we
3215 3216 # don't unregister the transform.
3216 3217 raise
3217 3218 except Exception:
3218 3219 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
3219 3220 self.ast_transformers.remove(transformer)
3220 3221
3221 3222 if self.ast_transformers:
3222 3223 ast.fix_missing_locations(node)
3223 3224 return node
3224 3225
3225 3226 async def run_ast_nodes(self, nodelist:ListType[AST], cell_name:str, interactivity='last_expr',
3226 3227 compiler=compile, result=None):
3227 3228 """Run a sequence of AST nodes. The execution mode depends on the
3228 3229 interactivity parameter.
3229 3230
3230 3231 Parameters
3231 3232 ----------
3232 3233 nodelist : list
3233 3234 A sequence of AST nodes to run.
3234 3235 cell_name : str
3235 3236 Will be passed to the compiler as the filename of the cell. Typically
3236 3237 the value returned by ip.compile.cache(cell).
3237 3238 interactivity : str
3238 3239 'all', 'last', 'last_expr' , 'last_expr_or_assign' or 'none',
3239 3240 specifying which nodes should be run interactively (displaying output
3240 3241 from expressions). 'last_expr' will run the last node interactively
3241 3242 only if it is an expression (i.e. expressions in loops or other blocks
3242 3243 are not displayed) 'last_expr_or_assign' will run the last expression
3243 3244 or the last assignment. Other values for this parameter will raise a
3244 3245 ValueError.
3245 3246
3246 3247 Experimental value: 'async' Will try to run top level interactive
3247 3248 async/await code in default runner, this will not respect the
3248 3249 interactivity setting and will only run the last node if it is an
3249 3250 expression.
3250 3251
3251 3252 compiler : callable
3252 3253 A function with the same interface as the built-in compile(), to turn
3253 3254 the AST nodes into code objects. Default is the built-in compile().
3254 3255 result : ExecutionResult, optional
3255 3256 An object to store exceptions that occur during execution.
3256 3257
3257 3258 Returns
3258 3259 -------
3259 3260 True if an exception occurred while running code, False if it finished
3260 3261 running.
3261 3262 """
3262 3263 if not nodelist:
3263 3264 return
3264 3265
3265 3266 if interactivity == 'last_expr_or_assign':
3266 3267 if isinstance(nodelist[-1], _assign_nodes):
3267 3268 asg = nodelist[-1]
3268 3269 if isinstance(asg, ast.Assign) and len(asg.targets) == 1:
3269 3270 target = asg.targets[0]
3270 3271 elif isinstance(asg, _single_targets_nodes):
3271 3272 target = asg.target
3272 3273 else:
3273 3274 target = None
3274 3275 if isinstance(target, ast.Name):
3275 3276 nnode = ast.Expr(ast.Name(target.id, ast.Load()))
3276 3277 ast.fix_missing_locations(nnode)
3277 3278 nodelist.append(nnode)
3278 3279 interactivity = 'last_expr'
3279 3280
3280 3281 _async = False
3281 3282 if interactivity == 'last_expr':
3282 3283 if isinstance(nodelist[-1], ast.Expr):
3283 3284 interactivity = "last"
3284 3285 else:
3285 3286 interactivity = "none"
3286 3287
3287 3288 if interactivity == 'none':
3288 3289 to_run_exec, to_run_interactive = nodelist, []
3289 3290 elif interactivity == 'last':
3290 3291 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
3291 3292 elif interactivity == 'all':
3292 3293 to_run_exec, to_run_interactive = [], nodelist
3293 3294 elif interactivity == 'async':
3294 3295 to_run_exec, to_run_interactive = [], nodelist
3295 3296 _async = True
3296 3297 else:
3297 3298 raise ValueError("Interactivity was %r" % interactivity)
3298 3299
3299 3300 try:
3300 3301 if _async and sys.version_info > (3,8):
3301 3302 raise ValueError("This branch should never happen on Python 3.8 and above, "
3302 3303 "please try to upgrade IPython and open a bug report with your case.")
3303 3304 if _async:
3304 3305 # If interactivity is async the semantics of run_code are
3305 3306 # completely different Skip usual machinery.
3306 3307 mod = Module(nodelist, [])
3307 3308 async_wrapper_code = compiler(mod, cell_name, 'exec')
3308 3309 exec(async_wrapper_code, self.user_global_ns, self.user_ns)
3309 3310 async_code = removed_co_newlocals(self.user_ns.pop('async-def-wrapper')).__code__
3310 3311 if (await self.run_code(async_code, result, async_=True)):
3311 3312 return True
3312 3313 else:
3313 3314 if sys.version_info > (3, 8):
3314 3315 def compare(code):
3315 3316 is_async = (inspect.CO_COROUTINE & code.co_flags == inspect.CO_COROUTINE)
3316 3317 return is_async
3317 3318 else:
3318 3319 def compare(code):
3319 3320 return _async
3320 3321
3321 3322 # refactor that to just change the mod constructor.
3322 3323 to_run = []
3323 3324 for node in to_run_exec:
3324 3325 to_run.append((node, 'exec'))
3325 3326
3326 3327 for node in to_run_interactive:
3327 3328 to_run.append((node, 'single'))
3328 3329
3329 3330 for node,mode in to_run:
3330 3331 if mode == 'exec':
3331 3332 mod = Module([node], [])
3332 3333 elif mode == 'single':
3333 3334 mod = ast.Interactive([node])
3334 3335 with compiler.extra_flags(getattr(ast, 'PyCF_ALLOW_TOP_LEVEL_AWAIT', 0x0) if self.autoawait else 0x0):
3335 3336 code = compiler(mod, cell_name, mode)
3336 3337 asy = compare(code)
3337 3338 if (await self.run_code(code, result, async_=asy)):
3338 3339 return True
3339 3340
3340 3341 # Flush softspace
3341 3342 if softspace(sys.stdout, 0):
3342 3343 print()
3343 3344
3344 3345 except:
3345 3346 # It's possible to have exceptions raised here, typically by
3346 3347 # compilation of odd code (such as a naked 'return' outside a
3347 3348 # function) that did parse but isn't valid. Typically the exception
3348 3349 # is a SyntaxError, but it's safest just to catch anything and show
3349 3350 # the user a traceback.
3350 3351
3351 3352 # We do only one try/except outside the loop to minimize the impact
3352 3353 # on runtime, and also because if any node in the node list is
3353 3354 # broken, we should stop execution completely.
3354 3355 if result:
3355 3356 result.error_before_exec = sys.exc_info()[1]
3356 3357 self.showtraceback()
3357 3358 return True
3358 3359
3359 3360 return False
3360 3361
3361 3362 def _async_exec(self, code_obj: types.CodeType, user_ns: dict):
3362 3363 """
3363 3364 Evaluate an asynchronous code object using a code runner
3364 3365
3365 3366 Fake asynchronous execution of code_object in a namespace via a proxy namespace.
3366 3367
3367 3368 Returns coroutine object, which can be executed via async loop runner
3368 3369
3369 3370 WARNING: The semantics of `async_exec` are quite different from `exec`,
3370 3371 in particular you can only pass a single namespace. It also return a
3371 3372 handle to the value of the last things returned by code_object.
3372 3373 """
3373 3374
3374 3375 return eval(code_obj, user_ns)
3375 3376
3376 3377 async def run_code(self, code_obj, result=None, *, async_=False):
3377 3378 """Execute a code object.
3378 3379
3379 3380 When an exception occurs, self.showtraceback() is called to display a
3380 3381 traceback.
3381 3382
3382 3383 Parameters
3383 3384 ----------
3384 3385 code_obj : code object
3385 3386 A compiled code object, to be executed
3386 3387 result : ExecutionResult, optional
3387 3388 An object to store exceptions that occur during execution.
3388 3389 async_ : Bool (Experimental)
3389 3390 Attempt to run top-level asynchronous code in a default loop.
3390 3391
3391 3392 Returns
3392 3393 -------
3393 3394 False : successful execution.
3394 3395 True : an error occurred.
3395 3396 """
3396 3397 # special value to say that anything above is IPython and should be
3397 3398 # hidden.
3398 3399 __tracebackhide__ = "__ipython_bottom__"
3399 3400 # Set our own excepthook in case the user code tries to call it
3400 3401 # directly, so that the IPython crash handler doesn't get triggered
3401 3402 old_excepthook, sys.excepthook = sys.excepthook, self.excepthook
3402 3403
3403 3404 # we save the original sys.excepthook in the instance, in case config
3404 3405 # code (such as magics) needs access to it.
3405 3406 self.sys_excepthook = old_excepthook
3406 3407 outflag = True # happens in more places, so it's easier as default
3407 3408 try:
3408 3409 try:
3409 3410 self.hooks.pre_run_code_hook()
3410 3411 if async_ and sys.version_info < (3,8):
3411 3412 last_expr = (await self._async_exec(code_obj, self.user_ns))
3412 3413 code = compile('last_expr', 'fake', "single")
3413 3414 exec(code, {'last_expr': last_expr})
3414 3415 elif async_ :
3415 3416 await eval(code_obj, self.user_global_ns, self.user_ns)
3416 3417 else:
3417 3418 exec(code_obj, self.user_global_ns, self.user_ns)
3418 3419 finally:
3419 3420 # Reset our crash handler in place
3420 3421 sys.excepthook = old_excepthook
3421 3422 except SystemExit as e:
3422 3423 if result is not None:
3423 3424 result.error_in_exec = e
3424 3425 self.showtraceback(exception_only=True)
3425 3426 warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
3426 3427 except self.custom_exceptions:
3427 3428 etype, value, tb = sys.exc_info()
3428 3429 if result is not None:
3429 3430 result.error_in_exec = value
3430 3431 self.CustomTB(etype, value, tb)
3431 3432 except:
3432 3433 if result is not None:
3433 3434 result.error_in_exec = sys.exc_info()[1]
3434 3435 self.showtraceback(running_compiled_code=True)
3435 3436 else:
3436 3437 outflag = False
3437 3438 return outflag
3438 3439
3439 3440 # For backwards compatibility
3440 3441 runcode = run_code
3441 3442
3442 3443 def check_complete(self, code: str) -> Tuple[str, str]:
3443 3444 """Return whether a block of code is ready to execute, or should be continued
3444 3445
3445 3446 Parameters
3446 3447 ----------
3447 3448 source : string
3448 3449 Python input code, which can be multiline.
3449 3450
3450 3451 Returns
3451 3452 -------
3452 3453 status : str
3453 3454 One of 'complete', 'incomplete', or 'invalid' if source is not a
3454 3455 prefix of valid code.
3455 3456 indent : str
3456 3457 When status is 'incomplete', this is some whitespace to insert on
3457 3458 the next line of the prompt.
3458 3459 """
3459 3460 status, nspaces = self.input_transformer_manager.check_complete(code)
3460 3461 return status, ' ' * (nspaces or 0)
3461 3462
3462 3463 #-------------------------------------------------------------------------
3463 3464 # Things related to GUI support and pylab
3464 3465 #-------------------------------------------------------------------------
3465 3466
3466 3467 active_eventloop = None
3467 3468
3468 3469 def enable_gui(self, gui=None):
3469 3470 raise NotImplementedError('Implement enable_gui in a subclass')
3470 3471
3471 3472 def enable_matplotlib(self, gui=None):
3472 3473 """Enable interactive matplotlib and inline figure support.
3473 3474
3474 3475 This takes the following steps:
3475 3476
3476 3477 1. select the appropriate eventloop and matplotlib backend
3477 3478 2. set up matplotlib for interactive use with that backend
3478 3479 3. configure formatters for inline figure display
3479 3480 4. enable the selected gui eventloop
3480 3481
3481 3482 Parameters
3482 3483 ----------
3483 3484 gui : optional, string
3484 3485 If given, dictates the choice of matplotlib GUI backend to use
3485 3486 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3486 3487 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3487 3488 matplotlib (as dictated by the matplotlib build-time options plus the
3488 3489 user's matplotlibrc configuration file). Note that not all backends
3489 3490 make sense in all contexts, for example a terminal ipython can't
3490 3491 display figures inline.
3491 3492 """
3492 3493 from IPython.core import pylabtools as pt
3493 3494 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
3494 3495
3495 3496 if gui != 'inline':
3496 3497 # If we have our first gui selection, store it
3497 3498 if self.pylab_gui_select is None:
3498 3499 self.pylab_gui_select = gui
3499 3500 # Otherwise if they are different
3500 3501 elif gui != self.pylab_gui_select:
3501 3502 print('Warning: Cannot change to a different GUI toolkit: %s.'
3502 3503 ' Using %s instead.' % (gui, self.pylab_gui_select))
3503 3504 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
3504 3505
3505 3506 pt.activate_matplotlib(backend)
3506 3507 pt.configure_inline_support(self, backend)
3507 3508
3508 3509 # Now we must activate the gui pylab wants to use, and fix %run to take
3509 3510 # plot updates into account
3510 3511 self.enable_gui(gui)
3511 3512 self.magics_manager.registry['ExecutionMagics'].default_runner = \
3512 3513 pt.mpl_runner(self.safe_execfile)
3513 3514
3514 3515 return gui, backend
3515 3516
3516 3517 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
3517 3518 """Activate pylab support at runtime.
3518 3519
3519 3520 This turns on support for matplotlib, preloads into the interactive
3520 3521 namespace all of numpy and pylab, and configures IPython to correctly
3521 3522 interact with the GUI event loop. The GUI backend to be used can be
3522 3523 optionally selected with the optional ``gui`` argument.
3523 3524
3524 3525 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
3525 3526
3526 3527 Parameters
3527 3528 ----------
3528 3529 gui : optional, string
3529 3530 If given, dictates the choice of matplotlib GUI backend to use
3530 3531 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3531 3532 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3532 3533 matplotlib (as dictated by the matplotlib build-time options plus the
3533 3534 user's matplotlibrc configuration file). Note that not all backends
3534 3535 make sense in all contexts, for example a terminal ipython can't
3535 3536 display figures inline.
3536 3537 import_all : optional, bool, default: True
3537 3538 Whether to do `from numpy import *` and `from pylab import *`
3538 3539 in addition to module imports.
3539 3540 welcome_message : deprecated
3540 3541 This argument is ignored, no welcome message will be displayed.
3541 3542 """
3542 3543 from IPython.core.pylabtools import import_pylab
3543 3544
3544 3545 gui, backend = self.enable_matplotlib(gui)
3545 3546
3546 3547 # We want to prevent the loading of pylab to pollute the user's
3547 3548 # namespace as shown by the %who* magics, so we execute the activation
3548 3549 # code in an empty namespace, and we update *both* user_ns and
3549 3550 # user_ns_hidden with this information.
3550 3551 ns = {}
3551 3552 import_pylab(ns, import_all)
3552 3553 # warn about clobbered names
3553 3554 ignored = {"__builtins__"}
3554 3555 both = set(ns).intersection(self.user_ns).difference(ignored)
3555 3556 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
3556 3557 self.user_ns.update(ns)
3557 3558 self.user_ns_hidden.update(ns)
3558 3559 return gui, backend, clobbered
3559 3560
3560 3561 #-------------------------------------------------------------------------
3561 3562 # Utilities
3562 3563 #-------------------------------------------------------------------------
3563 3564
3564 3565 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
3565 3566 """Expand python variables in a string.
3566 3567
3567 3568 The depth argument indicates how many frames above the caller should
3568 3569 be walked to look for the local namespace where to expand variables.
3569 3570
3570 3571 The global namespace for expansion is always the user's interactive
3571 3572 namespace.
3572 3573 """
3573 3574 ns = self.user_ns.copy()
3574 3575 try:
3575 3576 frame = sys._getframe(depth+1)
3576 3577 except ValueError:
3577 3578 # This is thrown if there aren't that many frames on the stack,
3578 3579 # e.g. if a script called run_line_magic() directly.
3579 3580 pass
3580 3581 else:
3581 3582 ns.update(frame.f_locals)
3582 3583
3583 3584 try:
3584 3585 # We have to use .vformat() here, because 'self' is a valid and common
3585 3586 # name, and expanding **ns for .format() would make it collide with
3586 3587 # the 'self' argument of the method.
3587 3588 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
3588 3589 except Exception:
3589 3590 # if formatter couldn't format, just let it go untransformed
3590 3591 pass
3591 3592 return cmd
3592 3593
3593 3594 def mktempfile(self, data=None, prefix='ipython_edit_'):
3594 3595 """Make a new tempfile and return its filename.
3595 3596
3596 3597 This makes a call to tempfile.mkstemp (created in a tempfile.mkdtemp),
3597 3598 but it registers the created filename internally so ipython cleans it up
3598 3599 at exit time.
3599 3600
3600 3601 Optional inputs:
3601 3602
3602 3603 - data(None): if data is given, it gets written out to the temp file
3603 3604 immediately, and the file is closed again."""
3604 3605
3605 3606 dirname = tempfile.mkdtemp(prefix=prefix)
3606 3607 self.tempdirs.append(dirname)
3607 3608
3608 3609 handle, filename = tempfile.mkstemp('.py', prefix, dir=dirname)
3609 3610 os.close(handle) # On Windows, there can only be one open handle on a file
3610 3611 self.tempfiles.append(filename)
3611 3612
3612 3613 if data:
3613 3614 with open(filename, 'w') as tmp_file:
3614 3615 tmp_file.write(data)
3615 3616 return filename
3616 3617
3617 3618 @undoc
3618 3619 def write(self,data):
3619 3620 """DEPRECATED: Write a string to the default output"""
3620 3621 warn('InteractiveShell.write() is deprecated, use sys.stdout instead',
3621 3622 DeprecationWarning, stacklevel=2)
3622 3623 sys.stdout.write(data)
3623 3624
3624 3625 @undoc
3625 3626 def write_err(self,data):
3626 3627 """DEPRECATED: Write a string to the default error output"""
3627 3628 warn('InteractiveShell.write_err() is deprecated, use sys.stderr instead',
3628 3629 DeprecationWarning, stacklevel=2)
3629 3630 sys.stderr.write(data)
3630 3631
3631 3632 def ask_yes_no(self, prompt, default=None, interrupt=None):
3632 3633 if self.quiet:
3633 3634 return True
3634 3635 return ask_yes_no(prompt,default,interrupt)
3635 3636
3636 3637 def show_usage(self):
3637 3638 """Show a usage message"""
3638 3639 page.page(IPython.core.usage.interactive_usage)
3639 3640
3640 3641 def extract_input_lines(self, range_str, raw=False):
3641 3642 """Return as a string a set of input history slices.
3642 3643
3643 3644 Parameters
3644 3645 ----------
3645 3646 range_str : string
3646 3647 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
3647 3648 since this function is for use by magic functions which get their
3648 3649 arguments as strings. The number before the / is the session
3649 3650 number: ~n goes n back from the current session.
3650 3651
3651 3652 raw : bool, optional
3652 3653 By default, the processed input is used. If this is true, the raw
3653 3654 input history is used instead.
3654 3655
3655 3656 Notes
3656 3657 -----
3657 3658
3658 3659 Slices can be described with two notations:
3659 3660
3660 3661 * ``N:M`` -> standard python form, means including items N...(M-1).
3661 3662 * ``N-M`` -> include items N..M (closed endpoint).
3662 3663 """
3663 3664 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3664 3665 return "\n".join(x for _, _, x in lines)
3665 3666
3666 3667 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True, search_ns=False):
3667 3668 """Get a code string from history, file, url, or a string or macro.
3668 3669
3669 3670 This is mainly used by magic functions.
3670 3671
3671 3672 Parameters
3672 3673 ----------
3673 3674
3674 3675 target : str
3675 3676
3676 3677 A string specifying code to retrieve. This will be tried respectively
3677 3678 as: ranges of input history (see %history for syntax), url,
3678 3679 corresponding .py file, filename, or an expression evaluating to a
3679 3680 string or Macro in the user namespace.
3680 3681
3681 3682 raw : bool
3682 3683 If true (default), retrieve raw history. Has no effect on the other
3683 3684 retrieval mechanisms.
3684 3685
3685 3686 py_only : bool (default False)
3686 3687 Only try to fetch python code, do not try alternative methods to decode file
3687 3688 if unicode fails.
3688 3689
3689 3690 Returns
3690 3691 -------
3691 3692 A string of code.
3692 3693
3693 3694 ValueError is raised if nothing is found, and TypeError if it evaluates
3694 3695 to an object of another type. In each case, .args[0] is a printable
3695 3696 message.
3696 3697 """
3697 3698 code = self.extract_input_lines(target, raw=raw) # Grab history
3698 3699 if code:
3699 3700 return code
3700 3701 try:
3701 3702 if target.startswith(('http://', 'https://')):
3702 3703 return openpy.read_py_url(target, skip_encoding_cookie=skip_encoding_cookie)
3703 3704 except UnicodeDecodeError:
3704 3705 if not py_only :
3705 3706 # Deferred import
3706 3707 from urllib.request import urlopen
3707 3708 response = urlopen(target)
3708 3709 return response.read().decode('latin1')
3709 3710 raise ValueError(("'%s' seem to be unreadable.") % target)
3710 3711
3711 3712 potential_target = [target]
3712 3713 try :
3713 3714 potential_target.insert(0,get_py_filename(target))
3714 3715 except IOError:
3715 3716 pass
3716 3717
3717 3718 for tgt in potential_target :
3718 3719 if os.path.isfile(tgt): # Read file
3719 3720 try :
3720 3721 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3721 3722 except UnicodeDecodeError :
3722 3723 if not py_only :
3723 3724 with io_open(tgt,'r', encoding='latin1') as f :
3724 3725 return f.read()
3725 3726 raise ValueError(("'%s' seem to be unreadable.") % target)
3726 3727 elif os.path.isdir(os.path.expanduser(tgt)):
3727 3728 raise ValueError("'%s' is a directory, not a regular file." % target)
3728 3729
3729 3730 if search_ns:
3730 3731 # Inspect namespace to load object source
3731 3732 object_info = self.object_inspect(target, detail_level=1)
3732 3733 if object_info['found'] and object_info['source']:
3733 3734 return object_info['source']
3734 3735
3735 3736 try: # User namespace
3736 3737 codeobj = eval(target, self.user_ns)
3737 3738 except Exception:
3738 3739 raise ValueError(("'%s' was not found in history, as a file, url, "
3739 3740 "nor in the user namespace.") % target)
3740 3741
3741 3742 if isinstance(codeobj, str):
3742 3743 return codeobj
3743 3744 elif isinstance(codeobj, Macro):
3744 3745 return codeobj.value
3745 3746
3746 3747 raise TypeError("%s is neither a string nor a macro." % target,
3747 3748 codeobj)
3748 3749
3749 3750 #-------------------------------------------------------------------------
3750 3751 # Things related to IPython exiting
3751 3752 #-------------------------------------------------------------------------
3752 3753 def atexit_operations(self):
3753 3754 """This will be executed at the time of exit.
3754 3755
3755 3756 Cleanup operations and saving of persistent data that is done
3756 3757 unconditionally by IPython should be performed here.
3757 3758
3758 3759 For things that may depend on startup flags or platform specifics (such
3759 3760 as having readline or not), register a separate atexit function in the
3760 3761 code that has the appropriate information, rather than trying to
3761 3762 clutter
3762 3763 """
3763 3764 # Close the history session (this stores the end time and line count)
3764 3765 # this must be *before* the tempfile cleanup, in case of temporary
3765 3766 # history db
3766 3767 self.history_manager.end_session()
3767 3768
3768 3769 # Cleanup all tempfiles and folders left around
3769 3770 for tfile in self.tempfiles:
3770 3771 try:
3771 3772 os.unlink(tfile)
3772 3773 except OSError:
3773 3774 pass
3774 3775
3775 3776 for tdir in self.tempdirs:
3776 3777 try:
3777 3778 os.rmdir(tdir)
3778 3779 except OSError:
3779 3780 pass
3780 3781
3781 3782 # Clear all user namespaces to release all references cleanly.
3782 3783 self.reset(new_session=False)
3783 3784
3784 3785 # Run user hooks
3785 3786 self.hooks.shutdown_hook()
3786 3787
3787 3788 def cleanup(self):
3788 3789 self.restore_sys_module_state()
3789 3790
3790 3791
3791 3792 # Overridden in terminal subclass to change prompts
3792 3793 def switch_doctest_mode(self, mode):
3793 3794 pass
3794 3795
3795 3796
3796 3797 class InteractiveShellABC(metaclass=abc.ABCMeta):
3797 3798 """An abstract base class for InteractiveShell."""
3798 3799
3799 3800 InteractiveShellABC.register(InteractiveShell)
General Comments 0
You need to be logged in to leave comments. Login now