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