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