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