##// END OF EJS Templates
Merge pull request #12660 from meeseeksmachine/auto-backport-of-pr-12631-on-7.x...
Matthias Bussonnier -
r26155:5476d31c merge
parent child Browse files
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):
223 except (TypeError, ValueError):
224 raise ValueError("Context must be a positive integer")
224 raise ValueError("Context must be a positive integer")
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 wether it should be skipped.
298 Given an index in the stack return wether 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):
350 except (TypeError, ValueError):
344 raise ValueError("Context must be a positive integer")
351 raise ValueError("Context must be a positive integer")
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):
379 except (TypeError, ValueError):
373 raise ValueError("Context must be a positive integer")
380 raise ValueError("Context must be a positive integer")
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 try:
398 try:
392 import reprlib # Py 3
399 import reprlib # Py 3
393 except ImportError:
400 except ImportError:
394 import repr as reprlib # Py 2
401 import repr as reprlib # Py 2
395
402
396 ret = []
403 ret = []
397
404
398 Colors = self.color_scheme_table.active_colors
405 Colors = self.color_scheme_table.active_colors
399 ColorsNormal = Colors.Normal
406 ColorsNormal = Colors.Normal
400 tpl_link = u'%s%%s%s' % (Colors.filenameEm, ColorsNormal)
407 tpl_link = u'%s%%s%s' % (Colors.filenameEm, ColorsNormal)
401 tpl_call = u'%s%%s%s%%s%s' % (Colors.vName, Colors.valEm, ColorsNormal)
408 tpl_call = u'%s%%s%s%%s%s' % (Colors.vName, Colors.valEm, ColorsNormal)
402 tpl_line = u'%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
409 tpl_line = u'%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
403 tpl_line_em = u'%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line,
410 tpl_line_em = u'%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line,
404 ColorsNormal)
411 ColorsNormal)
405
412
406 frame, lineno = frame_lineno
413 frame, lineno = frame_lineno
407
414
408 return_value = ''
415 return_value = ''
409 if '__return__' in frame.f_locals:
416 if '__return__' in frame.f_locals:
410 rv = frame.f_locals['__return__']
417 rv = frame.f_locals['__return__']
411 #return_value += '->'
418 #return_value += '->'
412 return_value += reprlib.repr(rv) + '\n'
419 return_value += reprlib.repr(rv) + '\n'
413 ret.append(return_value)
420 ret.append(return_value)
414
421
415 #s = filename + '(' + `lineno` + ')'
422 #s = filename + '(' + `lineno` + ')'
416 filename = self.canonic(frame.f_code.co_filename)
423 filename = self.canonic(frame.f_code.co_filename)
417 link = tpl_link % py3compat.cast_unicode(filename)
424 link = tpl_link % py3compat.cast_unicode(filename)
418
425
419 if frame.f_code.co_name:
426 if frame.f_code.co_name:
420 func = frame.f_code.co_name
427 func = frame.f_code.co_name
421 else:
428 else:
422 func = "<lambda>"
429 func = "<lambda>"
423
430
424 call = ''
431 call = ''
425 if func != '?':
432 if func != '?':
426 if '__args__' in frame.f_locals:
433 if '__args__' in frame.f_locals:
427 args = reprlib.repr(frame.f_locals['__args__'])
434 args = reprlib.repr(frame.f_locals['__args__'])
428 else:
435 else:
429 args = '()'
436 args = '()'
430 call = tpl_call % (func, args)
437 call = tpl_call % (func, args)
431
438
432 # The level info should be generated in the same format pdb uses, to
439 # The level info should be generated in the same format pdb uses, to
433 # avoid breaking the pdbtrack functionality of python-mode in *emacs.
440 # avoid breaking the pdbtrack functionality of python-mode in *emacs.
434 if frame is self.curframe:
441 if frame is self.curframe:
435 ret.append('> ')
442 ret.append('> ')
436 else:
443 else:
437 ret.append(' ')
444 ret.append(' ')
438 ret.append(u'%s(%s)%s\n' % (link,lineno,call))
445 ret.append(u'%s(%s)%s\n' % (link,lineno,call))
439
446
440 start = lineno - 1 - context//2
447 start = lineno - 1 - context//2
441 lines = linecache.getlines(filename)
448 lines = linecache.getlines(filename)
442 start = min(start, len(lines) - context)
449 start = min(start, len(lines) - context)
443 start = max(start, 0)
450 start = max(start, 0)
444 lines = lines[start : start + context]
451 lines = lines[start : start + context]
445
452
446 for i,line in enumerate(lines):
453 for i,line in enumerate(lines):
447 show_arrow = (start + 1 + i == lineno)
454 show_arrow = (start + 1 + i == lineno)
448 linetpl = (frame is self.curframe or show_arrow) \
455 linetpl = (frame is self.curframe or show_arrow) \
449 and tpl_line_em \
456 and tpl_line_em \
450 or tpl_line
457 or tpl_line
451 ret.append(self.__format_line(linetpl, filename,
458 ret.append(self.__format_line(linetpl, filename,
452 start + 1 + i, line,
459 start + 1 + i, line,
453 arrow = show_arrow) )
460 arrow = show_arrow) )
454 return ''.join(ret)
461 return ''.join(ret)
455
462
456 def __format_line(self, tpl_line, filename, lineno, line, arrow = False):
463 def __format_line(self, tpl_line, filename, lineno, line, arrow = False):
457 bp_mark = ""
464 bp_mark = ""
458 bp_mark_color = ""
465 bp_mark_color = ""
459
466
460 new_line, err = self.parser.format2(line, 'str')
467 new_line, err = self.parser.format2(line, 'str')
461 if not err:
468 if not err:
462 line = new_line
469 line = new_line
463
470
464 bp = None
471 bp = None
465 if lineno in self.get_file_breaks(filename):
472 if lineno in self.get_file_breaks(filename):
466 bps = self.get_breaks(filename, lineno)
473 bps = self.get_breaks(filename, lineno)
467 bp = bps[-1]
474 bp = bps[-1]
468
475
469 if bp:
476 if bp:
470 Colors = self.color_scheme_table.active_colors
477 Colors = self.color_scheme_table.active_colors
471 bp_mark = str(bp.number)
478 bp_mark = str(bp.number)
472 bp_mark_color = Colors.breakpoint_enabled
479 bp_mark_color = Colors.breakpoint_enabled
473 if not bp.enabled:
480 if not bp.enabled:
474 bp_mark_color = Colors.breakpoint_disabled
481 bp_mark_color = Colors.breakpoint_disabled
475
482
476 numbers_width = 7
483 numbers_width = 7
477 if arrow:
484 if arrow:
478 # This is the line with the error
485 # This is the line with the error
479 pad = numbers_width - len(str(lineno)) - len(bp_mark)
486 pad = numbers_width - len(str(lineno)) - len(bp_mark)
480 num = '%s%s' % (make_arrow(pad), str(lineno))
487 num = '%s%s' % (make_arrow(pad), str(lineno))
481 else:
488 else:
482 num = '%*s' % (numbers_width - len(bp_mark), str(lineno))
489 num = '%*s' % (numbers_width - len(bp_mark), str(lineno))
483
490
484 return tpl_line % (bp_mark_color + bp_mark, num, line)
491 return tpl_line % (bp_mark_color + bp_mark, num, line)
485
492
486
493
487 def print_list_lines(self, filename, first, last):
494 def print_list_lines(self, filename, first, last):
488 """The printing (as opposed to the parsing part of a 'list'
495 """The printing (as opposed to the parsing part of a 'list'
489 command."""
496 command."""
490 try:
497 try:
491 Colors = self.color_scheme_table.active_colors
498 Colors = self.color_scheme_table.active_colors
492 ColorsNormal = Colors.Normal
499 ColorsNormal = Colors.Normal
493 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
500 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
494 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal)
501 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal)
495 src = []
502 src = []
496 if filename == "<string>" and hasattr(self, "_exec_filename"):
503 if filename == "<string>" and hasattr(self, "_exec_filename"):
497 filename = self._exec_filename
504 filename = self._exec_filename
498
505
499 for lineno in range(first, last+1):
506 for lineno in range(first, last+1):
500 line = linecache.getline(filename, lineno)
507 line = linecache.getline(filename, lineno)
501 if not line:
508 if not line:
502 break
509 break
503
510
504 if lineno == self.curframe.f_lineno:
511 if lineno == self.curframe.f_lineno:
505 line = self.__format_line(tpl_line_em, filename, lineno, line, arrow = True)
512 line = self.__format_line(tpl_line_em, filename, lineno, line, arrow = True)
506 else:
513 else:
507 line = self.__format_line(tpl_line, filename, lineno, line, arrow = False)
514 line = self.__format_line(tpl_line, filename, lineno, line, arrow = False)
508
515
509 src.append(line)
516 src.append(line)
510 self.lineno = lineno
517 self.lineno = lineno
511
518
512 print(''.join(src), file=self.stdout)
519 print(''.join(src), file=self.stdout)
513
520
514 except KeyboardInterrupt:
521 except KeyboardInterrupt:
515 pass
522 pass
516
523
517 def do_skip_hidden(self, arg):
524 def do_skip_hidden(self, arg):
518 """
525 """
519 Change whether or not we should skip frames with the
526 Change whether or not we should skip frames with the
520 __tracebackhide__ attribute.
527 __tracebackhide__ attribute.
521 """
528 """
522 if arg.strip().lower() in ("true", "yes"):
529 if arg.strip().lower() in ("true", "yes"):
523 self.skip_hidden = True
530 self.skip_hidden = True
524 elif arg.strip().lower() in ("false", "no"):
531 elif arg.strip().lower() in ("false", "no"):
525 self.skip_hidden = False
532 self.skip_hidden = False
526
533
527 def do_list(self, arg):
534 def do_list(self, arg):
528 """Print lines of code from the current stack frame
535 """Print lines of code from the current stack frame
529 """
536 """
530 self.lastcmd = 'list'
537 self.lastcmd = 'list'
531 last = None
538 last = None
532 if arg:
539 if arg:
533 try:
540 try:
534 x = eval(arg, {}, {})
541 x = eval(arg, {}, {})
535 if type(x) == type(()):
542 if type(x) == type(()):
536 first, last = x
543 first, last = x
537 first = int(first)
544 first = int(first)
538 last = int(last)
545 last = int(last)
539 if last < first:
546 if last < first:
540 # Assume it's a count
547 # Assume it's a count
541 last = first + last
548 last = first + last
542 else:
549 else:
543 first = max(1, int(x) - 5)
550 first = max(1, int(x) - 5)
544 except:
551 except:
545 print('*** Error in argument:', repr(arg), file=self.stdout)
552 print('*** Error in argument:', repr(arg), file=self.stdout)
546 return
553 return
547 elif self.lineno is None:
554 elif self.lineno is None:
548 first = max(1, self.curframe.f_lineno - 5)
555 first = max(1, self.curframe.f_lineno - 5)
549 else:
556 else:
550 first = self.lineno + 1
557 first = self.lineno + 1
551 if last is None:
558 if last is None:
552 last = first + 10
559 last = first + 10
553 self.print_list_lines(self.curframe.f_code.co_filename, first, last)
560 self.print_list_lines(self.curframe.f_code.co_filename, first, last)
554
561
555 # vds: >>
562 # vds: >>
556 lineno = first
563 lineno = first
557 filename = self.curframe.f_code.co_filename
564 filename = self.curframe.f_code.co_filename
558 self.shell.hooks.synchronize_with_editor(filename, lineno, 0)
565 self.shell.hooks.synchronize_with_editor(filename, lineno, 0)
559 # vds: <<
566 # vds: <<
560
567
561 do_l = do_list
568 do_l = do_list
562
569
563 def getsourcelines(self, obj):
570 def getsourcelines(self, obj):
564 lines, lineno = inspect.findsource(obj)
571 lines, lineno = inspect.findsource(obj)
565 if inspect.isframe(obj) and obj.f_globals is obj.f_locals:
572 if inspect.isframe(obj) and obj.f_globals is obj.f_locals:
566 # must be a module frame: do not try to cut a block out of it
573 # must be a module frame: do not try to cut a block out of it
567 return lines, 1
574 return lines, 1
568 elif inspect.ismodule(obj):
575 elif inspect.ismodule(obj):
569 return lines, 1
576 return lines, 1
570 return inspect.getblock(lines[lineno:]), lineno+1
577 return inspect.getblock(lines[lineno:]), lineno+1
571
578
572 def do_longlist(self, arg):
579 def do_longlist(self, arg):
573 """Print lines of code from the current stack frame.
580 """Print lines of code from the current stack frame.
574
581
575 Shows more lines than 'list' does.
582 Shows more lines than 'list' does.
576 """
583 """
577 self.lastcmd = 'longlist'
584 self.lastcmd = 'longlist'
578 try:
585 try:
579 lines, lineno = self.getsourcelines(self.curframe)
586 lines, lineno = self.getsourcelines(self.curframe)
580 except OSError as err:
587 except OSError as err:
581 self.error(err)
588 self.error(err)
582 return
589 return
583 last = lineno + len(lines)
590 last = lineno + len(lines)
584 self.print_list_lines(self.curframe.f_code.co_filename, lineno, last)
591 self.print_list_lines(self.curframe.f_code.co_filename, lineno, last)
585 do_ll = do_longlist
592 do_ll = do_longlist
586
593
587 def do_debug(self, arg):
594 def do_debug(self, arg):
588 """debug code
595 """debug code
589 Enter a recursive debugger that steps through the code
596 Enter a recursive debugger that steps through the code
590 argument (which is an arbitrary expression or statement to be
597 argument (which is an arbitrary expression or statement to be
591 executed in the current environment).
598 executed in the current environment).
592 """
599 """
593 sys.settrace(None)
600 sys.settrace(None)
594 globals = self.curframe.f_globals
601 globals = self.curframe.f_globals
595 locals = self.curframe_locals
602 locals = self.curframe_locals
596 p = self.__class__(completekey=self.completekey,
603 p = self.__class__(completekey=self.completekey,
597 stdin=self.stdin, stdout=self.stdout)
604 stdin=self.stdin, stdout=self.stdout)
598 p.use_rawinput = self.use_rawinput
605 p.use_rawinput = self.use_rawinput
599 p.prompt = "(%s) " % self.prompt.strip()
606 p.prompt = "(%s) " % self.prompt.strip()
600 self.message("ENTERING RECURSIVE DEBUGGER")
607 self.message("ENTERING RECURSIVE DEBUGGER")
601 sys.call_tracing(p.run, (arg, globals, locals))
608 sys.call_tracing(p.run, (arg, globals, locals))
602 self.message("LEAVING RECURSIVE DEBUGGER")
609 self.message("LEAVING RECURSIVE DEBUGGER")
603 sys.settrace(self.trace_dispatch)
610 sys.settrace(self.trace_dispatch)
604 self.lastcmd = p.lastcmd
611 self.lastcmd = p.lastcmd
605
612
606 def do_pdef(self, arg):
613 def do_pdef(self, arg):
607 """Print the call signature for any callable object.
614 """Print the call signature for any callable object.
608
615
609 The debugger interface to %pdef"""
616 The debugger interface to %pdef"""
610 namespaces = [('Locals', self.curframe.f_locals),
617 namespaces = [('Locals', self.curframe.f_locals),
611 ('Globals', self.curframe.f_globals)]
618 ('Globals', self.curframe.f_globals)]
612 self.shell.find_line_magic('pdef')(arg, namespaces=namespaces)
619 self.shell.find_line_magic('pdef')(arg, namespaces=namespaces)
613
620
614 def do_pdoc(self, arg):
621 def do_pdoc(self, arg):
615 """Print the docstring for an object.
622 """Print the docstring for an object.
616
623
617 The debugger interface to %pdoc."""
624 The debugger interface to %pdoc."""
618 namespaces = [('Locals', self.curframe.f_locals),
625 namespaces = [('Locals', self.curframe.f_locals),
619 ('Globals', self.curframe.f_globals)]
626 ('Globals', self.curframe.f_globals)]
620 self.shell.find_line_magic('pdoc')(arg, namespaces=namespaces)
627 self.shell.find_line_magic('pdoc')(arg, namespaces=namespaces)
621
628
622 def do_pfile(self, arg):
629 def do_pfile(self, arg):
623 """Print (or run through pager) the file where an object is defined.
630 """Print (or run through pager) the file where an object is defined.
624
631
625 The debugger interface to %pfile.
632 The debugger interface to %pfile.
626 """
633 """
627 namespaces = [('Locals', self.curframe.f_locals),
634 namespaces = [('Locals', self.curframe.f_locals),
628 ('Globals', self.curframe.f_globals)]
635 ('Globals', self.curframe.f_globals)]
629 self.shell.find_line_magic('pfile')(arg, namespaces=namespaces)
636 self.shell.find_line_magic('pfile')(arg, namespaces=namespaces)
630
637
631 def do_pinfo(self, arg):
638 def do_pinfo(self, arg):
632 """Provide detailed information about an object.
639 """Provide detailed information about an object.
633
640
634 The debugger interface to %pinfo, i.e., obj?."""
641 The debugger interface to %pinfo, i.e., obj?."""
635 namespaces = [('Locals', self.curframe.f_locals),
642 namespaces = [('Locals', self.curframe.f_locals),
636 ('Globals', self.curframe.f_globals)]
643 ('Globals', self.curframe.f_globals)]
637 self.shell.find_line_magic('pinfo')(arg, namespaces=namespaces)
644 self.shell.find_line_magic('pinfo')(arg, namespaces=namespaces)
638
645
639 def do_pinfo2(self, arg):
646 def do_pinfo2(self, arg):
640 """Provide extra detailed information about an object.
647 """Provide extra detailed information about an object.
641
648
642 The debugger interface to %pinfo2, i.e., obj??."""
649 The debugger interface to %pinfo2, i.e., obj??."""
643 namespaces = [('Locals', self.curframe.f_locals),
650 namespaces = [('Locals', self.curframe.f_locals),
644 ('Globals', self.curframe.f_globals)]
651 ('Globals', self.curframe.f_globals)]
645 self.shell.find_line_magic('pinfo2')(arg, namespaces=namespaces)
652 self.shell.find_line_magic('pinfo2')(arg, namespaces=namespaces)
646
653
647 def do_psource(self, arg):
654 def do_psource(self, arg):
648 """Print (or run through pager) the source code for an object."""
655 """Print (or run through pager) the source code for an object."""
649 namespaces = [('Locals', self.curframe.f_locals),
656 namespaces = [('Locals', self.curframe.f_locals),
650 ('Globals', self.curframe.f_globals)]
657 ('Globals', self.curframe.f_globals)]
651 self.shell.find_line_magic('psource')(arg, namespaces=namespaces)
658 self.shell.find_line_magic('psource')(arg, namespaces=namespaces)
652
659
653 def do_where(self, arg):
660 def do_where(self, arg):
654 """w(here)
661 """w(here)
655 Print a stack trace, with the most recent frame at the bottom.
662 Print a stack trace, with the most recent frame at the bottom.
656 An arrow indicates the "current frame", which determines the
663 An arrow indicates the "current frame", which determines the
657 context of most commands. 'bt' is an alias for this command.
664 context of most commands. 'bt' is an alias for this command.
658
665
659 Take a number as argument as an (optional) number of context line to
666 Take a number as argument as an (optional) number of context line to
660 print"""
667 print"""
661 if arg:
668 if arg:
662 try:
669 try:
663 context = int(arg)
670 context = int(arg)
664 except ValueError as err:
671 except ValueError as err:
665 self.error(err)
672 self.error(err)
666 return
673 return
667 self.print_stack_trace(context)
674 self.print_stack_trace(context)
668 else:
675 else:
669 self.print_stack_trace()
676 self.print_stack_trace()
670
677
671 do_w = do_where
678 do_w = do_where
672
679
673 def stop_here(self, frame):
680 def stop_here(self, frame):
674 """Check if pdb should stop here"""
681 """Check if pdb should stop here"""
675 if not super().stop_here(frame):
682 if not super().stop_here(frame):
676 return False
683 return False
677 if self.skip_hidden and frame.f_locals.get("__tracebackhide__", False):
684 if self.skip_hidden and frame.f_locals.get("__tracebackhide__", False):
678 if self._wait_for_mainpyfile:
685 if self._wait_for_mainpyfile:
679 return False
686 return False
680 Colors = self.color_scheme_table.active_colors
687 Colors = self.color_scheme_table.active_colors
681 ColorsNormal = Colors.Normal
688 ColorsNormal = Colors.Normal
682 print(f"{Colors.excName} [... skipped 1 hidden frame]{ColorsNormal}\n")
689 print(f"{Colors.excName} [... skipped 1 hidden frame]{ColorsNormal}\n")
683 return False
690 return False
684 return True
691 return True
685
692
686 def do_up(self, arg):
693 def do_up(self, arg):
687 """u(p) [count]
694 """u(p) [count]
688 Move the current frame count (default one) levels up in the
695 Move the current frame count (default one) levels up in the
689 stack trace (to an older frame).
696 stack trace (to an older frame).
690
697
691 Will skip hidden frames.
698 Will skip hidden frames.
692 """
699 """
693 ## modified version of upstream that skips
700 ## modified version of upstream that skips
694 # frames with __tracebackide__
701 # frames with __tracebackide__
695 if self.curindex == 0:
702 if self.curindex == 0:
696 self.error("Oldest frame")
703 self.error("Oldest frame")
697 return
704 return
698 try:
705 try:
699 count = int(arg or 1)
706 count = int(arg or 1)
700 except ValueError:
707 except ValueError:
701 self.error("Invalid frame count (%s)" % arg)
708 self.error("Invalid frame count (%s)" % arg)
702 return
709 return
703 skipped = 0
710 skipped = 0
704 if count < 0:
711 if count < 0:
705 _newframe = 0
712 _newframe = 0
706 else:
713 else:
707 _newindex = self.curindex
714 _newindex = self.curindex
708 counter = 0
715 counter = 0
709 hidden_frames = self.hidden_frames(self.stack)
716 hidden_frames = self.hidden_frames(self.stack)
710 for i in range(self.curindex - 1, -1, -1):
717 for i in range(self.curindex - 1, -1, -1):
711 frame = self.stack[i][0]
718 frame = self.stack[i][0]
712 if hidden_frames[i] and self.skip_hidden:
719 if hidden_frames[i] and self.skip_hidden:
713 skipped += 1
720 skipped += 1
714 continue
721 continue
715 counter += 1
722 counter += 1
716 if counter >= count:
723 if counter >= count:
717 break
724 break
718 else:
725 else:
719 # if no break occured.
726 # if no break occured.
720 self.error("all frames above hidden")
727 self.error("all frames above hidden")
721 return
728 return
722
729
723 Colors = self.color_scheme_table.active_colors
730 Colors = self.color_scheme_table.active_colors
724 ColorsNormal = Colors.Normal
731 ColorsNormal = Colors.Normal
725 _newframe = i
732 _newframe = i
726 self._select_frame(_newframe)
733 self._select_frame(_newframe)
727 if skipped:
734 if skipped:
728 print(
735 print(
729 f"{Colors.excName} [... skipped {skipped} hidden frame(s)]{ColorsNormal}\n"
736 f"{Colors.excName} [... skipped {skipped} hidden frame(s)]{ColorsNormal}\n"
730 )
737 )
731
738
732 def do_down(self, arg):
739 def do_down(self, arg):
733 """d(own) [count]
740 """d(own) [count]
734 Move the current frame count (default one) levels down in the
741 Move the current frame count (default one) levels down in the
735 stack trace (to a newer frame).
742 stack trace (to a newer frame).
736
743
737 Will skip hidden frames.
744 Will skip hidden frames.
738 """
745 """
739 if self.curindex + 1 == len(self.stack):
746 if self.curindex + 1 == len(self.stack):
740 self.error("Newest frame")
747 self.error("Newest frame")
741 return
748 return
742 try:
749 try:
743 count = int(arg or 1)
750 count = int(arg or 1)
744 except ValueError:
751 except ValueError:
745 self.error("Invalid frame count (%s)" % arg)
752 self.error("Invalid frame count (%s)" % arg)
746 return
753 return
747 if count < 0:
754 if count < 0:
748 _newframe = len(self.stack) - 1
755 _newframe = len(self.stack) - 1
749 else:
756 else:
750 _newindex = self.curindex
757 _newindex = self.curindex
751 counter = 0
758 counter = 0
752 skipped = 0
759 skipped = 0
753 hidden_frames = self.hidden_frames(self.stack)
760 hidden_frames = self.hidden_frames(self.stack)
754 for i in range(self.curindex + 1, len(self.stack)):
761 for i in range(self.curindex + 1, len(self.stack)):
755 frame = self.stack[i][0]
762 frame = self.stack[i][0]
756 if hidden_frames[i] and self.skip_hidden:
763 if hidden_frames[i] and self.skip_hidden:
757 skipped += 1
764 skipped += 1
758 continue
765 continue
759 counter += 1
766 counter += 1
760 if counter >= count:
767 if counter >= count:
761 break
768 break
762 else:
769 else:
763 self.error("all frames bellow hidden")
770 self.error("all frames bellow hidden")
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,3799 +1,3800 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 pickleshare import PickleShareDB
31 from pickleshare import PickleShareDB
32
32
33 from traitlets.config.configurable import SingletonConfigurable
33 from traitlets.config.configurable import SingletonConfigurable
34 from traitlets.utils.importstring import import_item
34 from traitlets.utils.importstring import import_item
35 from IPython.core import oinspect
35 from IPython.core import oinspect
36 from IPython.core import magic
36 from IPython.core import magic
37 from IPython.core import page
37 from IPython.core import page
38 from IPython.core import prefilter
38 from IPython.core import prefilter
39 from IPython.core import ultratb
39 from IPython.core import ultratb
40 from IPython.core.alias import Alias, AliasManager
40 from IPython.core.alias import Alias, AliasManager
41 from IPython.core.autocall import ExitAutocall
41 from IPython.core.autocall import ExitAutocall
42 from IPython.core.builtin_trap import BuiltinTrap
42 from IPython.core.builtin_trap import BuiltinTrap
43 from IPython.core.events import EventManager, available_events
43 from IPython.core.events import EventManager, available_events
44 from IPython.core.compilerop import CachingCompiler, check_linecache_ipython
44 from IPython.core.compilerop import CachingCompiler, check_linecache_ipython
45 from IPython.core.debugger import Pdb
45 from IPython.core.debugger import Pdb
46 from IPython.core.display_trap import DisplayTrap
46 from IPython.core.display_trap import DisplayTrap
47 from IPython.core.displayhook import DisplayHook
47 from IPython.core.displayhook import DisplayHook
48 from IPython.core.displaypub import DisplayPublisher
48 from IPython.core.displaypub import DisplayPublisher
49 from IPython.core.error import InputRejected, UsageError
49 from IPython.core.error import InputRejected, UsageError
50 from IPython.core.extensions import ExtensionManager
50 from IPython.core.extensions import ExtensionManager
51 from IPython.core.formatters import DisplayFormatter
51 from IPython.core.formatters import DisplayFormatter
52 from IPython.core.history import HistoryManager
52 from IPython.core.history import HistoryManager
53 from IPython.core.inputtransformer2 import ESC_MAGIC, ESC_MAGIC2
53 from IPython.core.inputtransformer2 import ESC_MAGIC, ESC_MAGIC2
54 from IPython.core.logger import Logger
54 from IPython.core.logger import Logger
55 from IPython.core.macro import Macro
55 from IPython.core.macro import Macro
56 from IPython.core.payload import PayloadManager
56 from IPython.core.payload import PayloadManager
57 from IPython.core.prefilter import PrefilterManager
57 from IPython.core.prefilter import PrefilterManager
58 from IPython.core.profiledir import ProfileDir
58 from IPython.core.profiledir import ProfileDir
59 from IPython.core.usage import default_banner
59 from IPython.core.usage import default_banner
60 from IPython.display import display
60 from IPython.display import display
61 from IPython.testing.skipdoctest import skip_doctest
61 from IPython.testing.skipdoctest import skip_doctest
62 from IPython.utils import PyColorize
62 from IPython.utils import PyColorize
63 from IPython.utils import io
63 from IPython.utils import io
64 from IPython.utils import py3compat
64 from IPython.utils import py3compat
65 from IPython.utils import openpy
65 from IPython.utils import openpy
66 from IPython.utils.decorators import undoc
66 from IPython.utils.decorators import undoc
67 from IPython.utils.io import ask_yes_no
67 from IPython.utils.io import ask_yes_no
68 from IPython.utils.ipstruct import Struct
68 from IPython.utils.ipstruct import Struct
69 from IPython.paths import get_ipython_dir
69 from IPython.paths import get_ipython_dir
70 from IPython.utils.path import get_home_dir, get_py_filename, ensure_dir_exists
70 from IPython.utils.path import get_home_dir, get_py_filename, ensure_dir_exists
71 from IPython.utils.process import system, getoutput
71 from IPython.utils.process import system, getoutput
72 from IPython.utils.strdispatch import StrDispatch
72 from IPython.utils.strdispatch import StrDispatch
73 from IPython.utils.syspathcontext import prepended_to_syspath
73 from IPython.utils.syspathcontext import prepended_to_syspath
74 from IPython.utils.text import format_screen, LSString, SList, DollarFormatter
74 from IPython.utils.text import format_screen, LSString, SList, DollarFormatter
75 from IPython.utils.tempdir import TemporaryDirectory
75 from IPython.utils.tempdir import TemporaryDirectory
76 from traitlets import (
76 from traitlets import (
77 Integer, Bool, CaselessStrEnum, Enum, List, Dict, Unicode, Instance, Type,
77 Integer, Bool, CaselessStrEnum, Enum, List, Dict, Unicode, Instance, Type,
78 observe, default, validate, Any
78 observe, default, validate, Any
79 )
79 )
80 from warnings import warn
80 from warnings import warn
81 from logging import error
81 from logging import error
82 import IPython.core.hooks
82 import IPython.core.hooks
83
83
84 from typing import List as ListType, Tuple, Optional
84 from typing import List as ListType, Tuple, Optional
85 from ast import AST
85 from ast import AST
86
86
87 # NoOpContext is deprecated, but ipykernel imports it from here.
87 # NoOpContext is deprecated, but ipykernel imports it from here.
88 # See https://github.com/ipython/ipykernel/issues/157
88 # See https://github.com/ipython/ipykernel/issues/157
89 # (2016, let's try to remove than in IPython 8.0)
89 # (2016, let's try to remove than in IPython 8.0)
90 from IPython.utils.contexts import NoOpContext
90 from IPython.utils.contexts import NoOpContext
91
91
92 try:
92 try:
93 import docrepr.sphinxify as sphx
93 import docrepr.sphinxify as sphx
94
94
95 def sphinxify(doc):
95 def sphinxify(doc):
96 with TemporaryDirectory() as dirname:
96 with TemporaryDirectory() as dirname:
97 return {
97 return {
98 'text/html': sphx.sphinxify(doc, dirname),
98 'text/html': sphx.sphinxify(doc, dirname),
99 'text/plain': doc
99 'text/plain': doc
100 }
100 }
101 except ImportError:
101 except ImportError:
102 sphinxify = None
102 sphinxify = None
103
103
104
104
105 class ProvisionalWarning(DeprecationWarning):
105 class ProvisionalWarning(DeprecationWarning):
106 """
106 """
107 Warning class for unstable features
107 Warning class for unstable features
108 """
108 """
109 pass
109 pass
110
110
111 if sys.version_info > (3,8):
111 if sys.version_info > (3,8):
112 from ast import Module
112 from ast import Module
113 else :
113 else :
114 # mock the new API, ignore second argument
114 # mock the new API, ignore second argument
115 # see https://github.com/ipython/ipython/issues/11590
115 # see https://github.com/ipython/ipython/issues/11590
116 from ast import Module as OriginalModule
116 from ast import Module as OriginalModule
117 Module = lambda nodelist, type_ignores: OriginalModule(nodelist)
117 Module = lambda nodelist, type_ignores: OriginalModule(nodelist)
118
118
119 if sys.version_info > (3,6):
119 if sys.version_info > (3,6):
120 _assign_nodes = (ast.AugAssign, ast.AnnAssign, ast.Assign)
120 _assign_nodes = (ast.AugAssign, ast.AnnAssign, ast.Assign)
121 _single_targets_nodes = (ast.AugAssign, ast.AnnAssign)
121 _single_targets_nodes = (ast.AugAssign, ast.AnnAssign)
122 else:
122 else:
123 _assign_nodes = (ast.AugAssign, ast.Assign )
123 _assign_nodes = (ast.AugAssign, ast.Assign )
124 _single_targets_nodes = (ast.AugAssign, )
124 _single_targets_nodes = (ast.AugAssign, )
125
125
126 #-----------------------------------------------------------------------------
126 #-----------------------------------------------------------------------------
127 # Await Helpers
127 # Await Helpers
128 #-----------------------------------------------------------------------------
128 #-----------------------------------------------------------------------------
129
129
130 def removed_co_newlocals(function:types.FunctionType) -> types.FunctionType:
130 def removed_co_newlocals(function:types.FunctionType) -> types.FunctionType:
131 """Return a function that do not create a new local scope.
131 """Return a function that do not create a new local scope.
132
132
133 Given a function, create a clone of this function where the co_newlocal flag
133 Given a function, create a clone of this function where the co_newlocal flag
134 has been removed, making this function code actually run in the sourounding
134 has been removed, making this function code actually run in the sourounding
135 scope.
135 scope.
136
136
137 We need this in order to run asynchronous code in user level namespace.
137 We need this in order to run asynchronous code in user level namespace.
138 """
138 """
139 from types import CodeType, FunctionType
139 from types import CodeType, FunctionType
140 CO_NEWLOCALS = 0x0002
140 CO_NEWLOCALS = 0x0002
141 code = function.__code__
141 code = function.__code__
142 new_co_flags = code.co_flags & ~CO_NEWLOCALS
142 new_co_flags = code.co_flags & ~CO_NEWLOCALS
143 if sys.version_info > (3, 8, 0, 'alpha', 3):
143 if sys.version_info > (3, 8, 0, 'alpha', 3):
144 new_code = code.replace(co_flags=new_co_flags)
144 new_code = code.replace(co_flags=new_co_flags)
145 else:
145 else:
146 new_code = CodeType(
146 new_code = CodeType(
147 code.co_argcount,
147 code.co_argcount,
148 code.co_kwonlyargcount,
148 code.co_kwonlyargcount,
149 code.co_nlocals,
149 code.co_nlocals,
150 code.co_stacksize,
150 code.co_stacksize,
151 new_co_flags,
151 new_co_flags,
152 code.co_code,
152 code.co_code,
153 code.co_consts,
153 code.co_consts,
154 code.co_names,
154 code.co_names,
155 code.co_varnames,
155 code.co_varnames,
156 code.co_filename,
156 code.co_filename,
157 code.co_name,
157 code.co_name,
158 code.co_firstlineno,
158 code.co_firstlineno,
159 code.co_lnotab,
159 code.co_lnotab,
160 code.co_freevars,
160 code.co_freevars,
161 code.co_cellvars
161 code.co_cellvars
162 )
162 )
163 return FunctionType(new_code, globals(), function.__name__, function.__defaults__)
163 return FunctionType(new_code, globals(), function.__name__, function.__defaults__)
164
164
165
165
166 # we still need to run things using the asyncio eventloop, but there is no
166 # we still need to run things using the asyncio eventloop, but there is no
167 # async integration
167 # async integration
168 from .async_helpers import (_asyncio_runner, _asyncify, _pseudo_sync_runner)
168 from .async_helpers import (_asyncio_runner, _asyncify, _pseudo_sync_runner)
169 from .async_helpers import _curio_runner, _trio_runner, _should_be_async
169 from .async_helpers import _curio_runner, _trio_runner, _should_be_async
170
170
171
171
172 def _ast_asyncify(cell:str, wrapper_name:str) -> ast.Module:
172 def _ast_asyncify(cell:str, wrapper_name:str) -> ast.Module:
173 """
173 """
174 Parse a cell with top-level await and modify the AST to be able to run it later.
174 Parse a cell with top-level await and modify the AST to be able to run it later.
175
175
176 Parameter
176 Parameter
177 ---------
177 ---------
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 Return
186 Return
187 ------
187 ------
188
188
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 self.tempfiles = []
761 self.tempfiles = []
761 self.tempdirs = []
762 self.tempdirs = []
762
763
763 # keep track of where we started running (mainly for crash post-mortem)
764 # keep track of where we started running (mainly for crash post-mortem)
764 # This is not being used anywhere currently.
765 # This is not being used anywhere currently.
765 self.starting_dir = os.getcwd()
766 self.starting_dir = os.getcwd()
766
767
767 # Indentation management
768 # Indentation management
768 self.indent_current_nsp = 0
769 self.indent_current_nsp = 0
769
770
770 # Dict to track post-execution functions that have been registered
771 # Dict to track post-execution functions that have been registered
771 self._post_execute = {}
772 self._post_execute = {}
772
773
773 def init_environment(self):
774 def init_environment(self):
774 """Any changes we need to make to the user's environment."""
775 """Any changes we need to make to the user's environment."""
775 pass
776 pass
776
777
777 def init_encoding(self):
778 def init_encoding(self):
778 # Get system encoding at startup time. Certain terminals (like Emacs
779 # Get system encoding at startup time. Certain terminals (like Emacs
779 # under Win32 have it set to None, and we need to have a known valid
780 # under Win32 have it set to None, and we need to have a known valid
780 # encoding to use in the raw_input() method
781 # encoding to use in the raw_input() method
781 try:
782 try:
782 self.stdin_encoding = sys.stdin.encoding or 'ascii'
783 self.stdin_encoding = sys.stdin.encoding or 'ascii'
783 except AttributeError:
784 except AttributeError:
784 self.stdin_encoding = 'ascii'
785 self.stdin_encoding = 'ascii'
785
786
786
787
787 @observe('colors')
788 @observe('colors')
788 def init_syntax_highlighting(self, changes=None):
789 def init_syntax_highlighting(self, changes=None):
789 # Python source parser/formatter for syntax highlighting
790 # Python source parser/formatter for syntax highlighting
790 pyformat = PyColorize.Parser(style=self.colors, parent=self).format
791 pyformat = PyColorize.Parser(style=self.colors, parent=self).format
791 self.pycolorize = lambda src: pyformat(src,'str')
792 self.pycolorize = lambda src: pyformat(src,'str')
792
793
793 def refresh_style(self):
794 def refresh_style(self):
794 # No-op here, used in subclass
795 # No-op here, used in subclass
795 pass
796 pass
796
797
797 def init_pushd_popd_magic(self):
798 def init_pushd_popd_magic(self):
798 # for pushd/popd management
799 # for pushd/popd management
799 self.home_dir = get_home_dir()
800 self.home_dir = get_home_dir()
800
801
801 self.dir_stack = []
802 self.dir_stack = []
802
803
803 def init_logger(self):
804 def init_logger(self):
804 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
805 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
805 logmode='rotate')
806 logmode='rotate')
806
807
807 def init_logstart(self):
808 def init_logstart(self):
808 """Initialize logging in case it was requested at the command line.
809 """Initialize logging in case it was requested at the command line.
809 """
810 """
810 if self.logappend:
811 if self.logappend:
811 self.magic('logstart %s append' % self.logappend)
812 self.magic('logstart %s append' % self.logappend)
812 elif self.logfile:
813 elif self.logfile:
813 self.magic('logstart %s' % self.logfile)
814 self.magic('logstart %s' % self.logfile)
814 elif self.logstart:
815 elif self.logstart:
815 self.magic('logstart')
816 self.magic('logstart')
816
817
817 def init_deprecation_warnings(self):
818 def init_deprecation_warnings(self):
818 """
819 """
819 register default filter for deprecation warning.
820 register default filter for deprecation warning.
820
821
821 This will allow deprecation warning of function used interactively to show
822 This will allow deprecation warning of function used interactively to show
822 warning to users, and still hide deprecation warning from libraries import.
823 warning to users, and still hide deprecation warning from libraries import.
823 """
824 """
824 if sys.version_info < (3,7):
825 if sys.version_info < (3,7):
825 warnings.filterwarnings("default", category=DeprecationWarning, module=self.user_ns.get("__name__"))
826 warnings.filterwarnings("default", category=DeprecationWarning, module=self.user_ns.get("__name__"))
826
827
827
828
828 def init_builtins(self):
829 def init_builtins(self):
829 # A single, static flag that we set to True. Its presence indicates
830 # A single, static flag that we set to True. Its presence indicates
830 # that an IPython shell has been created, and we make no attempts at
831 # that an IPython shell has been created, and we make no attempts at
831 # removing on exit or representing the existence of more than one
832 # removing on exit or representing the existence of more than one
832 # IPython at a time.
833 # IPython at a time.
833 builtin_mod.__dict__['__IPYTHON__'] = True
834 builtin_mod.__dict__['__IPYTHON__'] = True
834 builtin_mod.__dict__['display'] = display
835 builtin_mod.__dict__['display'] = display
835
836
836 self.builtin_trap = BuiltinTrap(shell=self)
837 self.builtin_trap = BuiltinTrap(shell=self)
837
838
838 @observe('colors')
839 @observe('colors')
839 def init_inspector(self, changes=None):
840 def init_inspector(self, changes=None):
840 # Object inspector
841 # Object inspector
841 self.inspector = oinspect.Inspector(oinspect.InspectColors,
842 self.inspector = oinspect.Inspector(oinspect.InspectColors,
842 PyColorize.ANSICodeColors,
843 PyColorize.ANSICodeColors,
843 self.colors,
844 self.colors,
844 self.object_info_string_level)
845 self.object_info_string_level)
845
846
846 def init_io(self):
847 def init_io(self):
847 # This will just use sys.stdout and sys.stderr. If you want to
848 # This will just use sys.stdout and sys.stderr. If you want to
848 # override sys.stdout and sys.stderr themselves, you need to do that
849 # override sys.stdout and sys.stderr themselves, you need to do that
849 # *before* instantiating this class, because io holds onto
850 # *before* instantiating this class, because io holds onto
850 # references to the underlying streams.
851 # references to the underlying streams.
851 # io.std* are deprecated, but don't show our own deprecation warnings
852 # io.std* are deprecated, but don't show our own deprecation warnings
852 # during initialization of the deprecated API.
853 # during initialization of the deprecated API.
853 with warnings.catch_warnings():
854 with warnings.catch_warnings():
854 warnings.simplefilter('ignore', DeprecationWarning)
855 warnings.simplefilter('ignore', DeprecationWarning)
855 io.stdout = io.IOStream(sys.stdout)
856 io.stdout = io.IOStream(sys.stdout)
856 io.stderr = io.IOStream(sys.stderr)
857 io.stderr = io.IOStream(sys.stderr)
857
858
858 def init_prompts(self):
859 def init_prompts(self):
859 # Set system prompts, so that scripts can decide if they are running
860 # Set system prompts, so that scripts can decide if they are running
860 # interactively.
861 # interactively.
861 sys.ps1 = 'In : '
862 sys.ps1 = 'In : '
862 sys.ps2 = '...: '
863 sys.ps2 = '...: '
863 sys.ps3 = 'Out: '
864 sys.ps3 = 'Out: '
864
865
865 def init_display_formatter(self):
866 def init_display_formatter(self):
866 self.display_formatter = DisplayFormatter(parent=self)
867 self.display_formatter = DisplayFormatter(parent=self)
867 self.configurables.append(self.display_formatter)
868 self.configurables.append(self.display_formatter)
868
869
869 def init_display_pub(self):
870 def init_display_pub(self):
870 self.display_pub = self.display_pub_class(parent=self, shell=self)
871 self.display_pub = self.display_pub_class(parent=self, shell=self)
871 self.configurables.append(self.display_pub)
872 self.configurables.append(self.display_pub)
872
873
873 def init_data_pub(self):
874 def init_data_pub(self):
874 if not self.data_pub_class:
875 if not self.data_pub_class:
875 self.data_pub = None
876 self.data_pub = None
876 return
877 return
877 self.data_pub = self.data_pub_class(parent=self)
878 self.data_pub = self.data_pub_class(parent=self)
878 self.configurables.append(self.data_pub)
879 self.configurables.append(self.data_pub)
879
880
880 def init_displayhook(self):
881 def init_displayhook(self):
881 # Initialize displayhook, set in/out prompts and printing system
882 # Initialize displayhook, set in/out prompts and printing system
882 self.displayhook = self.displayhook_class(
883 self.displayhook = self.displayhook_class(
883 parent=self,
884 parent=self,
884 shell=self,
885 shell=self,
885 cache_size=self.cache_size,
886 cache_size=self.cache_size,
886 )
887 )
887 self.configurables.append(self.displayhook)
888 self.configurables.append(self.displayhook)
888 # This is a context manager that installs/revmoes the displayhook at
889 # This is a context manager that installs/revmoes the displayhook at
889 # the appropriate time.
890 # the appropriate time.
890 self.display_trap = DisplayTrap(hook=self.displayhook)
891 self.display_trap = DisplayTrap(hook=self.displayhook)
891
892
892 def init_virtualenv(self):
893 def init_virtualenv(self):
893 """Add a virtualenv to sys.path so the user can import modules from it.
894 """Add a virtualenv to sys.path so the user can import modules from it.
894 This isn't perfect: it doesn't use the Python interpreter with which the
895 This isn't perfect: it doesn't use the Python interpreter with which the
895 virtualenv was built, and it ignores the --no-site-packages option. A
896 virtualenv was built, and it ignores the --no-site-packages option. A
896 warning will appear suggesting the user installs IPython in the
897 warning will appear suggesting the user installs IPython in the
897 virtualenv, but for many cases, it probably works well enough.
898 virtualenv, but for many cases, it probably works well enough.
898
899
899 Adapted from code snippets online.
900 Adapted from code snippets online.
900
901
901 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
902 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
902 """
903 """
903 if 'VIRTUAL_ENV' not in os.environ:
904 if 'VIRTUAL_ENV' not in os.environ:
904 # Not in a virtualenv
905 # Not in a virtualenv
905 return
906 return
906
907
907 p = os.path.normcase(sys.executable)
908 p = os.path.normcase(sys.executable)
908 p_venv = os.path.normcase(os.environ['VIRTUAL_ENV'])
909 p_venv = os.path.normcase(os.environ['VIRTUAL_ENV'])
909
910
910 # executable path should end like /bin/python or \\scripts\\python.exe
911 # executable path should end like /bin/python or \\scripts\\python.exe
911 p_exe_up2 = os.path.dirname(os.path.dirname(p))
912 p_exe_up2 = os.path.dirname(os.path.dirname(p))
912 if p_exe_up2 and os.path.exists(p_venv) and os.path.samefile(p_exe_up2, p_venv):
913 if p_exe_up2 and os.path.exists(p_venv) and os.path.samefile(p_exe_up2, p_venv):
913 # Our exe is inside the virtualenv, don't need to do anything.
914 # Our exe is inside the virtualenv, don't need to do anything.
914 return
915 return
915
916
916 # fallback venv detection:
917 # fallback venv detection:
917 # stdlib venv may symlink sys.executable, so we can't use realpath.
918 # stdlib venv may symlink sys.executable, so we can't use realpath.
918 # but others can symlink *to* the venv Python, so we can't just use sys.executable.
919 # but others can symlink *to* the venv Python, so we can't just use sys.executable.
919 # So we just check every item in the symlink tree (generally <= 3)
920 # So we just check every item in the symlink tree (generally <= 3)
920 paths = [p]
921 paths = [p]
921 while os.path.islink(p):
922 while os.path.islink(p):
922 p = os.path.normcase(os.path.join(os.path.dirname(p), os.readlink(p)))
923 p = os.path.normcase(os.path.join(os.path.dirname(p), os.readlink(p)))
923 paths.append(p)
924 paths.append(p)
924
925
925 # In Cygwin paths like "c:\..." and '\cygdrive\c\...' are possible
926 # In Cygwin paths like "c:\..." and '\cygdrive\c\...' are possible
926 if p_venv.startswith('\\cygdrive'):
927 if p_venv.startswith('\\cygdrive'):
927 p_venv = p_venv[11:]
928 p_venv = p_venv[11:]
928 elif len(p_venv) >= 2 and p_venv[1] == ':':
929 elif len(p_venv) >= 2 and p_venv[1] == ':':
929 p_venv = p_venv[2:]
930 p_venv = p_venv[2:]
930
931
931 if any(p_venv in p for p in paths):
932 if any(p_venv in p for p in paths):
932 # Running properly in the virtualenv, don't need to do anything
933 # Running properly in the virtualenv, don't need to do anything
933 return
934 return
934
935
935 warn("Attempting to work in a virtualenv. If you encounter problems, please "
936 warn("Attempting to work in a virtualenv. If you encounter problems, please "
936 "install IPython inside the virtualenv.")
937 "install IPython inside the virtualenv.")
937 if sys.platform == "win32":
938 if sys.platform == "win32":
938 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
939 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
939 else:
940 else:
940 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
941 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
941 'python%d.%d' % sys.version_info[:2], 'site-packages')
942 'python%d.%d' % sys.version_info[:2], 'site-packages')
942
943
943 import site
944 import site
944 sys.path.insert(0, virtual_env)
945 sys.path.insert(0, virtual_env)
945 site.addsitedir(virtual_env)
946 site.addsitedir(virtual_env)
946
947
947 #-------------------------------------------------------------------------
948 #-------------------------------------------------------------------------
948 # Things related to injections into the sys module
949 # Things related to injections into the sys module
949 #-------------------------------------------------------------------------
950 #-------------------------------------------------------------------------
950
951
951 def save_sys_module_state(self):
952 def save_sys_module_state(self):
952 """Save the state of hooks in the sys module.
953 """Save the state of hooks in the sys module.
953
954
954 This has to be called after self.user_module is created.
955 This has to be called after self.user_module is created.
955 """
956 """
956 self._orig_sys_module_state = {'stdin': sys.stdin,
957 self._orig_sys_module_state = {'stdin': sys.stdin,
957 'stdout': sys.stdout,
958 'stdout': sys.stdout,
958 'stderr': sys.stderr,
959 'stderr': sys.stderr,
959 'excepthook': sys.excepthook}
960 'excepthook': sys.excepthook}
960 self._orig_sys_modules_main_name = self.user_module.__name__
961 self._orig_sys_modules_main_name = self.user_module.__name__
961 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
962 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
962
963
963 def restore_sys_module_state(self):
964 def restore_sys_module_state(self):
964 """Restore the state of the sys module."""
965 """Restore the state of the sys module."""
965 try:
966 try:
966 for k, v in self._orig_sys_module_state.items():
967 for k, v in self._orig_sys_module_state.items():
967 setattr(sys, k, v)
968 setattr(sys, k, v)
968 except AttributeError:
969 except AttributeError:
969 pass
970 pass
970 # Reset what what done in self.init_sys_modules
971 # Reset what what done in self.init_sys_modules
971 if self._orig_sys_modules_main_mod is not None:
972 if self._orig_sys_modules_main_mod is not None:
972 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
973 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
973
974
974 #-------------------------------------------------------------------------
975 #-------------------------------------------------------------------------
975 # Things related to the banner
976 # Things related to the banner
976 #-------------------------------------------------------------------------
977 #-------------------------------------------------------------------------
977
978
978 @property
979 @property
979 def banner(self):
980 def banner(self):
980 banner = self.banner1
981 banner = self.banner1
981 if self.profile and self.profile != 'default':
982 if self.profile and self.profile != 'default':
982 banner += '\nIPython profile: %s\n' % self.profile
983 banner += '\nIPython profile: %s\n' % self.profile
983 if self.banner2:
984 if self.banner2:
984 banner += '\n' + self.banner2
985 banner += '\n' + self.banner2
985 return banner
986 return banner
986
987
987 def show_banner(self, banner=None):
988 def show_banner(self, banner=None):
988 if banner is None:
989 if banner is None:
989 banner = self.banner
990 banner = self.banner
990 sys.stdout.write(banner)
991 sys.stdout.write(banner)
991
992
992 #-------------------------------------------------------------------------
993 #-------------------------------------------------------------------------
993 # Things related to hooks
994 # Things related to hooks
994 #-------------------------------------------------------------------------
995 #-------------------------------------------------------------------------
995
996
996 def init_hooks(self):
997 def init_hooks(self):
997 # hooks holds pointers used for user-side customizations
998 # hooks holds pointers used for user-side customizations
998 self.hooks = Struct()
999 self.hooks = Struct()
999
1000
1000 self.strdispatchers = {}
1001 self.strdispatchers = {}
1001
1002
1002 # Set all default hooks, defined in the IPython.hooks module.
1003 # Set all default hooks, defined in the IPython.hooks module.
1003 hooks = IPython.core.hooks
1004 hooks = IPython.core.hooks
1004 for hook_name in hooks.__all__:
1005 for hook_name in hooks.__all__:
1005 # default hooks have priority 100, i.e. low; user hooks should have
1006 # default hooks have priority 100, i.e. low; user hooks should have
1006 # 0-100 priority
1007 # 0-100 priority
1007 self.set_hook(hook_name,getattr(hooks,hook_name), 100, _warn_deprecated=False)
1008 self.set_hook(hook_name,getattr(hooks,hook_name), 100, _warn_deprecated=False)
1008
1009
1009 if self.display_page:
1010 if self.display_page:
1010 self.set_hook('show_in_pager', page.as_hook(page.display_page), 90)
1011 self.set_hook('show_in_pager', page.as_hook(page.display_page), 90)
1011
1012
1012 def set_hook(self,name,hook, priority=50, str_key=None, re_key=None,
1013 def set_hook(self,name,hook, priority=50, str_key=None, re_key=None,
1013 _warn_deprecated=True):
1014 _warn_deprecated=True):
1014 """set_hook(name,hook) -> sets an internal IPython hook.
1015 """set_hook(name,hook) -> sets an internal IPython hook.
1015
1016
1016 IPython exposes some of its internal API as user-modifiable hooks. By
1017 IPython exposes some of its internal API as user-modifiable hooks. By
1017 adding your function to one of these hooks, you can modify IPython's
1018 adding your function to one of these hooks, you can modify IPython's
1018 behavior to call at runtime your own routines."""
1019 behavior to call at runtime your own routines."""
1019
1020
1020 # At some point in the future, this should validate the hook before it
1021 # At some point in the future, this should validate the hook before it
1021 # accepts it. Probably at least check that the hook takes the number
1022 # accepts it. Probably at least check that the hook takes the number
1022 # of args it's supposed to.
1023 # of args it's supposed to.
1023
1024
1024 f = types.MethodType(hook,self)
1025 f = types.MethodType(hook,self)
1025
1026
1026 # check if the hook is for strdispatcher first
1027 # check if the hook is for strdispatcher first
1027 if str_key is not None:
1028 if str_key is not None:
1028 sdp = self.strdispatchers.get(name, StrDispatch())
1029 sdp = self.strdispatchers.get(name, StrDispatch())
1029 sdp.add_s(str_key, f, priority )
1030 sdp.add_s(str_key, f, priority )
1030 self.strdispatchers[name] = sdp
1031 self.strdispatchers[name] = sdp
1031 return
1032 return
1032 if re_key is not None:
1033 if re_key is not None:
1033 sdp = self.strdispatchers.get(name, StrDispatch())
1034 sdp = self.strdispatchers.get(name, StrDispatch())
1034 sdp.add_re(re.compile(re_key), f, priority )
1035 sdp.add_re(re.compile(re_key), f, priority )
1035 self.strdispatchers[name] = sdp
1036 self.strdispatchers[name] = sdp
1036 return
1037 return
1037
1038
1038 dp = getattr(self.hooks, name, None)
1039 dp = getattr(self.hooks, name, None)
1039 if name not in IPython.core.hooks.__all__:
1040 if name not in IPython.core.hooks.__all__:
1040 print("Warning! Hook '%s' is not one of %s" % \
1041 print("Warning! Hook '%s' is not one of %s" % \
1041 (name, IPython.core.hooks.__all__ ))
1042 (name, IPython.core.hooks.__all__ ))
1042
1043
1043 if _warn_deprecated and (name in IPython.core.hooks.deprecated):
1044 if _warn_deprecated and (name in IPython.core.hooks.deprecated):
1044 alternative = IPython.core.hooks.deprecated[name]
1045 alternative = IPython.core.hooks.deprecated[name]
1045 warn("Hook {} is deprecated. Use {} instead.".format(name, alternative), stacklevel=2)
1046 warn("Hook {} is deprecated. Use {} instead.".format(name, alternative), stacklevel=2)
1046
1047
1047 if not dp:
1048 if not dp:
1048 dp = IPython.core.hooks.CommandChainDispatcher()
1049 dp = IPython.core.hooks.CommandChainDispatcher()
1049
1050
1050 try:
1051 try:
1051 dp.add(f,priority)
1052 dp.add(f,priority)
1052 except AttributeError:
1053 except AttributeError:
1053 # it was not commandchain, plain old func - replace
1054 # it was not commandchain, plain old func - replace
1054 dp = f
1055 dp = f
1055
1056
1056 setattr(self.hooks,name, dp)
1057 setattr(self.hooks,name, dp)
1057
1058
1058 #-------------------------------------------------------------------------
1059 #-------------------------------------------------------------------------
1059 # Things related to events
1060 # Things related to events
1060 #-------------------------------------------------------------------------
1061 #-------------------------------------------------------------------------
1061
1062
1062 def init_events(self):
1063 def init_events(self):
1063 self.events = EventManager(self, available_events)
1064 self.events = EventManager(self, available_events)
1064
1065
1065 self.events.register("pre_execute", self._clear_warning_registry)
1066 self.events.register("pre_execute", self._clear_warning_registry)
1066
1067
1067 def register_post_execute(self, func):
1068 def register_post_execute(self, func):
1068 """DEPRECATED: Use ip.events.register('post_run_cell', func)
1069 """DEPRECATED: Use ip.events.register('post_run_cell', func)
1069
1070
1070 Register a function for calling after code execution.
1071 Register a function for calling after code execution.
1071 """
1072 """
1072 warn("ip.register_post_execute is deprecated, use "
1073 warn("ip.register_post_execute is deprecated, use "
1073 "ip.events.register('post_run_cell', func) instead.", stacklevel=2)
1074 "ip.events.register('post_run_cell', func) instead.", stacklevel=2)
1074 self.events.register('post_run_cell', func)
1075 self.events.register('post_run_cell', func)
1075
1076
1076 def _clear_warning_registry(self):
1077 def _clear_warning_registry(self):
1077 # clear the warning registry, so that different code blocks with
1078 # clear the warning registry, so that different code blocks with
1078 # overlapping line number ranges don't cause spurious suppression of
1079 # overlapping line number ranges don't cause spurious suppression of
1079 # warnings (see gh-6611 for details)
1080 # warnings (see gh-6611 for details)
1080 if "__warningregistry__" in self.user_global_ns:
1081 if "__warningregistry__" in self.user_global_ns:
1081 del self.user_global_ns["__warningregistry__"]
1082 del self.user_global_ns["__warningregistry__"]
1082
1083
1083 #-------------------------------------------------------------------------
1084 #-------------------------------------------------------------------------
1084 # Things related to the "main" module
1085 # Things related to the "main" module
1085 #-------------------------------------------------------------------------
1086 #-------------------------------------------------------------------------
1086
1087
1087 def new_main_mod(self, filename, modname):
1088 def new_main_mod(self, filename, modname):
1088 """Return a new 'main' module object for user code execution.
1089 """Return a new 'main' module object for user code execution.
1089
1090
1090 ``filename`` should be the path of the script which will be run in the
1091 ``filename`` should be the path of the script which will be run in the
1091 module. Requests with the same filename will get the same module, with
1092 module. Requests with the same filename will get the same module, with
1092 its namespace cleared.
1093 its namespace cleared.
1093
1094
1094 ``modname`` should be the module name - normally either '__main__' or
1095 ``modname`` should be the module name - normally either '__main__' or
1095 the basename of the file without the extension.
1096 the basename of the file without the extension.
1096
1097
1097 When scripts are executed via %run, we must keep a reference to their
1098 When scripts are executed via %run, we must keep a reference to their
1098 __main__ module around so that Python doesn't
1099 __main__ module around so that Python doesn't
1099 clear it, rendering references to module globals useless.
1100 clear it, rendering references to module globals useless.
1100
1101
1101 This method keeps said reference in a private dict, keyed by the
1102 This method keeps said reference in a private dict, keyed by the
1102 absolute path of the script. This way, for multiple executions of the
1103 absolute path of the script. This way, for multiple executions of the
1103 same script we only keep one copy of the namespace (the last one),
1104 same script we only keep one copy of the namespace (the last one),
1104 thus preventing memory leaks from old references while allowing the
1105 thus preventing memory leaks from old references while allowing the
1105 objects from the last execution to be accessible.
1106 objects from the last execution to be accessible.
1106 """
1107 """
1107 filename = os.path.abspath(filename)
1108 filename = os.path.abspath(filename)
1108 try:
1109 try:
1109 main_mod = self._main_mod_cache[filename]
1110 main_mod = self._main_mod_cache[filename]
1110 except KeyError:
1111 except KeyError:
1111 main_mod = self._main_mod_cache[filename] = types.ModuleType(
1112 main_mod = self._main_mod_cache[filename] = types.ModuleType(
1112 modname,
1113 modname,
1113 doc="Module created for script run in IPython")
1114 doc="Module created for script run in IPython")
1114 else:
1115 else:
1115 main_mod.__dict__.clear()
1116 main_mod.__dict__.clear()
1116 main_mod.__name__ = modname
1117 main_mod.__name__ = modname
1117
1118
1118 main_mod.__file__ = filename
1119 main_mod.__file__ = filename
1119 # It seems pydoc (and perhaps others) needs any module instance to
1120 # It seems pydoc (and perhaps others) needs any module instance to
1120 # implement a __nonzero__ method
1121 # implement a __nonzero__ method
1121 main_mod.__nonzero__ = lambda : True
1122 main_mod.__nonzero__ = lambda : True
1122
1123
1123 return main_mod
1124 return main_mod
1124
1125
1125 def clear_main_mod_cache(self):
1126 def clear_main_mod_cache(self):
1126 """Clear the cache of main modules.
1127 """Clear the cache of main modules.
1127
1128
1128 Mainly for use by utilities like %reset.
1129 Mainly for use by utilities like %reset.
1129
1130
1130 Examples
1131 Examples
1131 --------
1132 --------
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:
1494 except KeyError:
1494 raise NameError("name '%s' is not defined" % varname)
1495 raise NameError("name '%s' is not defined" % varname)
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:
1525 except TypeError:
1525 raise TypeError('regex must be a string or compiled pattern')
1526 raise TypeError('regex must be a string or compiled pattern')
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
2293
2293 line : str
2294 line : str
2294 The rest of the input line as a single string.
2295 The rest of the input line as a single string.
2295
2296
2296 _stack_depth : int
2297 _stack_depth : int
2297 If run_line_magic() is called from magic() then _stack_depth=2.
2298 If run_line_magic() is called from magic() then _stack_depth=2.
2298 This is added to ensure backward compatibility for use of 'get_ipython().magic()'
2299 This is added to ensure backward compatibility for use of 'get_ipython().magic()'
2299 """
2300 """
2300 fn = self.find_line_magic(magic_name)
2301 fn = self.find_line_magic(magic_name)
2301 if fn is None:
2302 if fn is None:
2302 cm = self.find_cell_magic(magic_name)
2303 cm = self.find_cell_magic(magic_name)
2303 etpl = "Line magic function `%%%s` not found%s."
2304 etpl = "Line magic function `%%%s` not found%s."
2304 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2305 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2305 'did you mean that instead?)' % magic_name )
2306 'did you mean that instead?)' % magic_name )
2306 raise UsageError(etpl % (magic_name, extra))
2307 raise UsageError(etpl % (magic_name, extra))
2307 else:
2308 else:
2308 # Note: this is the distance in the stack to the user's frame.
2309 # Note: this is the distance in the stack to the user's frame.
2309 # This will need to be updated if the internal calling logic gets
2310 # This will need to be updated if the internal calling logic gets
2310 # refactored, or else we'll be expanding the wrong variables.
2311 # refactored, or else we'll be expanding the wrong variables.
2311
2312
2312 # Determine stack_depth depending on where run_line_magic() has been called
2313 # Determine stack_depth depending on where run_line_magic() has been called
2313 stack_depth = _stack_depth
2314 stack_depth = _stack_depth
2314 if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False):
2315 if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False):
2315 # magic has opted out of var_expand
2316 # magic has opted out of var_expand
2316 magic_arg_s = line
2317 magic_arg_s = line
2317 else:
2318 else:
2318 magic_arg_s = self.var_expand(line, stack_depth)
2319 magic_arg_s = self.var_expand(line, stack_depth)
2319 # Put magic args in a list so we can call with f(*a) syntax
2320 # Put magic args in a list so we can call with f(*a) syntax
2320 args = [magic_arg_s]
2321 args = [magic_arg_s]
2321 kwargs = {}
2322 kwargs = {}
2322 # Grab local namespace if we need it:
2323 # Grab local namespace if we need it:
2323 if getattr(fn, "needs_local_scope", False):
2324 if getattr(fn, "needs_local_scope", False):
2324 kwargs['local_ns'] = self.get_local_scope(stack_depth)
2325 kwargs['local_ns'] = self.get_local_scope(stack_depth)
2325 with self.builtin_trap:
2326 with self.builtin_trap:
2326 result = fn(*args, **kwargs)
2327 result = fn(*args, **kwargs)
2327 return result
2328 return result
2328
2329
2329 def get_local_scope(self, stack_depth):
2330 def get_local_scope(self, stack_depth):
2330 """Get local scope at given stack depth.
2331 """Get local scope at given stack depth.
2331
2332
2332 Parameters
2333 Parameters
2333 ----------
2334 ----------
2334 stack_depth : int
2335 stack_depth : int
2335 Depth relative to calling frame
2336 Depth relative to calling frame
2336 """
2337 """
2337 return sys._getframe(stack_depth + 1).f_locals
2338 return sys._getframe(stack_depth + 1).f_locals
2338
2339
2339 def run_cell_magic(self, magic_name, line, cell):
2340 def run_cell_magic(self, magic_name, line, cell):
2340 """Execute the given cell magic.
2341 """Execute the given cell magic.
2341
2342
2342 Parameters
2343 Parameters
2343 ----------
2344 ----------
2344 magic_name : str
2345 magic_name : str
2345 Name of the desired magic function, without '%' prefix.
2346 Name of the desired magic function, without '%' prefix.
2346
2347
2347 line : str
2348 line : str
2348 The rest of the first input line as a single string.
2349 The rest of the first input line as a single string.
2349
2350
2350 cell : str
2351 cell : str
2351 The body of the cell as a (possibly multiline) string.
2352 The body of the cell as a (possibly multiline) string.
2352 """
2353 """
2353 fn = self.find_cell_magic(magic_name)
2354 fn = self.find_cell_magic(magic_name)
2354 if fn is None:
2355 if fn is None:
2355 lm = self.find_line_magic(magic_name)
2356 lm = self.find_line_magic(magic_name)
2356 etpl = "Cell magic `%%{0}` not found{1}."
2357 etpl = "Cell magic `%%{0}` not found{1}."
2357 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2358 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2358 'did you mean that instead?)'.format(magic_name))
2359 'did you mean that instead?)'.format(magic_name))
2359 raise UsageError(etpl.format(magic_name, extra))
2360 raise UsageError(etpl.format(magic_name, extra))
2360 elif cell == '':
2361 elif cell == '':
2361 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2362 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2362 if self.find_line_magic(magic_name) is not None:
2363 if self.find_line_magic(magic_name) is not None:
2363 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2364 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2364 raise UsageError(message)
2365 raise UsageError(message)
2365 else:
2366 else:
2366 # Note: this is the distance in the stack to the user's frame.
2367 # Note: this is the distance in the stack to the user's frame.
2367 # This will need to be updated if the internal calling logic gets
2368 # This will need to be updated if the internal calling logic gets
2368 # refactored, or else we'll be expanding the wrong variables.
2369 # refactored, or else we'll be expanding the wrong variables.
2369 stack_depth = 2
2370 stack_depth = 2
2370 if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False):
2371 if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False):
2371 # magic has opted out of var_expand
2372 # magic has opted out of var_expand
2372 magic_arg_s = line
2373 magic_arg_s = line
2373 else:
2374 else:
2374 magic_arg_s = self.var_expand(line, stack_depth)
2375 magic_arg_s = self.var_expand(line, stack_depth)
2375 kwargs = {}
2376 kwargs = {}
2376 if getattr(fn, "needs_local_scope", False):
2377 if getattr(fn, "needs_local_scope", False):
2377 kwargs['local_ns'] = self.user_ns
2378 kwargs['local_ns'] = self.user_ns
2378
2379
2379 with self.builtin_trap:
2380 with self.builtin_trap:
2380 args = (magic_arg_s, cell)
2381 args = (magic_arg_s, cell)
2381 result = fn(*args, **kwargs)
2382 result = fn(*args, **kwargs)
2382 return result
2383 return result
2383
2384
2384 def find_line_magic(self, magic_name):
2385 def find_line_magic(self, magic_name):
2385 """Find and return a line magic by name.
2386 """Find and return a line magic by name.
2386
2387
2387 Returns None if the magic isn't found."""
2388 Returns None if the magic isn't found."""
2388 return self.magics_manager.magics['line'].get(magic_name)
2389 return self.magics_manager.magics['line'].get(magic_name)
2389
2390
2390 def find_cell_magic(self, magic_name):
2391 def find_cell_magic(self, magic_name):
2391 """Find and return a cell magic by name.
2392 """Find and return a cell magic by name.
2392
2393
2393 Returns None if the magic isn't found."""
2394 Returns None if the magic isn't found."""
2394 return self.magics_manager.magics['cell'].get(magic_name)
2395 return self.magics_manager.magics['cell'].get(magic_name)
2395
2396
2396 def find_magic(self, magic_name, magic_kind='line'):
2397 def find_magic(self, magic_name, magic_kind='line'):
2397 """Find and return a magic of the given type by name.
2398 """Find and return a magic of the given type by name.
2398
2399
2399 Returns None if the magic isn't found."""
2400 Returns None if the magic isn't found."""
2400 return self.magics_manager.magics[magic_kind].get(magic_name)
2401 return self.magics_manager.magics[magic_kind].get(magic_name)
2401
2402
2402 def magic(self, arg_s):
2403 def magic(self, arg_s):
2403 """DEPRECATED. Use run_line_magic() instead.
2404 """DEPRECATED. Use run_line_magic() instead.
2404
2405
2405 Call a magic function by name.
2406 Call a magic function by name.
2406
2407
2407 Input: a string containing the name of the magic function to call and
2408 Input: a string containing the name of the magic function to call and
2408 any additional arguments to be passed to the magic.
2409 any additional arguments to be passed to the magic.
2409
2410
2410 magic('name -opt foo bar') is equivalent to typing at the ipython
2411 magic('name -opt foo bar') is equivalent to typing at the ipython
2411 prompt:
2412 prompt:
2412
2413
2413 In[1]: %name -opt foo bar
2414 In[1]: %name -opt foo bar
2414
2415
2415 To call a magic without arguments, simply use magic('name').
2416 To call a magic without arguments, simply use magic('name').
2416
2417
2417 This provides a proper Python function to call IPython's magics in any
2418 This provides a proper Python function to call IPython's magics in any
2418 valid Python code you can type at the interpreter, including loops and
2419 valid Python code you can type at the interpreter, including loops and
2419 compound statements.
2420 compound statements.
2420 """
2421 """
2421 # TODO: should we issue a loud deprecation warning here?
2422 # TODO: should we issue a loud deprecation warning here?
2422 magic_name, _, magic_arg_s = arg_s.partition(' ')
2423 magic_name, _, magic_arg_s = arg_s.partition(' ')
2423 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2424 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2424 return self.run_line_magic(magic_name, magic_arg_s, _stack_depth=2)
2425 return self.run_line_magic(magic_name, magic_arg_s, _stack_depth=2)
2425
2426
2426 #-------------------------------------------------------------------------
2427 #-------------------------------------------------------------------------
2427 # Things related to macros
2428 # Things related to macros
2428 #-------------------------------------------------------------------------
2429 #-------------------------------------------------------------------------
2429
2430
2430 def define_macro(self, name, themacro):
2431 def define_macro(self, name, themacro):
2431 """Define a new macro
2432 """Define a new macro
2432
2433
2433 Parameters
2434 Parameters
2434 ----------
2435 ----------
2435 name : str
2436 name : str
2436 The name of the macro.
2437 The name of the macro.
2437 themacro : str or Macro
2438 themacro : str or Macro
2438 The action to do upon invoking the macro. If a string, a new
2439 The action to do upon invoking the macro. If a string, a new
2439 Macro object is created by passing the string to it.
2440 Macro object is created by passing the string to it.
2440 """
2441 """
2441
2442
2442 from IPython.core import macro
2443 from IPython.core import macro
2443
2444
2444 if isinstance(themacro, str):
2445 if isinstance(themacro, str):
2445 themacro = macro.Macro(themacro)
2446 themacro = macro.Macro(themacro)
2446 if not isinstance(themacro, macro.Macro):
2447 if not isinstance(themacro, macro.Macro):
2447 raise ValueError('A macro must be a string or a Macro instance.')
2448 raise ValueError('A macro must be a string or a Macro instance.')
2448 self.user_ns[name] = themacro
2449 self.user_ns[name] = themacro
2449
2450
2450 #-------------------------------------------------------------------------
2451 #-------------------------------------------------------------------------
2451 # Things related to the running of system commands
2452 # Things related to the running of system commands
2452 #-------------------------------------------------------------------------
2453 #-------------------------------------------------------------------------
2453
2454
2454 def system_piped(self, cmd):
2455 def system_piped(self, cmd):
2455 """Call the given cmd in a subprocess, piping stdout/err
2456 """Call the given cmd in a subprocess, piping stdout/err
2456
2457
2457 Parameters
2458 Parameters
2458 ----------
2459 ----------
2459 cmd : str
2460 cmd : str
2460 Command to execute (can not end in '&', as background processes are
2461 Command to execute (can not end in '&', as background processes are
2461 not supported. Should not be a command that expects input
2462 not supported. Should not be a command that expects input
2462 other than simple text.
2463 other than simple text.
2463 """
2464 """
2464 if cmd.rstrip().endswith('&'):
2465 if cmd.rstrip().endswith('&'):
2465 # this is *far* from a rigorous test
2466 # this is *far* from a rigorous test
2466 # We do not support backgrounding processes because we either use
2467 # We do not support backgrounding processes because we either use
2467 # pexpect or pipes to read from. Users can always just call
2468 # pexpect or pipes to read from. Users can always just call
2468 # os.system() or use ip.system=ip.system_raw
2469 # os.system() or use ip.system=ip.system_raw
2469 # if they really want a background process.
2470 # if they really want a background process.
2470 raise OSError("Background processes not supported.")
2471 raise OSError("Background processes not supported.")
2471
2472
2472 # we explicitly do NOT return the subprocess status code, because
2473 # we explicitly do NOT return the subprocess status code, because
2473 # a non-None value would trigger :func:`sys.displayhook` calls.
2474 # a non-None value would trigger :func:`sys.displayhook` calls.
2474 # Instead, we store the exit_code in user_ns.
2475 # Instead, we store the exit_code in user_ns.
2475 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2476 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2476
2477
2477 def system_raw(self, cmd):
2478 def system_raw(self, cmd):
2478 """Call the given cmd in a subprocess using os.system on Windows or
2479 """Call the given cmd in a subprocess using os.system on Windows or
2479 subprocess.call using the system shell on other platforms.
2480 subprocess.call using the system shell on other platforms.
2480
2481
2481 Parameters
2482 Parameters
2482 ----------
2483 ----------
2483 cmd : str
2484 cmd : str
2484 Command to execute.
2485 Command to execute.
2485 """
2486 """
2486 cmd = self.var_expand(cmd, depth=1)
2487 cmd = self.var_expand(cmd, depth=1)
2487 # protect os.system from UNC paths on Windows, which it can't handle:
2488 # protect os.system from UNC paths on Windows, which it can't handle:
2488 if sys.platform == 'win32':
2489 if sys.platform == 'win32':
2489 from IPython.utils._process_win32 import AvoidUNCPath
2490 from IPython.utils._process_win32 import AvoidUNCPath
2490 with AvoidUNCPath() as path:
2491 with AvoidUNCPath() as path:
2491 if path is not None:
2492 if path is not None:
2492 cmd = '"pushd %s &&"%s' % (path, cmd)
2493 cmd = '"pushd %s &&"%s' % (path, cmd)
2493 try:
2494 try:
2494 ec = os.system(cmd)
2495 ec = os.system(cmd)
2495 except KeyboardInterrupt:
2496 except KeyboardInterrupt:
2496 print('\n' + self.get_exception_only(), file=sys.stderr)
2497 print('\n' + self.get_exception_only(), file=sys.stderr)
2497 ec = -2
2498 ec = -2
2498 else:
2499 else:
2499 # For posix the result of the subprocess.call() below is an exit
2500 # For posix the result of the subprocess.call() below is an exit
2500 # code, which by convention is zero for success, positive for
2501 # code, which by convention is zero for success, positive for
2501 # program failure. Exit codes above 128 are reserved for signals,
2502 # program failure. Exit codes above 128 are reserved for signals,
2502 # and the formula for converting a signal to an exit code is usually
2503 # and the formula for converting a signal to an exit code is usually
2503 # signal_number+128. To more easily differentiate between exit
2504 # signal_number+128. To more easily differentiate between exit
2504 # codes and signals, ipython uses negative numbers. For instance
2505 # codes and signals, ipython uses negative numbers. For instance
2505 # since control-c is signal 2 but exit code 130, ipython's
2506 # since control-c is signal 2 but exit code 130, ipython's
2506 # _exit_code variable will read -2. Note that some shells like
2507 # _exit_code variable will read -2. Note that some shells like
2507 # csh and fish don't follow sh/bash conventions for exit codes.
2508 # csh and fish don't follow sh/bash conventions for exit codes.
2508 executable = os.environ.get('SHELL', None)
2509 executable = os.environ.get('SHELL', None)
2509 try:
2510 try:
2510 # Use env shell instead of default /bin/sh
2511 # Use env shell instead of default /bin/sh
2511 ec = subprocess.call(cmd, shell=True, executable=executable)
2512 ec = subprocess.call(cmd, shell=True, executable=executable)
2512 except KeyboardInterrupt:
2513 except KeyboardInterrupt:
2513 # intercept control-C; a long traceback is not useful here
2514 # intercept control-C; a long traceback is not useful here
2514 print('\n' + self.get_exception_only(), file=sys.stderr)
2515 print('\n' + self.get_exception_only(), file=sys.stderr)
2515 ec = 130
2516 ec = 130
2516 if ec > 128:
2517 if ec > 128:
2517 ec = -(ec - 128)
2518 ec = -(ec - 128)
2518
2519
2519 # We explicitly do NOT return the subprocess status code, because
2520 # We explicitly do NOT return the subprocess status code, because
2520 # a non-None value would trigger :func:`sys.displayhook` calls.
2521 # a non-None value would trigger :func:`sys.displayhook` calls.
2521 # Instead, we store the exit_code in user_ns. Note the semantics
2522 # Instead, we store the exit_code in user_ns. Note the semantics
2522 # of _exit_code: for control-c, _exit_code == -signal.SIGNIT,
2523 # of _exit_code: for control-c, _exit_code == -signal.SIGNIT,
2523 # but raising SystemExit(_exit_code) will give status 254!
2524 # but raising SystemExit(_exit_code) will give status 254!
2524 self.user_ns['_exit_code'] = ec
2525 self.user_ns['_exit_code'] = ec
2525
2526
2526 # use piped system by default, because it is better behaved
2527 # use piped system by default, because it is better behaved
2527 system = system_piped
2528 system = system_piped
2528
2529
2529 def getoutput(self, cmd, split=True, depth=0):
2530 def getoutput(self, cmd, split=True, depth=0):
2530 """Get output (possibly including stderr) from a subprocess.
2531 """Get output (possibly including stderr) from a subprocess.
2531
2532
2532 Parameters
2533 Parameters
2533 ----------
2534 ----------
2534 cmd : str
2535 cmd : str
2535 Command to execute (can not end in '&', as background processes are
2536 Command to execute (can not end in '&', as background processes are
2536 not supported.
2537 not supported.
2537 split : bool, optional
2538 split : bool, optional
2538 If True, split the output into an IPython SList. Otherwise, an
2539 If True, split the output into an IPython SList. Otherwise, an
2539 IPython LSString is returned. These are objects similar to normal
2540 IPython LSString is returned. These are objects similar to normal
2540 lists and strings, with a few convenience attributes for easier
2541 lists and strings, with a few convenience attributes for easier
2541 manipulation of line-based output. You can use '?' on them for
2542 manipulation of line-based output. You can use '?' on them for
2542 details.
2543 details.
2543 depth : int, optional
2544 depth : int, optional
2544 How many frames above the caller are the local variables which should
2545 How many frames above the caller are the local variables which should
2545 be expanded in the command string? The default (0) assumes that the
2546 be expanded in the command string? The default (0) assumes that the
2546 expansion variables are in the stack frame calling this function.
2547 expansion variables are in the stack frame calling this function.
2547 """
2548 """
2548 if cmd.rstrip().endswith('&'):
2549 if cmd.rstrip().endswith('&'):
2549 # this is *far* from a rigorous test
2550 # this is *far* from a rigorous test
2550 raise OSError("Background processes not supported.")
2551 raise OSError("Background processes not supported.")
2551 out = getoutput(self.var_expand(cmd, depth=depth+1))
2552 out = getoutput(self.var_expand(cmd, depth=depth+1))
2552 if split:
2553 if split:
2553 out = SList(out.splitlines())
2554 out = SList(out.splitlines())
2554 else:
2555 else:
2555 out = LSString(out)
2556 out = LSString(out)
2556 return out
2557 return out
2557
2558
2558 #-------------------------------------------------------------------------
2559 #-------------------------------------------------------------------------
2559 # Things related to aliases
2560 # Things related to aliases
2560 #-------------------------------------------------------------------------
2561 #-------------------------------------------------------------------------
2561
2562
2562 def init_alias(self):
2563 def init_alias(self):
2563 self.alias_manager = AliasManager(shell=self, parent=self)
2564 self.alias_manager = AliasManager(shell=self, parent=self)
2564 self.configurables.append(self.alias_manager)
2565 self.configurables.append(self.alias_manager)
2565
2566
2566 #-------------------------------------------------------------------------
2567 #-------------------------------------------------------------------------
2567 # Things related to extensions
2568 # Things related to extensions
2568 #-------------------------------------------------------------------------
2569 #-------------------------------------------------------------------------
2569
2570
2570 def init_extension_manager(self):
2571 def init_extension_manager(self):
2571 self.extension_manager = ExtensionManager(shell=self, parent=self)
2572 self.extension_manager = ExtensionManager(shell=self, parent=self)
2572 self.configurables.append(self.extension_manager)
2573 self.configurables.append(self.extension_manager)
2573
2574
2574 #-------------------------------------------------------------------------
2575 #-------------------------------------------------------------------------
2575 # Things related to payloads
2576 # Things related to payloads
2576 #-------------------------------------------------------------------------
2577 #-------------------------------------------------------------------------
2577
2578
2578 def init_payload(self):
2579 def init_payload(self):
2579 self.payload_manager = PayloadManager(parent=self)
2580 self.payload_manager = PayloadManager(parent=self)
2580 self.configurables.append(self.payload_manager)
2581 self.configurables.append(self.payload_manager)
2581
2582
2582 #-------------------------------------------------------------------------
2583 #-------------------------------------------------------------------------
2583 # Things related to the prefilter
2584 # Things related to the prefilter
2584 #-------------------------------------------------------------------------
2585 #-------------------------------------------------------------------------
2585
2586
2586 def init_prefilter(self):
2587 def init_prefilter(self):
2587 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2588 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2588 self.configurables.append(self.prefilter_manager)
2589 self.configurables.append(self.prefilter_manager)
2589 # Ultimately this will be refactored in the new interpreter code, but
2590 # Ultimately this will be refactored in the new interpreter code, but
2590 # for now, we should expose the main prefilter method (there's legacy
2591 # for now, we should expose the main prefilter method (there's legacy
2591 # code out there that may rely on this).
2592 # code out there that may rely on this).
2592 self.prefilter = self.prefilter_manager.prefilter_lines
2593 self.prefilter = self.prefilter_manager.prefilter_lines
2593
2594
2594 def auto_rewrite_input(self, cmd):
2595 def auto_rewrite_input(self, cmd):
2595 """Print to the screen the rewritten form of the user's command.
2596 """Print to the screen the rewritten form of the user's command.
2596
2597
2597 This shows visual feedback by rewriting input lines that cause
2598 This shows visual feedback by rewriting input lines that cause
2598 automatic calling to kick in, like::
2599 automatic calling to kick in, like::
2599
2600
2600 /f x
2601 /f x
2601
2602
2602 into::
2603 into::
2603
2604
2604 ------> f(x)
2605 ------> f(x)
2605
2606
2606 after the user's input prompt. This helps the user understand that the
2607 after the user's input prompt. This helps the user understand that the
2607 input line was transformed automatically by IPython.
2608 input line was transformed automatically by IPython.
2608 """
2609 """
2609 if not self.show_rewritten_input:
2610 if not self.show_rewritten_input:
2610 return
2611 return
2611
2612
2612 # This is overridden in TerminalInteractiveShell to use fancy prompts
2613 # This is overridden in TerminalInteractiveShell to use fancy prompts
2613 print("------> " + cmd)
2614 print("------> " + cmd)
2614
2615
2615 #-------------------------------------------------------------------------
2616 #-------------------------------------------------------------------------
2616 # Things related to extracting values/expressions from kernel and user_ns
2617 # Things related to extracting values/expressions from kernel and user_ns
2617 #-------------------------------------------------------------------------
2618 #-------------------------------------------------------------------------
2618
2619
2619 def _user_obj_error(self):
2620 def _user_obj_error(self):
2620 """return simple exception dict
2621 """return simple exception dict
2621
2622
2622 for use in user_expressions
2623 for use in user_expressions
2623 """
2624 """
2624
2625
2625 etype, evalue, tb = self._get_exc_info()
2626 etype, evalue, tb = self._get_exc_info()
2626 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2627 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2627
2628
2628 exc_info = {
2629 exc_info = {
2629 u'status' : 'error',
2630 u'status' : 'error',
2630 u'traceback' : stb,
2631 u'traceback' : stb,
2631 u'ename' : etype.__name__,
2632 u'ename' : etype.__name__,
2632 u'evalue' : py3compat.safe_unicode(evalue),
2633 u'evalue' : py3compat.safe_unicode(evalue),
2633 }
2634 }
2634
2635
2635 return exc_info
2636 return exc_info
2636
2637
2637 def _format_user_obj(self, obj):
2638 def _format_user_obj(self, obj):
2638 """format a user object to display dict
2639 """format a user object to display dict
2639
2640
2640 for use in user_expressions
2641 for use in user_expressions
2641 """
2642 """
2642
2643
2643 data, md = self.display_formatter.format(obj)
2644 data, md = self.display_formatter.format(obj)
2644 value = {
2645 value = {
2645 'status' : 'ok',
2646 'status' : 'ok',
2646 'data' : data,
2647 'data' : data,
2647 'metadata' : md,
2648 'metadata' : md,
2648 }
2649 }
2649 return value
2650 return value
2650
2651
2651 def user_expressions(self, expressions):
2652 def user_expressions(self, expressions):
2652 """Evaluate a dict of expressions in the user's namespace.
2653 """Evaluate a dict of expressions in the user's namespace.
2653
2654
2654 Parameters
2655 Parameters
2655 ----------
2656 ----------
2656 expressions : dict
2657 expressions : dict
2657 A dict with string keys and string values. The expression values
2658 A dict with string keys and string values. The expression values
2658 should be valid Python expressions, each of which will be evaluated
2659 should be valid Python expressions, each of which will be evaluated
2659 in the user namespace.
2660 in the user namespace.
2660
2661
2661 Returns
2662 Returns
2662 -------
2663 -------
2663 A dict, keyed like the input expressions dict, with the rich mime-typed
2664 A dict, keyed like the input expressions dict, with the rich mime-typed
2664 display_data of each value.
2665 display_data of each value.
2665 """
2666 """
2666 out = {}
2667 out = {}
2667 user_ns = self.user_ns
2668 user_ns = self.user_ns
2668 global_ns = self.user_global_ns
2669 global_ns = self.user_global_ns
2669
2670
2670 for key, expr in expressions.items():
2671 for key, expr in expressions.items():
2671 try:
2672 try:
2672 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2673 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2673 except:
2674 except:
2674 value = self._user_obj_error()
2675 value = self._user_obj_error()
2675 out[key] = value
2676 out[key] = value
2676 return out
2677 return out
2677
2678
2678 #-------------------------------------------------------------------------
2679 #-------------------------------------------------------------------------
2679 # Things related to the running of code
2680 # Things related to the running of code
2680 #-------------------------------------------------------------------------
2681 #-------------------------------------------------------------------------
2681
2682
2682 def ex(self, cmd):
2683 def ex(self, cmd):
2683 """Execute a normal python statement in user namespace."""
2684 """Execute a normal python statement in user namespace."""
2684 with self.builtin_trap:
2685 with self.builtin_trap:
2685 exec(cmd, self.user_global_ns, self.user_ns)
2686 exec(cmd, self.user_global_ns, self.user_ns)
2686
2687
2687 def ev(self, expr):
2688 def ev(self, expr):
2688 """Evaluate python expression expr in user namespace.
2689 """Evaluate python expression expr in user namespace.
2689
2690
2690 Returns the result of evaluation
2691 Returns the result of evaluation
2691 """
2692 """
2692 with self.builtin_trap:
2693 with self.builtin_trap:
2693 return eval(expr, self.user_global_ns, self.user_ns)
2694 return eval(expr, self.user_global_ns, self.user_ns)
2694
2695
2695 def safe_execfile(self, fname, *where, exit_ignore=False, raise_exceptions=False, shell_futures=False):
2696 def safe_execfile(self, fname, *where, exit_ignore=False, raise_exceptions=False, shell_futures=False):
2696 """A safe version of the builtin execfile().
2697 """A safe version of the builtin execfile().
2697
2698
2698 This version will never throw an exception, but instead print
2699 This version will never throw an exception, but instead print
2699 helpful error messages to the screen. This only works on pure
2700 helpful error messages to the screen. This only works on pure
2700 Python files with the .py extension.
2701 Python files with the .py extension.
2701
2702
2702 Parameters
2703 Parameters
2703 ----------
2704 ----------
2704 fname : string
2705 fname : string
2705 The name of the file to be executed.
2706 The name of the file to be executed.
2706 where : tuple
2707 where : tuple
2707 One or two namespaces, passed to execfile() as (globals,locals).
2708 One or two namespaces, passed to execfile() as (globals,locals).
2708 If only one is given, it is passed as both.
2709 If only one is given, it is passed as both.
2709 exit_ignore : bool (False)
2710 exit_ignore : bool (False)
2710 If True, then silence SystemExit for non-zero status (it is always
2711 If True, then silence SystemExit for non-zero status (it is always
2711 silenced for zero status, as it is so common).
2712 silenced for zero status, as it is so common).
2712 raise_exceptions : bool (False)
2713 raise_exceptions : bool (False)
2713 If True raise exceptions everywhere. Meant for testing.
2714 If True raise exceptions everywhere. Meant for testing.
2714 shell_futures : bool (False)
2715 shell_futures : bool (False)
2715 If True, the code will share future statements with the interactive
2716 If True, the code will share future statements with the interactive
2716 shell. It will both be affected by previous __future__ imports, and
2717 shell. It will both be affected by previous __future__ imports, and
2717 any __future__ imports in the code will affect the shell. If False,
2718 any __future__ imports in the code will affect the shell. If False,
2718 __future__ imports are not shared in either direction.
2719 __future__ imports are not shared in either direction.
2719
2720
2720 """
2721 """
2721 fname = os.path.abspath(os.path.expanduser(fname))
2722 fname = os.path.abspath(os.path.expanduser(fname))
2722
2723
2723 # Make sure we can open the file
2724 # Make sure we can open the file
2724 try:
2725 try:
2725 with open(fname):
2726 with open(fname):
2726 pass
2727 pass
2727 except:
2728 except:
2728 warn('Could not open file <%s> for safe execution.' % fname)
2729 warn('Could not open file <%s> for safe execution.' % fname)
2729 return
2730 return
2730
2731
2731 # Find things also in current directory. This is needed to mimic the
2732 # Find things also in current directory. This is needed to mimic the
2732 # behavior of running a script from the system command line, where
2733 # behavior of running a script from the system command line, where
2733 # Python inserts the script's directory into sys.path
2734 # Python inserts the script's directory into sys.path
2734 dname = os.path.dirname(fname)
2735 dname = os.path.dirname(fname)
2735
2736
2736 with prepended_to_syspath(dname), self.builtin_trap:
2737 with prepended_to_syspath(dname), self.builtin_trap:
2737 try:
2738 try:
2738 glob, loc = (where + (None, ))[:2]
2739 glob, loc = (where + (None, ))[:2]
2739 py3compat.execfile(
2740 py3compat.execfile(
2740 fname, glob, loc,
2741 fname, glob, loc,
2741 self.compile if shell_futures else None)
2742 self.compile if shell_futures else None)
2742 except SystemExit as status:
2743 except SystemExit as status:
2743 # If the call was made with 0 or None exit status (sys.exit(0)
2744 # If the call was made with 0 or None exit status (sys.exit(0)
2744 # or sys.exit() ), don't bother showing a traceback, as both of
2745 # or sys.exit() ), don't bother showing a traceback, as both of
2745 # these are considered normal by the OS:
2746 # these are considered normal by the OS:
2746 # > python -c'import sys;sys.exit(0)'; echo $?
2747 # > python -c'import sys;sys.exit(0)'; echo $?
2747 # 0
2748 # 0
2748 # > python -c'import sys;sys.exit()'; echo $?
2749 # > python -c'import sys;sys.exit()'; echo $?
2749 # 0
2750 # 0
2750 # For other exit status, we show the exception unless
2751 # For other exit status, we show the exception unless
2751 # explicitly silenced, but only in short form.
2752 # explicitly silenced, but only in short form.
2752 if status.code:
2753 if status.code:
2753 if raise_exceptions:
2754 if raise_exceptions:
2754 raise
2755 raise
2755 if not exit_ignore:
2756 if not exit_ignore:
2756 self.showtraceback(exception_only=True)
2757 self.showtraceback(exception_only=True)
2757 except:
2758 except:
2758 if raise_exceptions:
2759 if raise_exceptions:
2759 raise
2760 raise
2760 # tb offset is 2 because we wrap execfile
2761 # tb offset is 2 because we wrap execfile
2761 self.showtraceback(tb_offset=2)
2762 self.showtraceback(tb_offset=2)
2762
2763
2763 def safe_execfile_ipy(self, fname, shell_futures=False, raise_exceptions=False):
2764 def safe_execfile_ipy(self, fname, shell_futures=False, raise_exceptions=False):
2764 """Like safe_execfile, but for .ipy or .ipynb files with IPython syntax.
2765 """Like safe_execfile, but for .ipy or .ipynb files with IPython syntax.
2765
2766
2766 Parameters
2767 Parameters
2767 ----------
2768 ----------
2768 fname : str
2769 fname : str
2769 The name of the file to execute. The filename must have a
2770 The name of the file to execute. The filename must have a
2770 .ipy or .ipynb extension.
2771 .ipy or .ipynb extension.
2771 shell_futures : bool (False)
2772 shell_futures : bool (False)
2772 If True, the code will share future statements with the interactive
2773 If True, the code will share future statements with the interactive
2773 shell. It will both be affected by previous __future__ imports, and
2774 shell. It will both be affected by previous __future__ imports, and
2774 any __future__ imports in the code will affect the shell. If False,
2775 any __future__ imports in the code will affect the shell. If False,
2775 __future__ imports are not shared in either direction.
2776 __future__ imports are not shared in either direction.
2776 raise_exceptions : bool (False)
2777 raise_exceptions : bool (False)
2777 If True raise exceptions everywhere. Meant for testing.
2778 If True raise exceptions everywhere. Meant for testing.
2778 """
2779 """
2779 fname = os.path.abspath(os.path.expanduser(fname))
2780 fname = os.path.abspath(os.path.expanduser(fname))
2780
2781
2781 # Make sure we can open the file
2782 # Make sure we can open the file
2782 try:
2783 try:
2783 with open(fname):
2784 with open(fname):
2784 pass
2785 pass
2785 except:
2786 except:
2786 warn('Could not open file <%s> for safe execution.' % fname)
2787 warn('Could not open file <%s> for safe execution.' % fname)
2787 return
2788 return
2788
2789
2789 # Find things also in current directory. This is needed to mimic the
2790 # Find things also in current directory. This is needed to mimic the
2790 # behavior of running a script from the system command line, where
2791 # behavior of running a script from the system command line, where
2791 # Python inserts the script's directory into sys.path
2792 # Python inserts the script's directory into sys.path
2792 dname = os.path.dirname(fname)
2793 dname = os.path.dirname(fname)
2793
2794
2794 def get_cells():
2795 def get_cells():
2795 """generator for sequence of code blocks to run"""
2796 """generator for sequence of code blocks to run"""
2796 if fname.endswith('.ipynb'):
2797 if fname.endswith('.ipynb'):
2797 from nbformat import read
2798 from nbformat import read
2798 nb = read(fname, as_version=4)
2799 nb = read(fname, as_version=4)
2799 if not nb.cells:
2800 if not nb.cells:
2800 return
2801 return
2801 for cell in nb.cells:
2802 for cell in nb.cells:
2802 if cell.cell_type == 'code':
2803 if cell.cell_type == 'code':
2803 yield cell.source
2804 yield cell.source
2804 else:
2805 else:
2805 with open(fname) as f:
2806 with open(fname) as f:
2806 yield f.read()
2807 yield f.read()
2807
2808
2808 with prepended_to_syspath(dname):
2809 with prepended_to_syspath(dname):
2809 try:
2810 try:
2810 for cell in get_cells():
2811 for cell in get_cells():
2811 result = self.run_cell(cell, silent=True, shell_futures=shell_futures)
2812 result = self.run_cell(cell, silent=True, shell_futures=shell_futures)
2812 if raise_exceptions:
2813 if raise_exceptions:
2813 result.raise_error()
2814 result.raise_error()
2814 elif not result.success:
2815 elif not result.success:
2815 break
2816 break
2816 except:
2817 except:
2817 if raise_exceptions:
2818 if raise_exceptions:
2818 raise
2819 raise
2819 self.showtraceback()
2820 self.showtraceback()
2820 warn('Unknown failure executing file: <%s>' % fname)
2821 warn('Unknown failure executing file: <%s>' % fname)
2821
2822
2822 def safe_run_module(self, mod_name, where):
2823 def safe_run_module(self, mod_name, where):
2823 """A safe version of runpy.run_module().
2824 """A safe version of runpy.run_module().
2824
2825
2825 This version will never throw an exception, but instead print
2826 This version will never throw an exception, but instead print
2826 helpful error messages to the screen.
2827 helpful error messages to the screen.
2827
2828
2828 `SystemExit` exceptions with status code 0 or None are ignored.
2829 `SystemExit` exceptions with status code 0 or None are ignored.
2829
2830
2830 Parameters
2831 Parameters
2831 ----------
2832 ----------
2832 mod_name : string
2833 mod_name : string
2833 The name of the module to be executed.
2834 The name of the module to be executed.
2834 where : dict
2835 where : dict
2835 The globals namespace.
2836 The globals namespace.
2836 """
2837 """
2837 try:
2838 try:
2838 try:
2839 try:
2839 where.update(
2840 where.update(
2840 runpy.run_module(str(mod_name), run_name="__main__",
2841 runpy.run_module(str(mod_name), run_name="__main__",
2841 alter_sys=True)
2842 alter_sys=True)
2842 )
2843 )
2843 except SystemExit as status:
2844 except SystemExit as status:
2844 if status.code:
2845 if status.code:
2845 raise
2846 raise
2846 except:
2847 except:
2847 self.showtraceback()
2848 self.showtraceback()
2848 warn('Unknown failure executing module: <%s>' % mod_name)
2849 warn('Unknown failure executing module: <%s>' % mod_name)
2849
2850
2850 def run_cell(self, raw_cell, store_history=False, silent=False, shell_futures=True):
2851 def run_cell(self, raw_cell, store_history=False, silent=False, shell_futures=True):
2851 """Run a complete IPython cell.
2852 """Run a complete IPython cell.
2852
2853
2853 Parameters
2854 Parameters
2854 ----------
2855 ----------
2855 raw_cell : str
2856 raw_cell : str
2856 The code (including IPython code such as %magic functions) to run.
2857 The code (including IPython code such as %magic functions) to run.
2857 store_history : bool
2858 store_history : bool
2858 If True, the raw and translated cell will be stored in IPython's
2859 If True, the raw and translated cell will be stored in IPython's
2859 history. For user code calling back into IPython's machinery, this
2860 history. For user code calling back into IPython's machinery, this
2860 should be set to False.
2861 should be set to False.
2861 silent : bool
2862 silent : bool
2862 If True, avoid side-effects, such as implicit displayhooks and
2863 If True, avoid side-effects, such as implicit displayhooks and
2863 and logging. silent=True forces store_history=False.
2864 and logging. silent=True forces store_history=False.
2864 shell_futures : bool
2865 shell_futures : bool
2865 If True, the code will share future statements with the interactive
2866 If True, the code will share future statements with the interactive
2866 shell. It will both be affected by previous __future__ imports, and
2867 shell. It will both be affected by previous __future__ imports, and
2867 any __future__ imports in the code will affect the shell. If False,
2868 any __future__ imports in the code will affect the shell. If False,
2868 __future__ imports are not shared in either direction.
2869 __future__ imports are not shared in either direction.
2869
2870
2870 Returns
2871 Returns
2871 -------
2872 -------
2872 result : :class:`ExecutionResult`
2873 result : :class:`ExecutionResult`
2873 """
2874 """
2874 result = None
2875 result = None
2875 try:
2876 try:
2876 result = self._run_cell(
2877 result = self._run_cell(
2877 raw_cell, store_history, silent, shell_futures)
2878 raw_cell, store_history, silent, shell_futures)
2878 finally:
2879 finally:
2879 self.events.trigger('post_execute')
2880 self.events.trigger('post_execute')
2880 if not silent:
2881 if not silent:
2881 self.events.trigger('post_run_cell', result)
2882 self.events.trigger('post_run_cell', result)
2882 return result
2883 return result
2883
2884
2884 def _run_cell(self, raw_cell:str, store_history:bool, silent:bool, shell_futures:bool):
2885 def _run_cell(self, raw_cell:str, store_history:bool, silent:bool, shell_futures:bool):
2885 """Internal method to run a complete IPython cell."""
2886 """Internal method to run a complete IPython cell."""
2886
2887
2887 # we need to avoid calling self.transform_cell multiple time on the same thing
2888 # we need to avoid calling self.transform_cell multiple time on the same thing
2888 # so we need to store some results:
2889 # so we need to store some results:
2889 preprocessing_exc_tuple = None
2890 preprocessing_exc_tuple = None
2890 try:
2891 try:
2891 transformed_cell = self.transform_cell(raw_cell)
2892 transformed_cell = self.transform_cell(raw_cell)
2892 except Exception:
2893 except Exception:
2893 transformed_cell = raw_cell
2894 transformed_cell = raw_cell
2894 preprocessing_exc_tuple = sys.exc_info()
2895 preprocessing_exc_tuple = sys.exc_info()
2895
2896
2896 assert transformed_cell is not None
2897 assert transformed_cell is not None
2897 coro = self.run_cell_async(
2898 coro = self.run_cell_async(
2898 raw_cell,
2899 raw_cell,
2899 store_history=store_history,
2900 store_history=store_history,
2900 silent=silent,
2901 silent=silent,
2901 shell_futures=shell_futures,
2902 shell_futures=shell_futures,
2902 transformed_cell=transformed_cell,
2903 transformed_cell=transformed_cell,
2903 preprocessing_exc_tuple=preprocessing_exc_tuple,
2904 preprocessing_exc_tuple=preprocessing_exc_tuple,
2904 )
2905 )
2905
2906
2906 # run_cell_async is async, but may not actually need an eventloop.
2907 # run_cell_async is async, but may not actually need an eventloop.
2907 # when this is the case, we want to run it using the pseudo_sync_runner
2908 # when this is the case, we want to run it using the pseudo_sync_runner
2908 # so that code can invoke eventloops (for example via the %run , and
2909 # so that code can invoke eventloops (for example via the %run , and
2909 # `%paste` magic.
2910 # `%paste` magic.
2910 if self.trio_runner:
2911 if self.trio_runner:
2911 runner = self.trio_runner
2912 runner = self.trio_runner
2912 elif self.should_run_async(
2913 elif self.should_run_async(
2913 raw_cell,
2914 raw_cell,
2914 transformed_cell=transformed_cell,
2915 transformed_cell=transformed_cell,
2915 preprocessing_exc_tuple=preprocessing_exc_tuple,
2916 preprocessing_exc_tuple=preprocessing_exc_tuple,
2916 ):
2917 ):
2917 runner = self.loop_runner
2918 runner = self.loop_runner
2918 else:
2919 else:
2919 runner = _pseudo_sync_runner
2920 runner = _pseudo_sync_runner
2920
2921
2921 try:
2922 try:
2922 return runner(coro)
2923 return runner(coro)
2923 except BaseException as e:
2924 except BaseException as e:
2924 info = ExecutionInfo(raw_cell, store_history, silent, shell_futures)
2925 info = ExecutionInfo(raw_cell, store_history, silent, shell_futures)
2925 result = ExecutionResult(info)
2926 result = ExecutionResult(info)
2926 result.error_in_exec = e
2927 result.error_in_exec = e
2927 self.showtraceback(running_compiled_code=True)
2928 self.showtraceback(running_compiled_code=True)
2928 return result
2929 return result
2929 return
2930 return
2930
2931
2931 def should_run_async(
2932 def should_run_async(
2932 self, raw_cell: str, *, transformed_cell=None, preprocessing_exc_tuple=None
2933 self, raw_cell: str, *, transformed_cell=None, preprocessing_exc_tuple=None
2933 ) -> bool:
2934 ) -> bool:
2934 """Return whether a cell should be run asynchronously via a coroutine runner
2935 """Return whether a cell should be run asynchronously via a coroutine runner
2935
2936
2936 Parameters
2937 Parameters
2937 ----------
2938 ----------
2938 raw_cell: str
2939 raw_cell: str
2939 The code to be executed
2940 The code to be executed
2940
2941
2941 Returns
2942 Returns
2942 -------
2943 -------
2943 result: bool
2944 result: bool
2944 Whether the code needs to be run with a coroutine runner or not
2945 Whether the code needs to be run with a coroutine runner or not
2945
2946
2946 .. versionadded: 7.0
2947 .. versionadded: 7.0
2947 """
2948 """
2948 if not self.autoawait:
2949 if not self.autoawait:
2949 return False
2950 return False
2950 if preprocessing_exc_tuple is not None:
2951 if preprocessing_exc_tuple is not None:
2951 return False
2952 return False
2952 assert preprocessing_exc_tuple is None
2953 assert preprocessing_exc_tuple is None
2953 if transformed_cell is None:
2954 if transformed_cell is None:
2954 warnings.warn(
2955 warnings.warn(
2955 "`should_run_async` will not call `transform_cell`"
2956 "`should_run_async` will not call `transform_cell`"
2956 " automatically in the future. Please pass the result to"
2957 " automatically in the future. Please pass the result to"
2957 " `transformed_cell` argument and any exception that happen"
2958 " `transformed_cell` argument and any exception that happen"
2958 " during the"
2959 " during the"
2959 "transform in `preprocessing_exc_tuple` in"
2960 "transform in `preprocessing_exc_tuple` in"
2960 " IPython 7.17 and above.",
2961 " IPython 7.17 and above.",
2961 DeprecationWarning,
2962 DeprecationWarning,
2962 stacklevel=2,
2963 stacklevel=2,
2963 )
2964 )
2964 try:
2965 try:
2965 cell = self.transform_cell(raw_cell)
2966 cell = self.transform_cell(raw_cell)
2966 except Exception:
2967 except Exception:
2967 # any exception during transform will be raised
2968 # any exception during transform will be raised
2968 # prior to execution
2969 # prior to execution
2969 return False
2970 return False
2970 else:
2971 else:
2971 cell = transformed_cell
2972 cell = transformed_cell
2972 return _should_be_async(cell)
2973 return _should_be_async(cell)
2973
2974
2974 async def run_cell_async(
2975 async def run_cell_async(
2975 self,
2976 self,
2976 raw_cell: str,
2977 raw_cell: str,
2977 store_history=False,
2978 store_history=False,
2978 silent=False,
2979 silent=False,
2979 shell_futures=True,
2980 shell_futures=True,
2980 *,
2981 *,
2981 transformed_cell: Optional[str] = None,
2982 transformed_cell: Optional[str] = None,
2982 preprocessing_exc_tuple: Optional[Any] = None
2983 preprocessing_exc_tuple: Optional[Any] = None
2983 ) -> ExecutionResult:
2984 ) -> ExecutionResult:
2984 """Run a complete IPython cell asynchronously.
2985 """Run a complete IPython cell asynchronously.
2985
2986
2986 Parameters
2987 Parameters
2987 ----------
2988 ----------
2988 raw_cell : str
2989 raw_cell : str
2989 The code (including IPython code such as %magic functions) to run.
2990 The code (including IPython code such as %magic functions) to run.
2990 store_history : bool
2991 store_history : bool
2991 If True, the raw and translated cell will be stored in IPython's
2992 If True, the raw and translated cell will be stored in IPython's
2992 history. For user code calling back into IPython's machinery, this
2993 history. For user code calling back into IPython's machinery, this
2993 should be set to False.
2994 should be set to False.
2994 silent : bool
2995 silent : bool
2995 If True, avoid side-effects, such as implicit displayhooks and
2996 If True, avoid side-effects, such as implicit displayhooks and
2996 and logging. silent=True forces store_history=False.
2997 and logging. silent=True forces store_history=False.
2997 shell_futures : bool
2998 shell_futures : bool
2998 If True, the code will share future statements with the interactive
2999 If True, the code will share future statements with the interactive
2999 shell. It will both be affected by previous __future__ imports, and
3000 shell. It will both be affected by previous __future__ imports, and
3000 any __future__ imports in the code will affect the shell. If False,
3001 any __future__ imports in the code will affect the shell. If False,
3001 __future__ imports are not shared in either direction.
3002 __future__ imports are not shared in either direction.
3002 transformed_cell: str
3003 transformed_cell: str
3003 cell that was passed through transformers
3004 cell that was passed through transformers
3004 preprocessing_exc_tuple:
3005 preprocessing_exc_tuple:
3005 trace if the transformation failed.
3006 trace if the transformation failed.
3006
3007
3007 Returns
3008 Returns
3008 -------
3009 -------
3009 result : :class:`ExecutionResult`
3010 result : :class:`ExecutionResult`
3010
3011
3011 .. versionadded: 7.0
3012 .. versionadded: 7.0
3012 """
3013 """
3013 info = ExecutionInfo(
3014 info = ExecutionInfo(
3014 raw_cell, store_history, silent, shell_futures)
3015 raw_cell, store_history, silent, shell_futures)
3015 result = ExecutionResult(info)
3016 result = ExecutionResult(info)
3016
3017
3017 if (not raw_cell) or raw_cell.isspace():
3018 if (not raw_cell) or raw_cell.isspace():
3018 self.last_execution_succeeded = True
3019 self.last_execution_succeeded = True
3019 self.last_execution_result = result
3020 self.last_execution_result = result
3020 return result
3021 return result
3021
3022
3022 if silent:
3023 if silent:
3023 store_history = False
3024 store_history = False
3024
3025
3025 if store_history:
3026 if store_history:
3026 result.execution_count = self.execution_count
3027 result.execution_count = self.execution_count
3027
3028
3028 def error_before_exec(value):
3029 def error_before_exec(value):
3029 if store_history:
3030 if store_history:
3030 self.execution_count += 1
3031 self.execution_count += 1
3031 result.error_before_exec = value
3032 result.error_before_exec = value
3032 self.last_execution_succeeded = False
3033 self.last_execution_succeeded = False
3033 self.last_execution_result = result
3034 self.last_execution_result = result
3034 return result
3035 return result
3035
3036
3036 self.events.trigger('pre_execute')
3037 self.events.trigger('pre_execute')
3037 if not silent:
3038 if not silent:
3038 self.events.trigger('pre_run_cell', info)
3039 self.events.trigger('pre_run_cell', info)
3039
3040
3040 if transformed_cell is None:
3041 if transformed_cell is None:
3041 warnings.warn(
3042 warnings.warn(
3042 "`run_cell_async` will not call `transform_cell`"
3043 "`run_cell_async` will not call `transform_cell`"
3043 " automatically in the future. Please pass the result to"
3044 " automatically in the future. Please pass the result to"
3044 " `transformed_cell` argument and any exception that happen"
3045 " `transformed_cell` argument and any exception that happen"
3045 " during the"
3046 " during the"
3046 "transform in `preprocessing_exc_tuple` in"
3047 "transform in `preprocessing_exc_tuple` in"
3047 " IPython 7.17 and above.",
3048 " IPython 7.17 and above.",
3048 DeprecationWarning,
3049 DeprecationWarning,
3049 stacklevel=2,
3050 stacklevel=2,
3050 )
3051 )
3051 # If any of our input transformation (input_transformer_manager or
3052 # If any of our input transformation (input_transformer_manager or
3052 # prefilter_manager) raises an exception, we store it in this variable
3053 # prefilter_manager) raises an exception, we store it in this variable
3053 # so that we can display the error after logging the input and storing
3054 # so that we can display the error after logging the input and storing
3054 # it in the history.
3055 # it in the history.
3055 try:
3056 try:
3056 cell = self.transform_cell(raw_cell)
3057 cell = self.transform_cell(raw_cell)
3057 except Exception:
3058 except Exception:
3058 preprocessing_exc_tuple = sys.exc_info()
3059 preprocessing_exc_tuple = sys.exc_info()
3059 cell = raw_cell # cell has to exist so it can be stored/logged
3060 cell = raw_cell # cell has to exist so it can be stored/logged
3060 else:
3061 else:
3061 preprocessing_exc_tuple = None
3062 preprocessing_exc_tuple = None
3062 else:
3063 else:
3063 if preprocessing_exc_tuple is None:
3064 if preprocessing_exc_tuple is None:
3064 cell = transformed_cell
3065 cell = transformed_cell
3065 else:
3066 else:
3066 cell = raw_cell
3067 cell = raw_cell
3067
3068
3068 # Store raw and processed history
3069 # Store raw and processed history
3069 if store_history:
3070 if store_history:
3070 self.history_manager.store_inputs(self.execution_count,
3071 self.history_manager.store_inputs(self.execution_count,
3071 cell, raw_cell)
3072 cell, raw_cell)
3072 if not silent:
3073 if not silent:
3073 self.logger.log(cell, raw_cell)
3074 self.logger.log(cell, raw_cell)
3074
3075
3075 # Display the exception if input processing failed.
3076 # Display the exception if input processing failed.
3076 if preprocessing_exc_tuple is not None:
3077 if preprocessing_exc_tuple is not None:
3077 self.showtraceback(preprocessing_exc_tuple)
3078 self.showtraceback(preprocessing_exc_tuple)
3078 if store_history:
3079 if store_history:
3079 self.execution_count += 1
3080 self.execution_count += 1
3080 return error_before_exec(preprocessing_exc_tuple[1])
3081 return error_before_exec(preprocessing_exc_tuple[1])
3081
3082
3082 # Our own compiler remembers the __future__ environment. If we want to
3083 # Our own compiler remembers the __future__ environment. If we want to
3083 # run code with a separate __future__ environment, use the default
3084 # run code with a separate __future__ environment, use the default
3084 # compiler
3085 # compiler
3085 compiler = self.compile if shell_futures else CachingCompiler()
3086 compiler = self.compile if shell_futures else CachingCompiler()
3086
3087
3087 _run_async = False
3088 _run_async = False
3088
3089
3089 with self.builtin_trap:
3090 with self.builtin_trap:
3090 cell_name = self.compile.cache(cell, self.execution_count)
3091 cell_name = self.compile.cache(cell, self.execution_count)
3091
3092
3092 with self.display_trap:
3093 with self.display_trap:
3093 # Compile to bytecode
3094 # Compile to bytecode
3094 try:
3095 try:
3095 if sys.version_info < (3,8) and self.autoawait:
3096 if sys.version_info < (3,8) and self.autoawait:
3096 if _should_be_async(cell):
3097 if _should_be_async(cell):
3097 # the code AST below will not be user code: we wrap it
3098 # the code AST below will not be user code: we wrap it
3098 # in an `async def`. This will likely make some AST
3099 # in an `async def`. This will likely make some AST
3099 # transformer below miss some transform opportunity and
3100 # transformer below miss some transform opportunity and
3100 # introduce a small coupling to run_code (in which we
3101 # introduce a small coupling to run_code (in which we
3101 # bake some assumptions of what _ast_asyncify returns.
3102 # bake some assumptions of what _ast_asyncify returns.
3102 # they are ways around (like grafting part of the ast
3103 # they are ways around (like grafting part of the ast
3103 # later:
3104 # later:
3104 # - Here, return code_ast.body[0].body[1:-1], as well
3105 # - Here, return code_ast.body[0].body[1:-1], as well
3105 # as last expression in return statement which is
3106 # as last expression in return statement which is
3106 # the user code part.
3107 # the user code part.
3107 # - Let it go through the AST transformers, and graft
3108 # - Let it go through the AST transformers, and graft
3108 # - it back after the AST transform
3109 # - it back after the AST transform
3109 # But that seem unreasonable, at least while we
3110 # But that seem unreasonable, at least while we
3110 # do not need it.
3111 # do not need it.
3111 code_ast = _ast_asyncify(cell, 'async-def-wrapper')
3112 code_ast = _ast_asyncify(cell, 'async-def-wrapper')
3112 _run_async = True
3113 _run_async = True
3113 else:
3114 else:
3114 code_ast = compiler.ast_parse(cell, filename=cell_name)
3115 code_ast = compiler.ast_parse(cell, filename=cell_name)
3115 else:
3116 else:
3116 code_ast = compiler.ast_parse(cell, filename=cell_name)
3117 code_ast = compiler.ast_parse(cell, filename=cell_name)
3117 except self.custom_exceptions as e:
3118 except self.custom_exceptions as e:
3118 etype, value, tb = sys.exc_info()
3119 etype, value, tb = sys.exc_info()
3119 self.CustomTB(etype, value, tb)
3120 self.CustomTB(etype, value, tb)
3120 return error_before_exec(e)
3121 return error_before_exec(e)
3121 except IndentationError as e:
3122 except IndentationError as e:
3122 self.showindentationerror()
3123 self.showindentationerror()
3123 return error_before_exec(e)
3124 return error_before_exec(e)
3124 except (OverflowError, SyntaxError, ValueError, TypeError,
3125 except (OverflowError, SyntaxError, ValueError, TypeError,
3125 MemoryError) as e:
3126 MemoryError) as e:
3126 self.showsyntaxerror()
3127 self.showsyntaxerror()
3127 return error_before_exec(e)
3128 return error_before_exec(e)
3128
3129
3129 # Apply AST transformations
3130 # Apply AST transformations
3130 try:
3131 try:
3131 code_ast = self.transform_ast(code_ast)
3132 code_ast = self.transform_ast(code_ast)
3132 except InputRejected as e:
3133 except InputRejected as e:
3133 self.showtraceback()
3134 self.showtraceback()
3134 return error_before_exec(e)
3135 return error_before_exec(e)
3135
3136
3136 # Give the displayhook a reference to our ExecutionResult so it
3137 # Give the displayhook a reference to our ExecutionResult so it
3137 # can fill in the output value.
3138 # can fill in the output value.
3138 self.displayhook.exec_result = result
3139 self.displayhook.exec_result = result
3139
3140
3140 # Execute the user code
3141 # Execute the user code
3141 interactivity = "none" if silent else self.ast_node_interactivity
3142 interactivity = "none" if silent else self.ast_node_interactivity
3142 if _run_async:
3143 if _run_async:
3143 interactivity = 'async'
3144 interactivity = 'async'
3144
3145
3145 has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
3146 has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
3146 interactivity=interactivity, compiler=compiler, result=result)
3147 interactivity=interactivity, compiler=compiler, result=result)
3147
3148
3148 self.last_execution_succeeded = not has_raised
3149 self.last_execution_succeeded = not has_raised
3149 self.last_execution_result = result
3150 self.last_execution_result = result
3150
3151
3151 # Reset this so later displayed values do not modify the
3152 # Reset this so later displayed values do not modify the
3152 # ExecutionResult
3153 # ExecutionResult
3153 self.displayhook.exec_result = None
3154 self.displayhook.exec_result = None
3154
3155
3155 if store_history:
3156 if store_history:
3156 # Write output to the database. Does nothing unless
3157 # Write output to the database. Does nothing unless
3157 # history output logging is enabled.
3158 # history output logging is enabled.
3158 self.history_manager.store_output(self.execution_count)
3159 self.history_manager.store_output(self.execution_count)
3159 # Each cell is a *single* input, regardless of how many lines it has
3160 # Each cell is a *single* input, regardless of how many lines it has
3160 self.execution_count += 1
3161 self.execution_count += 1
3161
3162
3162 return result
3163 return result
3163
3164
3164 def transform_cell(self, raw_cell):
3165 def transform_cell(self, raw_cell):
3165 """Transform an input cell before parsing it.
3166 """Transform an input cell before parsing it.
3166
3167
3167 Static transformations, implemented in IPython.core.inputtransformer2,
3168 Static transformations, implemented in IPython.core.inputtransformer2,
3168 deal with things like ``%magic`` and ``!system`` commands.
3169 deal with things like ``%magic`` and ``!system`` commands.
3169 These run on all input.
3170 These run on all input.
3170 Dynamic transformations, for things like unescaped magics and the exit
3171 Dynamic transformations, for things like unescaped magics and the exit
3171 autocall, depend on the state of the interpreter.
3172 autocall, depend on the state of the interpreter.
3172 These only apply to single line inputs.
3173 These only apply to single line inputs.
3173
3174
3174 These string-based transformations are followed by AST transformations;
3175 These string-based transformations are followed by AST transformations;
3175 see :meth:`transform_ast`.
3176 see :meth:`transform_ast`.
3176 """
3177 """
3177 # Static input transformations
3178 # Static input transformations
3178 cell = self.input_transformer_manager.transform_cell(raw_cell)
3179 cell = self.input_transformer_manager.transform_cell(raw_cell)
3179
3180
3180 if len(cell.splitlines()) == 1:
3181 if len(cell.splitlines()) == 1:
3181 # Dynamic transformations - only applied for single line commands
3182 # Dynamic transformations - only applied for single line commands
3182 with self.builtin_trap:
3183 with self.builtin_trap:
3183 # use prefilter_lines to handle trailing newlines
3184 # use prefilter_lines to handle trailing newlines
3184 # restore trailing newline for ast.parse
3185 # restore trailing newline for ast.parse
3185 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
3186 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
3186
3187
3187 lines = cell.splitlines(keepends=True)
3188 lines = cell.splitlines(keepends=True)
3188 for transform in self.input_transformers_post:
3189 for transform in self.input_transformers_post:
3189 lines = transform(lines)
3190 lines = transform(lines)
3190 cell = ''.join(lines)
3191 cell = ''.join(lines)
3191
3192
3192 return cell
3193 return cell
3193
3194
3194 def transform_ast(self, node):
3195 def transform_ast(self, node):
3195 """Apply the AST transformations from self.ast_transformers
3196 """Apply the AST transformations from self.ast_transformers
3196
3197
3197 Parameters
3198 Parameters
3198 ----------
3199 ----------
3199 node : ast.Node
3200 node : ast.Node
3200 The root node to be transformed. Typically called with the ast.Module
3201 The root node to be transformed. Typically called with the ast.Module
3201 produced by parsing user input.
3202 produced by parsing user input.
3202
3203
3203 Returns
3204 Returns
3204 -------
3205 -------
3205 An ast.Node corresponding to the node it was called with. Note that it
3206 An ast.Node corresponding to the node it was called with. Note that it
3206 may also modify the passed object, so don't rely on references to the
3207 may also modify the passed object, so don't rely on references to the
3207 original AST.
3208 original AST.
3208 """
3209 """
3209 for transformer in self.ast_transformers:
3210 for transformer in self.ast_transformers:
3210 try:
3211 try:
3211 node = transformer.visit(node)
3212 node = transformer.visit(node)
3212 except InputRejected:
3213 except InputRejected:
3213 # User-supplied AST transformers can reject an input by raising
3214 # User-supplied AST transformers can reject an input by raising
3214 # an InputRejected. Short-circuit in this case so that we
3215 # an InputRejected. Short-circuit in this case so that we
3215 # don't unregister the transform.
3216 # don't unregister the transform.
3216 raise
3217 raise
3217 except Exception:
3218 except Exception:
3218 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
3219 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
3219 self.ast_transformers.remove(transformer)
3220 self.ast_transformers.remove(transformer)
3220
3221
3221 if self.ast_transformers:
3222 if self.ast_transformers:
3222 ast.fix_missing_locations(node)
3223 ast.fix_missing_locations(node)
3223 return node
3224 return node
3224
3225
3225 async def run_ast_nodes(self, nodelist:ListType[AST], cell_name:str, interactivity='last_expr',
3226 async def run_ast_nodes(self, nodelist:ListType[AST], cell_name:str, interactivity='last_expr',
3226 compiler=compile, result=None):
3227 compiler=compile, result=None):
3227 """Run a sequence of AST nodes. The execution mode depends on the
3228 """Run a sequence of AST nodes. The execution mode depends on the
3228 interactivity parameter.
3229 interactivity parameter.
3229
3230
3230 Parameters
3231 Parameters
3231 ----------
3232 ----------
3232 nodelist : list
3233 nodelist : list
3233 A sequence of AST nodes to run.
3234 A sequence of AST nodes to run.
3234 cell_name : str
3235 cell_name : str
3235 Will be passed to the compiler as the filename of the cell. Typically
3236 Will be passed to the compiler as the filename of the cell. Typically
3236 the value returned by ip.compile.cache(cell).
3237 the value returned by ip.compile.cache(cell).
3237 interactivity : str
3238 interactivity : str
3238 'all', 'last', 'last_expr' , 'last_expr_or_assign' or 'none',
3239 'all', 'last', 'last_expr' , 'last_expr_or_assign' or 'none',
3239 specifying which nodes should be run interactively (displaying output
3240 specifying which nodes should be run interactively (displaying output
3240 from expressions). 'last_expr' will run the last node interactively
3241 from expressions). 'last_expr' will run the last node interactively
3241 only if it is an expression (i.e. expressions in loops or other blocks
3242 only if it is an expression (i.e. expressions in loops or other blocks
3242 are not displayed) 'last_expr_or_assign' will run the last expression
3243 are not displayed) 'last_expr_or_assign' will run the last expression
3243 or the last assignment. Other values for this parameter will raise a
3244 or the last assignment. Other values for this parameter will raise a
3244 ValueError.
3245 ValueError.
3245
3246
3246 Experimental value: 'async' Will try to run top level interactive
3247 Experimental value: 'async' Will try to run top level interactive
3247 async/await code in default runner, this will not respect the
3248 async/await code in default runner, this will not respect the
3248 interactivity setting and will only run the last node if it is an
3249 interactivity setting and will only run the last node if it is an
3249 expression.
3250 expression.
3250
3251
3251 compiler : callable
3252 compiler : callable
3252 A function with the same interface as the built-in compile(), to turn
3253 A function with the same interface as the built-in compile(), to turn
3253 the AST nodes into code objects. Default is the built-in compile().
3254 the AST nodes into code objects. Default is the built-in compile().
3254 result : ExecutionResult, optional
3255 result : ExecutionResult, optional
3255 An object to store exceptions that occur during execution.
3256 An object to store exceptions that occur during execution.
3256
3257
3257 Returns
3258 Returns
3258 -------
3259 -------
3259 True if an exception occurred while running code, False if it finished
3260 True if an exception occurred while running code, False if it finished
3260 running.
3261 running.
3261 """
3262 """
3262 if not nodelist:
3263 if not nodelist:
3263 return
3264 return
3264
3265
3265 if interactivity == 'last_expr_or_assign':
3266 if interactivity == 'last_expr_or_assign':
3266 if isinstance(nodelist[-1], _assign_nodes):
3267 if isinstance(nodelist[-1], _assign_nodes):
3267 asg = nodelist[-1]
3268 asg = nodelist[-1]
3268 if isinstance(asg, ast.Assign) and len(asg.targets) == 1:
3269 if isinstance(asg, ast.Assign) and len(asg.targets) == 1:
3269 target = asg.targets[0]
3270 target = asg.targets[0]
3270 elif isinstance(asg, _single_targets_nodes):
3271 elif isinstance(asg, _single_targets_nodes):
3271 target = asg.target
3272 target = asg.target
3272 else:
3273 else:
3273 target = None
3274 target = None
3274 if isinstance(target, ast.Name):
3275 if isinstance(target, ast.Name):
3275 nnode = ast.Expr(ast.Name(target.id, ast.Load()))
3276 nnode = ast.Expr(ast.Name(target.id, ast.Load()))
3276 ast.fix_missing_locations(nnode)
3277 ast.fix_missing_locations(nnode)
3277 nodelist.append(nnode)
3278 nodelist.append(nnode)
3278 interactivity = 'last_expr'
3279 interactivity = 'last_expr'
3279
3280
3280 _async = False
3281 _async = False
3281 if interactivity == 'last_expr':
3282 if interactivity == 'last_expr':
3282 if isinstance(nodelist[-1], ast.Expr):
3283 if isinstance(nodelist[-1], ast.Expr):
3283 interactivity = "last"
3284 interactivity = "last"
3284 else:
3285 else:
3285 interactivity = "none"
3286 interactivity = "none"
3286
3287
3287 if interactivity == 'none':
3288 if interactivity == 'none':
3288 to_run_exec, to_run_interactive = nodelist, []
3289 to_run_exec, to_run_interactive = nodelist, []
3289 elif interactivity == 'last':
3290 elif interactivity == 'last':
3290 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
3291 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
3291 elif interactivity == 'all':
3292 elif interactivity == 'all':
3292 to_run_exec, to_run_interactive = [], nodelist
3293 to_run_exec, to_run_interactive = [], nodelist
3293 elif interactivity == 'async':
3294 elif interactivity == 'async':
3294 to_run_exec, to_run_interactive = [], nodelist
3295 to_run_exec, to_run_interactive = [], nodelist
3295 _async = True
3296 _async = True
3296 else:
3297 else:
3297 raise ValueError("Interactivity was %r" % interactivity)
3298 raise ValueError("Interactivity was %r" % interactivity)
3298
3299
3299 try:
3300 try:
3300 if _async and sys.version_info > (3,8):
3301 if _async and sys.version_info > (3,8):
3301 raise ValueError("This branch should never happen on Python 3.8 and above, "
3302 raise ValueError("This branch should never happen on Python 3.8 and above, "
3302 "please try to upgrade IPython and open a bug report with your case.")
3303 "please try to upgrade IPython and open a bug report with your case.")
3303 if _async:
3304 if _async:
3304 # If interactivity is async the semantics of run_code are
3305 # If interactivity is async the semantics of run_code are
3305 # completely different Skip usual machinery.
3306 # completely different Skip usual machinery.
3306 mod = Module(nodelist, [])
3307 mod = Module(nodelist, [])
3307 async_wrapper_code = compiler(mod, cell_name, 'exec')
3308 async_wrapper_code = compiler(mod, cell_name, 'exec')
3308 exec(async_wrapper_code, self.user_global_ns, self.user_ns)
3309 exec(async_wrapper_code, self.user_global_ns, self.user_ns)
3309 async_code = removed_co_newlocals(self.user_ns.pop('async-def-wrapper')).__code__
3310 async_code = removed_co_newlocals(self.user_ns.pop('async-def-wrapper')).__code__
3310 if (await self.run_code(async_code, result, async_=True)):
3311 if (await self.run_code(async_code, result, async_=True)):
3311 return True
3312 return True
3312 else:
3313 else:
3313 if sys.version_info > (3, 8):
3314 if sys.version_info > (3, 8):
3314 def compare(code):
3315 def compare(code):
3315 is_async = (inspect.CO_COROUTINE & code.co_flags == inspect.CO_COROUTINE)
3316 is_async = (inspect.CO_COROUTINE & code.co_flags == inspect.CO_COROUTINE)
3316 return is_async
3317 return is_async
3317 else:
3318 else:
3318 def compare(code):
3319 def compare(code):
3319 return _async
3320 return _async
3320
3321
3321 # refactor that to just change the mod constructor.
3322 # refactor that to just change the mod constructor.
3322 to_run = []
3323 to_run = []
3323 for node in to_run_exec:
3324 for node in to_run_exec:
3324 to_run.append((node, 'exec'))
3325 to_run.append((node, 'exec'))
3325
3326
3326 for node in to_run_interactive:
3327 for node in to_run_interactive:
3327 to_run.append((node, 'single'))
3328 to_run.append((node, 'single'))
3328
3329
3329 for node,mode in to_run:
3330 for node,mode in to_run:
3330 if mode == 'exec':
3331 if mode == 'exec':
3331 mod = Module([node], [])
3332 mod = Module([node], [])
3332 elif mode == 'single':
3333 elif mode == 'single':
3333 mod = ast.Interactive([node])
3334 mod = ast.Interactive([node])
3334 with compiler.extra_flags(getattr(ast, 'PyCF_ALLOW_TOP_LEVEL_AWAIT', 0x0) if self.autoawait else 0x0):
3335 with compiler.extra_flags(getattr(ast, 'PyCF_ALLOW_TOP_LEVEL_AWAIT', 0x0) if self.autoawait else 0x0):
3335 code = compiler(mod, cell_name, mode)
3336 code = compiler(mod, cell_name, mode)
3336 asy = compare(code)
3337 asy = compare(code)
3337 if (await self.run_code(code, result, async_=asy)):
3338 if (await self.run_code(code, result, async_=asy)):
3338 return True
3339 return True
3339
3340
3340 # Flush softspace
3341 # Flush softspace
3341 if softspace(sys.stdout, 0):
3342 if softspace(sys.stdout, 0):
3342 print()
3343 print()
3343
3344
3344 except:
3345 except:
3345 # It's possible to have exceptions raised here, typically by
3346 # It's possible to have exceptions raised here, typically by
3346 # compilation of odd code (such as a naked 'return' outside a
3347 # compilation of odd code (such as a naked 'return' outside a
3347 # function) that did parse but isn't valid. Typically the exception
3348 # function) that did parse but isn't valid. Typically the exception
3348 # is a SyntaxError, but it's safest just to catch anything and show
3349 # is a SyntaxError, but it's safest just to catch anything and show
3349 # the user a traceback.
3350 # the user a traceback.
3350
3351
3351 # We do only one try/except outside the loop to minimize the impact
3352 # We do only one try/except outside the loop to minimize the impact
3352 # on runtime, and also because if any node in the node list is
3353 # on runtime, and also because if any node in the node list is
3353 # broken, we should stop execution completely.
3354 # broken, we should stop execution completely.
3354 if result:
3355 if result:
3355 result.error_before_exec = sys.exc_info()[1]
3356 result.error_before_exec = sys.exc_info()[1]
3356 self.showtraceback()
3357 self.showtraceback()
3357 return True
3358 return True
3358
3359
3359 return False
3360 return False
3360
3361
3361 def _async_exec(self, code_obj: types.CodeType, user_ns: dict):
3362 def _async_exec(self, code_obj: types.CodeType, user_ns: dict):
3362 """
3363 """
3363 Evaluate an asynchronous code object using a code runner
3364 Evaluate an asynchronous code object using a code runner
3364
3365
3365 Fake asynchronous execution of code_object in a namespace via a proxy namespace.
3366 Fake asynchronous execution of code_object in a namespace via a proxy namespace.
3366
3367
3367 Returns coroutine object, which can be executed via async loop runner
3368 Returns coroutine object, which can be executed via async loop runner
3368
3369
3369 WARNING: The semantics of `async_exec` are quite different from `exec`,
3370 WARNING: The semantics of `async_exec` are quite different from `exec`,
3370 in particular you can only pass a single namespace. It also return a
3371 in particular you can only pass a single namespace. It also return a
3371 handle to the value of the last things returned by code_object.
3372 handle to the value of the last things returned by code_object.
3372 """
3373 """
3373
3374
3374 return eval(code_obj, user_ns)
3375 return eval(code_obj, user_ns)
3375
3376
3376 async def run_code(self, code_obj, result=None, *, async_=False):
3377 async def run_code(self, code_obj, result=None, *, async_=False):
3377 """Execute a code object.
3378 """Execute a code object.
3378
3379
3379 When an exception occurs, self.showtraceback() is called to display a
3380 When an exception occurs, self.showtraceback() is called to display a
3380 traceback.
3381 traceback.
3381
3382
3382 Parameters
3383 Parameters
3383 ----------
3384 ----------
3384 code_obj : code object
3385 code_obj : code object
3385 A compiled code object, to be executed
3386 A compiled code object, to be executed
3386 result : ExecutionResult, optional
3387 result : ExecutionResult, optional
3387 An object to store exceptions that occur during execution.
3388 An object to store exceptions that occur during execution.
3388 async_ : Bool (Experimental)
3389 async_ : Bool (Experimental)
3389 Attempt to run top-level asynchronous code in a default loop.
3390 Attempt to run top-level asynchronous code in a default loop.
3390
3391
3391 Returns
3392 Returns
3392 -------
3393 -------
3393 False : successful execution.
3394 False : successful execution.
3394 True : an error occurred.
3395 True : an error occurred.
3395 """
3396 """
3396 # special value to say that anything above is IPython and should be
3397 # special value to say that anything above is IPython and should be
3397 # hidden.
3398 # hidden.
3398 __tracebackhide__ = "__ipython_bottom__"
3399 __tracebackhide__ = "__ipython_bottom__"
3399 # Set our own excepthook in case the user code tries to call it
3400 # Set our own excepthook in case the user code tries to call it
3400 # directly, so that the IPython crash handler doesn't get triggered
3401 # directly, so that the IPython crash handler doesn't get triggered
3401 old_excepthook, sys.excepthook = sys.excepthook, self.excepthook
3402 old_excepthook, sys.excepthook = sys.excepthook, self.excepthook
3402
3403
3403 # we save the original sys.excepthook in the instance, in case config
3404 # we save the original sys.excepthook in the instance, in case config
3404 # code (such as magics) needs access to it.
3405 # code (such as magics) needs access to it.
3405 self.sys_excepthook = old_excepthook
3406 self.sys_excepthook = old_excepthook
3406 outflag = True # happens in more places, so it's easier as default
3407 outflag = True # happens in more places, so it's easier as default
3407 try:
3408 try:
3408 try:
3409 try:
3409 self.hooks.pre_run_code_hook()
3410 self.hooks.pre_run_code_hook()
3410 if async_ and sys.version_info < (3,8):
3411 if async_ and sys.version_info < (3,8):
3411 last_expr = (await self._async_exec(code_obj, self.user_ns))
3412 last_expr = (await self._async_exec(code_obj, self.user_ns))
3412 code = compile('last_expr', 'fake', "single")
3413 code = compile('last_expr', 'fake', "single")
3413 exec(code, {'last_expr': last_expr})
3414 exec(code, {'last_expr': last_expr})
3414 elif async_ :
3415 elif async_ :
3415 await eval(code_obj, self.user_global_ns, self.user_ns)
3416 await eval(code_obj, self.user_global_ns, self.user_ns)
3416 else:
3417 else:
3417 exec(code_obj, self.user_global_ns, self.user_ns)
3418 exec(code_obj, self.user_global_ns, self.user_ns)
3418 finally:
3419 finally:
3419 # Reset our crash handler in place
3420 # Reset our crash handler in place
3420 sys.excepthook = old_excepthook
3421 sys.excepthook = old_excepthook
3421 except SystemExit as e:
3422 except SystemExit as e:
3422 if result is not None:
3423 if result is not None:
3423 result.error_in_exec = e
3424 result.error_in_exec = e
3424 self.showtraceback(exception_only=True)
3425 self.showtraceback(exception_only=True)
3425 warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
3426 warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
3426 except self.custom_exceptions:
3427 except self.custom_exceptions:
3427 etype, value, tb = sys.exc_info()
3428 etype, value, tb = sys.exc_info()
3428 if result is not None:
3429 if result is not None:
3429 result.error_in_exec = value
3430 result.error_in_exec = value
3430 self.CustomTB(etype, value, tb)
3431 self.CustomTB(etype, value, tb)
3431 except:
3432 except:
3432 if result is not None:
3433 if result is not None:
3433 result.error_in_exec = sys.exc_info()[1]
3434 result.error_in_exec = sys.exc_info()[1]
3434 self.showtraceback(running_compiled_code=True)
3435 self.showtraceback(running_compiled_code=True)
3435 else:
3436 else:
3436 outflag = False
3437 outflag = False
3437 return outflag
3438 return outflag
3438
3439
3439 # For backwards compatibility
3440 # For backwards compatibility
3440 runcode = run_code
3441 runcode = run_code
3441
3442
3442 def check_complete(self, code: str) -> Tuple[str, str]:
3443 def check_complete(self, code: str) -> Tuple[str, str]:
3443 """Return whether a block of code is ready to execute, or should be continued
3444 """Return whether a block of code is ready to execute, or should be continued
3444
3445
3445 Parameters
3446 Parameters
3446 ----------
3447 ----------
3447 source : string
3448 source : string
3448 Python input code, which can be multiline.
3449 Python input code, which can be multiline.
3449
3450
3450 Returns
3451 Returns
3451 -------
3452 -------
3452 status : str
3453 status : str
3453 One of 'complete', 'incomplete', or 'invalid' if source is not a
3454 One of 'complete', 'incomplete', or 'invalid' if source is not a
3454 prefix of valid code.
3455 prefix of valid code.
3455 indent : str
3456 indent : str
3456 When status is 'incomplete', this is some whitespace to insert on
3457 When status is 'incomplete', this is some whitespace to insert on
3457 the next line of the prompt.
3458 the next line of the prompt.
3458 """
3459 """
3459 status, nspaces = self.input_transformer_manager.check_complete(code)
3460 status, nspaces = self.input_transformer_manager.check_complete(code)
3460 return status, ' ' * (nspaces or 0)
3461 return status, ' ' * (nspaces or 0)
3461
3462
3462 #-------------------------------------------------------------------------
3463 #-------------------------------------------------------------------------
3463 # Things related to GUI support and pylab
3464 # Things related to GUI support and pylab
3464 #-------------------------------------------------------------------------
3465 #-------------------------------------------------------------------------
3465
3466
3466 active_eventloop = None
3467 active_eventloop = None
3467
3468
3468 def enable_gui(self, gui=None):
3469 def enable_gui(self, gui=None):
3469 raise NotImplementedError('Implement enable_gui in a subclass')
3470 raise NotImplementedError('Implement enable_gui in a subclass')
3470
3471
3471 def enable_matplotlib(self, gui=None):
3472 def enable_matplotlib(self, gui=None):
3472 """Enable interactive matplotlib and inline figure support.
3473 """Enable interactive matplotlib and inline figure support.
3473
3474
3474 This takes the following steps:
3475 This takes the following steps:
3475
3476
3476 1. select the appropriate eventloop and matplotlib backend
3477 1. select the appropriate eventloop and matplotlib backend
3477 2. set up matplotlib for interactive use with that backend
3478 2. set up matplotlib for interactive use with that backend
3478 3. configure formatters for inline figure display
3479 3. configure formatters for inline figure display
3479 4. enable the selected gui eventloop
3480 4. enable the selected gui eventloop
3480
3481
3481 Parameters
3482 Parameters
3482 ----------
3483 ----------
3483 gui : optional, string
3484 gui : optional, string
3484 If given, dictates the choice of matplotlib GUI backend to use
3485 If given, dictates the choice of matplotlib GUI backend to use
3485 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3486 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3486 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3487 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3487 matplotlib (as dictated by the matplotlib build-time options plus the
3488 matplotlib (as dictated by the matplotlib build-time options plus the
3488 user's matplotlibrc configuration file). Note that not all backends
3489 user's matplotlibrc configuration file). Note that not all backends
3489 make sense in all contexts, for example a terminal ipython can't
3490 make sense in all contexts, for example a terminal ipython can't
3490 display figures inline.
3491 display figures inline.
3491 """
3492 """
3492 from IPython.core import pylabtools as pt
3493 from IPython.core import pylabtools as pt
3493 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
3494 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
3494
3495
3495 if gui != 'inline':
3496 if gui != 'inline':
3496 # If we have our first gui selection, store it
3497 # If we have our first gui selection, store it
3497 if self.pylab_gui_select is None:
3498 if self.pylab_gui_select is None:
3498 self.pylab_gui_select = gui
3499 self.pylab_gui_select = gui
3499 # Otherwise if they are different
3500 # Otherwise if they are different
3500 elif gui != self.pylab_gui_select:
3501 elif gui != self.pylab_gui_select:
3501 print('Warning: Cannot change to a different GUI toolkit: %s.'
3502 print('Warning: Cannot change to a different GUI toolkit: %s.'
3502 ' Using %s instead.' % (gui, self.pylab_gui_select))
3503 ' Using %s instead.' % (gui, self.pylab_gui_select))
3503 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
3504 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
3504
3505
3505 pt.activate_matplotlib(backend)
3506 pt.activate_matplotlib(backend)
3506 pt.configure_inline_support(self, backend)
3507 pt.configure_inline_support(self, backend)
3507
3508
3508 # Now we must activate the gui pylab wants to use, and fix %run to take
3509 # Now we must activate the gui pylab wants to use, and fix %run to take
3509 # plot updates into account
3510 # plot updates into account
3510 self.enable_gui(gui)
3511 self.enable_gui(gui)
3511 self.magics_manager.registry['ExecutionMagics'].default_runner = \
3512 self.magics_manager.registry['ExecutionMagics'].default_runner = \
3512 pt.mpl_runner(self.safe_execfile)
3513 pt.mpl_runner(self.safe_execfile)
3513
3514
3514 return gui, backend
3515 return gui, backend
3515
3516
3516 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
3517 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
3517 """Activate pylab support at runtime.
3518 """Activate pylab support at runtime.
3518
3519
3519 This turns on support for matplotlib, preloads into the interactive
3520 This turns on support for matplotlib, preloads into the interactive
3520 namespace all of numpy and pylab, and configures IPython to correctly
3521 namespace all of numpy and pylab, and configures IPython to correctly
3521 interact with the GUI event loop. The GUI backend to be used can be
3522 interact with the GUI event loop. The GUI backend to be used can be
3522 optionally selected with the optional ``gui`` argument.
3523 optionally selected with the optional ``gui`` argument.
3523
3524
3524 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
3525 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
3525
3526
3526 Parameters
3527 Parameters
3527 ----------
3528 ----------
3528 gui : optional, string
3529 gui : optional, string
3529 If given, dictates the choice of matplotlib GUI backend to use
3530 If given, dictates the choice of matplotlib GUI backend to use
3530 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3531 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3531 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3532 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3532 matplotlib (as dictated by the matplotlib build-time options plus the
3533 matplotlib (as dictated by the matplotlib build-time options plus the
3533 user's matplotlibrc configuration file). Note that not all backends
3534 user's matplotlibrc configuration file). Note that not all backends
3534 make sense in all contexts, for example a terminal ipython can't
3535 make sense in all contexts, for example a terminal ipython can't
3535 display figures inline.
3536 display figures inline.
3536 import_all : optional, bool, default: True
3537 import_all : optional, bool, default: True
3537 Whether to do `from numpy import *` and `from pylab import *`
3538 Whether to do `from numpy import *` and `from pylab import *`
3538 in addition to module imports.
3539 in addition to module imports.
3539 welcome_message : deprecated
3540 welcome_message : deprecated
3540 This argument is ignored, no welcome message will be displayed.
3541 This argument is ignored, no welcome message will be displayed.
3541 """
3542 """
3542 from IPython.core.pylabtools import import_pylab
3543 from IPython.core.pylabtools import import_pylab
3543
3544
3544 gui, backend = self.enable_matplotlib(gui)
3545 gui, backend = self.enable_matplotlib(gui)
3545
3546
3546 # We want to prevent the loading of pylab to pollute the user's
3547 # We want to prevent the loading of pylab to pollute the user's
3547 # namespace as shown by the %who* magics, so we execute the activation
3548 # namespace as shown by the %who* magics, so we execute the activation
3548 # code in an empty namespace, and we update *both* user_ns and
3549 # code in an empty namespace, and we update *both* user_ns and
3549 # user_ns_hidden with this information.
3550 # user_ns_hidden with this information.
3550 ns = {}
3551 ns = {}
3551 import_pylab(ns, import_all)
3552 import_pylab(ns, import_all)
3552 # warn about clobbered names
3553 # warn about clobbered names
3553 ignored = {"__builtins__"}
3554 ignored = {"__builtins__"}
3554 both = set(ns).intersection(self.user_ns).difference(ignored)
3555 both = set(ns).intersection(self.user_ns).difference(ignored)
3555 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
3556 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
3556 self.user_ns.update(ns)
3557 self.user_ns.update(ns)
3557 self.user_ns_hidden.update(ns)
3558 self.user_ns_hidden.update(ns)
3558 return gui, backend, clobbered
3559 return gui, backend, clobbered
3559
3560
3560 #-------------------------------------------------------------------------
3561 #-------------------------------------------------------------------------
3561 # Utilities
3562 # Utilities
3562 #-------------------------------------------------------------------------
3563 #-------------------------------------------------------------------------
3563
3564
3564 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
3565 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
3565 """Expand python variables in a string.
3566 """Expand python variables in a string.
3566
3567
3567 The depth argument indicates how many frames above the caller should
3568 The depth argument indicates how many frames above the caller should
3568 be walked to look for the local namespace where to expand variables.
3569 be walked to look for the local namespace where to expand variables.
3569
3570
3570 The global namespace for expansion is always the user's interactive
3571 The global namespace for expansion is always the user's interactive
3571 namespace.
3572 namespace.
3572 """
3573 """
3573 ns = self.user_ns.copy()
3574 ns = self.user_ns.copy()
3574 try:
3575 try:
3575 frame = sys._getframe(depth+1)
3576 frame = sys._getframe(depth+1)
3576 except ValueError:
3577 except ValueError:
3577 # This is thrown if there aren't that many frames on the stack,
3578 # This is thrown if there aren't that many frames on the stack,
3578 # e.g. if a script called run_line_magic() directly.
3579 # e.g. if a script called run_line_magic() directly.
3579 pass
3580 pass
3580 else:
3581 else:
3581 ns.update(frame.f_locals)
3582 ns.update(frame.f_locals)
3582
3583
3583 try:
3584 try:
3584 # We have to use .vformat() here, because 'self' is a valid and common
3585 # We have to use .vformat() here, because 'self' is a valid and common
3585 # name, and expanding **ns for .format() would make it collide with
3586 # name, and expanding **ns for .format() would make it collide with
3586 # the 'self' argument of the method.
3587 # the 'self' argument of the method.
3587 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
3588 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
3588 except Exception:
3589 except Exception:
3589 # if formatter couldn't format, just let it go untransformed
3590 # if formatter couldn't format, just let it go untransformed
3590 pass
3591 pass
3591 return cmd
3592 return cmd
3592
3593
3593 def mktempfile(self, data=None, prefix='ipython_edit_'):
3594 def mktempfile(self, data=None, prefix='ipython_edit_'):
3594 """Make a new tempfile and return its filename.
3595 """Make a new tempfile and return its filename.
3595
3596
3596 This makes a call to tempfile.mkstemp (created in a tempfile.mkdtemp),
3597 This makes a call to tempfile.mkstemp (created in a tempfile.mkdtemp),
3597 but it registers the created filename internally so ipython cleans it up
3598 but it registers the created filename internally so ipython cleans it up
3598 at exit time.
3599 at exit time.
3599
3600
3600 Optional inputs:
3601 Optional inputs:
3601
3602
3602 - data(None): if data is given, it gets written out to the temp file
3603 - data(None): if data is given, it gets written out to the temp file
3603 immediately, and the file is closed again."""
3604 immediately, and the file is closed again."""
3604
3605
3605 dirname = tempfile.mkdtemp(prefix=prefix)
3606 dirname = tempfile.mkdtemp(prefix=prefix)
3606 self.tempdirs.append(dirname)
3607 self.tempdirs.append(dirname)
3607
3608
3608 handle, filename = tempfile.mkstemp('.py', prefix, dir=dirname)
3609 handle, filename = tempfile.mkstemp('.py', prefix, dir=dirname)
3609 os.close(handle) # On Windows, there can only be one open handle on a file
3610 os.close(handle) # On Windows, there can only be one open handle on a file
3610 self.tempfiles.append(filename)
3611 self.tempfiles.append(filename)
3611
3612
3612 if data:
3613 if data:
3613 with open(filename, 'w') as tmp_file:
3614 with open(filename, 'w') as tmp_file:
3614 tmp_file.write(data)
3615 tmp_file.write(data)
3615 return filename
3616 return filename
3616
3617
3617 @undoc
3618 @undoc
3618 def write(self,data):
3619 def write(self,data):
3619 """DEPRECATED: Write a string to the default output"""
3620 """DEPRECATED: Write a string to the default output"""
3620 warn('InteractiveShell.write() is deprecated, use sys.stdout instead',
3621 warn('InteractiveShell.write() is deprecated, use sys.stdout instead',
3621 DeprecationWarning, stacklevel=2)
3622 DeprecationWarning, stacklevel=2)
3622 sys.stdout.write(data)
3623 sys.stdout.write(data)
3623
3624
3624 @undoc
3625 @undoc
3625 def write_err(self,data):
3626 def write_err(self,data):
3626 """DEPRECATED: Write a string to the default error output"""
3627 """DEPRECATED: Write a string to the default error output"""
3627 warn('InteractiveShell.write_err() is deprecated, use sys.stderr instead',
3628 warn('InteractiveShell.write_err() is deprecated, use sys.stderr instead',
3628 DeprecationWarning, stacklevel=2)
3629 DeprecationWarning, stacklevel=2)
3629 sys.stderr.write(data)
3630 sys.stderr.write(data)
3630
3631
3631 def ask_yes_no(self, prompt, default=None, interrupt=None):
3632 def ask_yes_no(self, prompt, default=None, interrupt=None):
3632 if self.quiet:
3633 if self.quiet:
3633 return True
3634 return True
3634 return ask_yes_no(prompt,default,interrupt)
3635 return ask_yes_no(prompt,default,interrupt)
3635
3636
3636 def show_usage(self):
3637 def show_usage(self):
3637 """Show a usage message"""
3638 """Show a usage message"""
3638 page.page(IPython.core.usage.interactive_usage)
3639 page.page(IPython.core.usage.interactive_usage)
3639
3640
3640 def extract_input_lines(self, range_str, raw=False):
3641 def extract_input_lines(self, range_str, raw=False):
3641 """Return as a string a set of input history slices.
3642 """Return as a string a set of input history slices.
3642
3643
3643 Parameters
3644 Parameters
3644 ----------
3645 ----------
3645 range_str : string
3646 range_str : string
3646 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
3647 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
3647 since this function is for use by magic functions which get their
3648 since this function is for use by magic functions which get their
3648 arguments as strings. The number before the / is the session
3649 arguments as strings. The number before the / is the session
3649 number: ~n goes n back from the current session.
3650 number: ~n goes n back from the current session.
3650
3651
3651 raw : bool, optional
3652 raw : bool, optional
3652 By default, the processed input is used. If this is true, the raw
3653 By default, the processed input is used. If this is true, the raw
3653 input history is used instead.
3654 input history is used instead.
3654
3655
3655 Notes
3656 Notes
3656 -----
3657 -----
3657
3658
3658 Slices can be described with two notations:
3659 Slices can be described with two notations:
3659
3660
3660 * ``N:M`` -> standard python form, means including items N...(M-1).
3661 * ``N:M`` -> standard python form, means including items N...(M-1).
3661 * ``N-M`` -> include items N..M (closed endpoint).
3662 * ``N-M`` -> include items N..M (closed endpoint).
3662 """
3663 """
3663 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3664 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3664 return "\n".join(x for _, _, x in lines)
3665 return "\n".join(x for _, _, x in lines)
3665
3666
3666 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True, search_ns=False):
3667 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True, search_ns=False):
3667 """Get a code string from history, file, url, or a string or macro.
3668 """Get a code string from history, file, url, or a string or macro.
3668
3669
3669 This is mainly used by magic functions.
3670 This is mainly used by magic functions.
3670
3671
3671 Parameters
3672 Parameters
3672 ----------
3673 ----------
3673
3674
3674 target : str
3675 target : str
3675
3676
3676 A string specifying code to retrieve. This will be tried respectively
3677 A string specifying code to retrieve. This will be tried respectively
3677 as: ranges of input history (see %history for syntax), url,
3678 as: ranges of input history (see %history for syntax), url,
3678 corresponding .py file, filename, or an expression evaluating to a
3679 corresponding .py file, filename, or an expression evaluating to a
3679 string or Macro in the user namespace.
3680 string or Macro in the user namespace.
3680
3681
3681 raw : bool
3682 raw : bool
3682 If true (default), retrieve raw history. Has no effect on the other
3683 If true (default), retrieve raw history. Has no effect on the other
3683 retrieval mechanisms.
3684 retrieval mechanisms.
3684
3685
3685 py_only : bool (default False)
3686 py_only : bool (default False)
3686 Only try to fetch python code, do not try alternative methods to decode file
3687 Only try to fetch python code, do not try alternative methods to decode file
3687 if unicode fails.
3688 if unicode fails.
3688
3689
3689 Returns
3690 Returns
3690 -------
3691 -------
3691 A string of code.
3692 A string of code.
3692
3693
3693 ValueError is raised if nothing is found, and TypeError if it evaluates
3694 ValueError is raised if nothing is found, and TypeError if it evaluates
3694 to an object of another type. In each case, .args[0] is a printable
3695 to an object of another type. In each case, .args[0] is a printable
3695 message.
3696 message.
3696 """
3697 """
3697 code = self.extract_input_lines(target, raw=raw) # Grab history
3698 code = self.extract_input_lines(target, raw=raw) # Grab history
3698 if code:
3699 if code:
3699 return code
3700 return code
3700 try:
3701 try:
3701 if target.startswith(('http://', 'https://')):
3702 if target.startswith(('http://', 'https://')):
3702 return openpy.read_py_url(target, skip_encoding_cookie=skip_encoding_cookie)
3703 return openpy.read_py_url(target, skip_encoding_cookie=skip_encoding_cookie)
3703 except UnicodeDecodeError:
3704 except UnicodeDecodeError:
3704 if not py_only :
3705 if not py_only :
3705 # Deferred import
3706 # Deferred import
3706 from urllib.request import urlopen
3707 from urllib.request import urlopen
3707 response = urlopen(target)
3708 response = urlopen(target)
3708 return response.read().decode('latin1')
3709 return response.read().decode('latin1')
3709 raise ValueError(("'%s' seem to be unreadable.") % target)
3710 raise ValueError(("'%s' seem to be unreadable.") % target)
3710
3711
3711 potential_target = [target]
3712 potential_target = [target]
3712 try :
3713 try :
3713 potential_target.insert(0,get_py_filename(target))
3714 potential_target.insert(0,get_py_filename(target))
3714 except IOError:
3715 except IOError:
3715 pass
3716 pass
3716
3717
3717 for tgt in potential_target :
3718 for tgt in potential_target :
3718 if os.path.isfile(tgt): # Read file
3719 if os.path.isfile(tgt): # Read file
3719 try :
3720 try :
3720 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3721 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3721 except UnicodeDecodeError :
3722 except UnicodeDecodeError :
3722 if not py_only :
3723 if not py_only :
3723 with io_open(tgt,'r', encoding='latin1') as f :
3724 with io_open(tgt,'r', encoding='latin1') as f :
3724 return f.read()
3725 return f.read()
3725 raise ValueError(("'%s' seem to be unreadable.") % target)
3726 raise ValueError(("'%s' seem to be unreadable.") % target)
3726 elif os.path.isdir(os.path.expanduser(tgt)):
3727 elif os.path.isdir(os.path.expanduser(tgt)):
3727 raise ValueError("'%s' is a directory, not a regular file." % target)
3728 raise ValueError("'%s' is a directory, not a regular file." % target)
3728
3729
3729 if search_ns:
3730 if search_ns:
3730 # Inspect namespace to load object source
3731 # Inspect namespace to load object source
3731 object_info = self.object_inspect(target, detail_level=1)
3732 object_info = self.object_inspect(target, detail_level=1)
3732 if object_info['found'] and object_info['source']:
3733 if object_info['found'] and object_info['source']:
3733 return object_info['source']
3734 return object_info['source']
3734
3735
3735 try: # User namespace
3736 try: # User namespace
3736 codeobj = eval(target, self.user_ns)
3737 codeobj = eval(target, self.user_ns)
3737 except Exception:
3738 except Exception:
3738 raise ValueError(("'%s' was not found in history, as a file, url, "
3739 raise ValueError(("'%s' was not found in history, as a file, url, "
3739 "nor in the user namespace.") % target)
3740 "nor in the user namespace.") % target)
3740
3741
3741 if isinstance(codeobj, str):
3742 if isinstance(codeobj, str):
3742 return codeobj
3743 return codeobj
3743 elif isinstance(codeobj, Macro):
3744 elif isinstance(codeobj, Macro):
3744 return codeobj.value
3745 return codeobj.value
3745
3746
3746 raise TypeError("%s is neither a string nor a macro." % target,
3747 raise TypeError("%s is neither a string nor a macro." % target,
3747 codeobj)
3748 codeobj)
3748
3749
3749 #-------------------------------------------------------------------------
3750 #-------------------------------------------------------------------------
3750 # Things related to IPython exiting
3751 # Things related to IPython exiting
3751 #-------------------------------------------------------------------------
3752 #-------------------------------------------------------------------------
3752 def atexit_operations(self):
3753 def atexit_operations(self):
3753 """This will be executed at the time of exit.
3754 """This will be executed at the time of exit.
3754
3755
3755 Cleanup operations and saving of persistent data that is done
3756 Cleanup operations and saving of persistent data that is done
3756 unconditionally by IPython should be performed here.
3757 unconditionally by IPython should be performed here.
3757
3758
3758 For things that may depend on startup flags or platform specifics (such
3759 For things that may depend on startup flags or platform specifics (such
3759 as having readline or not), register a separate atexit function in the
3760 as having readline or not), register a separate atexit function in the
3760 code that has the appropriate information, rather than trying to
3761 code that has the appropriate information, rather than trying to
3761 clutter
3762 clutter
3762 """
3763 """
3763 # Close the history session (this stores the end time and line count)
3764 # Close the history session (this stores the end time and line count)
3764 # this must be *before* the tempfile cleanup, in case of temporary
3765 # this must be *before* the tempfile cleanup, in case of temporary
3765 # history db
3766 # history db
3766 self.history_manager.end_session()
3767 self.history_manager.end_session()
3767
3768
3768 # Cleanup all tempfiles and folders left around
3769 # Cleanup all tempfiles and folders left around
3769 for tfile in self.tempfiles:
3770 for tfile in self.tempfiles:
3770 try:
3771 try:
3771 os.unlink(tfile)
3772 os.unlink(tfile)
3772 except OSError:
3773 except OSError:
3773 pass
3774 pass
3774
3775
3775 for tdir in self.tempdirs:
3776 for tdir in self.tempdirs:
3776 try:
3777 try:
3777 os.rmdir(tdir)
3778 os.rmdir(tdir)
3778 except OSError:
3779 except OSError:
3779 pass
3780 pass
3780
3781
3781 # Clear all user namespaces to release all references cleanly.
3782 # Clear all user namespaces to release all references cleanly.
3782 self.reset(new_session=False)
3783 self.reset(new_session=False)
3783
3784
3784 # Run user hooks
3785 # Run user hooks
3785 self.hooks.shutdown_hook()
3786 self.hooks.shutdown_hook()
3786
3787
3787 def cleanup(self):
3788 def cleanup(self):
3788 self.restore_sys_module_state()
3789 self.restore_sys_module_state()
3789
3790
3790
3791
3791 # Overridden in terminal subclass to change prompts
3792 # Overridden in terminal subclass to change prompts
3792 def switch_doctest_mode(self, mode):
3793 def switch_doctest_mode(self, mode):
3793 pass
3794 pass
3794
3795
3795
3796
3796 class InteractiveShellABC(metaclass=abc.ABCMeta):
3797 class InteractiveShellABC(metaclass=abc.ABCMeta):
3797 """An abstract base class for InteractiveShell."""
3798 """An abstract base class for InteractiveShell."""
3798
3799
3799 InteractiveShellABC.register(InteractiveShell)
3800 InteractiveShellABC.register(InteractiveShell)
General Comments 0
You need to be logged in to leave comments. Login now