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