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