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