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