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