##// END OF EJS Templates
Provide and easier way to generate magics and pre-post hooks...
Matthias Bussonnier -
Show More
@@ -0,0 +1,320 b''
1 """
2 This module contains utility function and classes to inject simple ast
3 transformations based on code strings into IPython. While it is already possible
4 with ast-transformers it is not easy to directly manipulate ast.
5
6
7 IPython has pre-code and post-code hooks, but are ran from within the IPython
8 machinery so may be inappropriate, for example for performance mesurement.
9
10 This module give you tools to simplify this, and expose 2 classes:
11
12 - `ReplaceCodeTransformer` which is a simple ast transformer based on code
13 template,
14
15 and for advance case:
16
17 - `Mangler` which is a simple ast transformer that mangle names in the ast.
18
19
20 Example, let's try to make a simple version of the ``timeit`` magic, that run a
21 code snippet 10 times and print the average time taken.
22
23 Basically we want to run :
24
25 .. code-block:: python
26
27 from time import perf_counter
28 now = perf_counter()
29 for i in range(10):
30 __code__ # our code
31 print(f"Time taken: {(perf_counter() - now)/10}")
32 __ret__ # the result of the last statement
33
34 Where ``__code__`` is the code snippet we want to run, and ``__ret__`` is the
35 result, so that if we for example run `dataframe.head()` IPython still display
36 the head of dataframe instead of nothing.
37
38 Here is a complete example of a file `timit2.py` that define such a magic:
39
40 .. code-block:: python
41
42 from IPython.core.magic import (
43 Magics,
44 magics_class,
45 line_cell_magic,
46 )
47 from IPython.core.magics.ast_mod import ReplaceCodeTransformer
48 from textwrap import dedent
49 import ast
50
51 template = template = dedent('''
52 from time import perf_counter
53 now = perf_counter()
54 for i in range(10):
55 __code__
56 print(f"Time taken: {(perf_counter() - now)/10}")
57 __ret__
58 '''
59 )
60
61
62 @magics_class
63 class AstM(Magics):
64 @line_cell_magic
65 def t2(self, line, cell):
66 transformer = ReplaceCodeTransformer.from_string(template)
67 transformer.debug = True
68 transformer.mangler.debug = True
69 new_code = transformer.visit(ast.parse(cell))
70 return exec(compile(new_code, "<ast>", "exec"))
71
72
73 def load_ipython_extension(ip):
74 ip.register_magics(AstM)
75
76
77
78 .. code-block:: python
79
80 In [1]: %load_ext timit2
81
82 In [2]: %%t2
83 ...: import time
84 ...: time.sleep(0.05)
85 ...:
86 ...:
87 Time taken: 0.05435649999999441
88
89
90 If you wish to ran all the code enter in IPython in an ast transformer, you can
91 do so as well:
92
93 .. code-block:: python
94
95 In [1]: from IPython.core.magics.ast_mod import ReplaceCodeTransformer
96 ...:
97 ...: template = '''
98 ...: from time import perf_counter
99 ...: now = perf_counter()
100 ...: __code__
101 ...: print(f"Code ran in {perf_counter()-now}")
102 ...: __ret__'''
103 ...:
104 ...: get_ipython().ast_transformers.append(ReplaceCodeTransformer.from_string(template))
105
106 In [2]: 1+1
107 Code ran in 3.40410006174352e-05
108 Out[2]: 2
109
110
111
112 Hygiene and Mangling
113 --------------------
114
115 The ast transformer above is not hygienic, it may not work if the user code use
116 the same variable names as the ones used in the template. For example.
117
118 To help with this by default the `ReplaceCodeTransformer` will mangle all names
119 staring with 3 underscores. This is a simple heuristic that should work in most
120 case, but can be cumbersome in some case. We provide a `Mangler` class that can
121 be overridden to change the mangling heuristic, or simply use the `mangle_all`
122 utility function. It will _try_ to mangle all names (except `__ret__` and
123 `__code__`), but this include builtins (``print``, ``range``, ``type``) and
124 replace those by invalid identifiers py prepending ``mangle-``:
125 ``mangle-print``, ``mangle-range``, ``mangle-type`` etc. This is not a problem
126 as currently Python AST support invalid identifiers, but it may not be the case
127 in the future.
128
129 You can set `ReplaceCodeTransformer.debug=True` and
130 `ReplaceCodeTransformer.mangler.debug=True` to see the code after mangling and
131 transforming:
132
133 .. code-block:: python
134
135
136 In [1]: from IPython.core.magics.ast_mod import ReplaceCodeTransformer, mangle_all
137 ...:
138 ...: template = '''
139 ...: from builtins import type, print
140 ...: from time import perf_counter
141 ...: now = perf_counter()
142 ...: __code__
143 ...: print(f"Code ran in {perf_counter()-now}")
144 ...: __ret__'''
145 ...:
146 ...: transformer = ReplaceCodeTransformer.from_string(template, mangling_predicate=mangle_all)
147
148
149 In [2]: transformer.debug = True
150 ...: transformer.mangler.debug = True
151 ...: get_ipython().ast_transformers.append(transformer)
152
153 In [3]: 1+1
154 Mangling Alias mangle-type
155 Mangling Alias mangle-print
156 Mangling Alias mangle-perf_counter
157 Mangling now
158 Mangling perf_counter
159 Not mangling __code__
160 Mangling print
161 Mangling perf_counter
162 Mangling now
163 Not mangling __ret__
164 ---- Transformed code ----
165 from builtins import type as mangle-type, print as mangle-print
166 from time import perf_counter as mangle-perf_counter
167 mangle-now = mangle-perf_counter()
168 ret-tmp = 1 + 1
169 mangle-print(f'Code ran in {mangle-perf_counter() - mangle-now}')
170 ret-tmp
171 ---- ---------------- ----
172 Code ran in 0.00013654199938173406
173 Out[3]: 2
174
175
176 """
177
178 __skip_doctest__ = True
179
180
181 from ast import NodeTransformer, Store, Load, Name, Expr, Assign, Module
182 import ast
183 import copy
184
185 from typing import Dict, Optional
186
187
188 mangle_all = lambda name: False if name in ("__ret__", "__code__") else True
189
190
191 class Mangler(NodeTransformer):
192 """
193 Mangle given names in and ast tree to make sure they do not conflict with
194 user code.
195 """
196
197 enabled: bool = True
198 debug: bool = False
199
200 def log(self, *args, **kwargs):
201 if self.debug:
202 print(*args, **kwargs)
203
204 def __init__(self, predicate=None):
205 if predicate is None:
206 predicate = lambda name: name.startswith("___")
207 self.predicate = predicate
208
209 def visit_Name(self, node):
210 if self.predicate(node.id):
211 self.log("Mangling", node.id)
212 # Once in the ast we do not need
213 # names to be valid identifiers.
214 node.id = "mangle-" + node.id
215 else:
216 self.log("Not mangling", node.id)
217 return node
218
219 def visit_FunctionDef(self, node):
220 if self.predicate(node.name):
221 self.log("Mangling", node.name)
222 node.name = "mangle-" + node.name
223 else:
224 self.log("Not mangling", node.name)
225
226 for arg in node.args.args:
227 if self.predicate(arg.arg):
228 self.log("Mangling function arg", arg.arg)
229 arg.arg = "mangle-" + arg.arg
230 else:
231 self.log("Not mangling function arg", arg.arg)
232 return self.generic_visit(node)
233
234 def visit_ImportFrom(self, node):
235 return self._visit_Import_and_ImportFrom(node)
236
237 def visit_Import(self, node):
238 return self._visit_Import_and_ImportFrom(node)
239
240 def _visit_Import_and_ImportFrom(self, node):
241 for alias in node.names:
242 asname = alias.name if alias.asname is None else alias.asname
243 if self.predicate(asname):
244 new_name: str = "mangle-" + asname
245 self.log("Mangling Alias", new_name)
246 alias.asname = new_name
247 else:
248 self.log("Not mangling Alias", alias.asname)
249 return node
250
251
252 class ReplaceCodeTransformer(NodeTransformer):
253 enabled: bool = True
254 debug: bool = False
255 mangler: Mangler
256
257 def __init__(
258 self, template: Module, mapping: Optional[Dict] = None, mangling_predicate=None
259 ):
260 assert isinstance(mapping, (dict, type(None)))
261 assert isinstance(mangling_predicate, (type(None), type(lambda: None)))
262 assert isinstance(template, ast.Module)
263 self.template = template
264 self.mangler = Mangler(predicate=mangling_predicate)
265 if mapping is None:
266 mapping = {}
267 self.mapping = mapping
268
269 @classmethod
270 def from_string(
271 cls, template: str, mapping: Optional[Dict] = None, mangling_predicate=None
272 ):
273 return cls(
274 ast.parse(template), mapping=mapping, mangling_predicate=mangling_predicate
275 )
276
277 def visit_Module(self, code):
278 if not self.enabled:
279 return code
280 # if not isinstance(code, ast.Module):
281 # recursively called...
282 # return generic_visit(self, code)
283 last = code.body[-1]
284 if isinstance(last, Expr):
285 code.body.pop()
286 code.body.append(Assign([Name("ret-tmp", ctx=Store())], value=last.value))
287 ast.fix_missing_locations(code)
288 ret = Expr(value=Name("ret-tmp", ctx=Load()))
289 ret = ast.fix_missing_locations(ret)
290 self.mapping["__ret__"] = ret
291 else:
292 self.mapping["__ret__"] = ast.parse("None").body[0]
293 self.mapping["__code__"] = code.body
294 tpl = ast.fix_missing_locations(self.template)
295
296 tx = copy.deepcopy(tpl)
297 tx = self.mangler.visit(tx)
298 node = self.generic_visit(tx)
299 node_2 = ast.fix_missing_locations(node)
300 if self.debug:
301 print("---- Transformed code ----")
302 print(ast.unparse(node_2))
303 print("---- ---------------- ----")
304 return node_2
305
306 # this does not work as the name might be in a list and one might want to extend the list.
307 # def visit_Name(self, name):
308 # if name.id in self.mapping and name.id == "__ret__":
309 # print(name, "in mapping")
310 # if isinstance(name.ctx, ast.Store):
311 # return Name("tmp", ctx=Store())
312 # else:
313 # return copy.deepcopy(self.mapping[name.id])
314 # return name
315
316 def visit_Expr(self, expr):
317 if isinstance(expr.value, Name) and expr.value.id in self.mapping:
318 if self.mapping[expr.value.id] is not None:
319 return copy.deepcopy(self.mapping[expr.value.id])
320 return self.generic_visit(expr)
@@ -1,3910 +1,3913 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Main IPython class."""
2 """Main IPython class."""
3
3
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
7 # Copyright (C) 2008-2011 The IPython Development Team
7 # Copyright (C) 2008-2011 The IPython Development Team
8 #
8 #
9 # Distributed under the terms of the BSD License. The full license is in
9 # Distributed under the terms of the BSD License. The full license is in
10 # the file COPYING, distributed as part of this software.
10 # the file COPYING, distributed as part of this software.
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12
12
13
13
14 import abc
14 import abc
15 import ast
15 import ast
16 import atexit
16 import atexit
17 import bdb
17 import bdb
18 import builtins as builtin_mod
18 import builtins as builtin_mod
19 import functools
19 import functools
20 import inspect
20 import inspect
21 import os
21 import os
22 import re
22 import re
23 import runpy
23 import runpy
24 import subprocess
24 import subprocess
25 import sys
25 import sys
26 import tempfile
26 import tempfile
27 import traceback
27 import traceback
28 import types
28 import types
29 import warnings
29 import warnings
30 from ast import stmt
30 from ast import stmt
31 from io import open as io_open
31 from io import open as io_open
32 from logging import error
32 from logging import error
33 from pathlib import Path
33 from pathlib import Path
34 from typing import Callable
34 from typing import Callable
35 from typing import List as ListType, Dict as DictType, Any as AnyType
35 from typing import List as ListType, Dict as DictType, Any as AnyType
36 from typing import Optional, Sequence, Tuple
36 from typing import Optional, Sequence, Tuple
37 from warnings import warn
37 from warnings import warn
38
38
39 from pickleshare import PickleShareDB
39 from pickleshare import PickleShareDB
40 from tempfile import TemporaryDirectory
40 from tempfile import TemporaryDirectory
41 from traitlets import (
41 from traitlets import (
42 Any,
42 Any,
43 Bool,
43 Bool,
44 CaselessStrEnum,
44 CaselessStrEnum,
45 Dict,
45 Dict,
46 Enum,
46 Enum,
47 Instance,
47 Instance,
48 Integer,
48 Integer,
49 List,
49 List,
50 Type,
50 Type,
51 Unicode,
51 Unicode,
52 default,
52 default,
53 observe,
53 observe,
54 validate,
54 validate,
55 )
55 )
56 from traitlets.config.configurable import SingletonConfigurable
56 from traitlets.config.configurable import SingletonConfigurable
57 from traitlets.utils.importstring import import_item
57 from traitlets.utils.importstring import import_item
58
58
59 import IPython.core.hooks
59 import IPython.core.hooks
60 from IPython.core import magic, oinspect, page, prefilter, ultratb
60 from IPython.core import magic, oinspect, page, prefilter, ultratb
61 from IPython.core.alias import Alias, AliasManager
61 from IPython.core.alias import Alias, AliasManager
62 from IPython.core.autocall import ExitAutocall
62 from IPython.core.autocall import ExitAutocall
63 from IPython.core.builtin_trap import BuiltinTrap
63 from IPython.core.builtin_trap import BuiltinTrap
64 from IPython.core.compilerop import CachingCompiler
64 from IPython.core.compilerop import CachingCompiler
65 from IPython.core.debugger import InterruptiblePdb
65 from IPython.core.debugger import InterruptiblePdb
66 from IPython.core.display_trap import DisplayTrap
66 from IPython.core.display_trap import DisplayTrap
67 from IPython.core.displayhook import DisplayHook
67 from IPython.core.displayhook import DisplayHook
68 from IPython.core.displaypub import DisplayPublisher
68 from IPython.core.displaypub import DisplayPublisher
69 from IPython.core.error import InputRejected, UsageError
69 from IPython.core.error import InputRejected, UsageError
70 from IPython.core.events import EventManager, available_events
70 from IPython.core.events import EventManager, available_events
71 from IPython.core.extensions import ExtensionManager
71 from IPython.core.extensions import ExtensionManager
72 from IPython.core.formatters import DisplayFormatter
72 from IPython.core.formatters import DisplayFormatter
73 from IPython.core.history import HistoryManager
73 from IPython.core.history import HistoryManager
74 from IPython.core.inputtransformer2 import ESC_MAGIC, ESC_MAGIC2
74 from IPython.core.inputtransformer2 import ESC_MAGIC, ESC_MAGIC2
75 from IPython.core.logger import Logger
75 from IPython.core.logger import Logger
76 from IPython.core.macro import Macro
76 from IPython.core.macro import Macro
77 from IPython.core.payload import PayloadManager
77 from IPython.core.payload import PayloadManager
78 from IPython.core.prefilter import PrefilterManager
78 from IPython.core.prefilter import PrefilterManager
79 from IPython.core.profiledir import ProfileDir
79 from IPython.core.profiledir import ProfileDir
80 from IPython.core.usage import default_banner
80 from IPython.core.usage import default_banner
81 from IPython.display import display
81 from IPython.display import display
82 from IPython.paths import get_ipython_dir
82 from IPython.paths import get_ipython_dir
83 from IPython.testing.skipdoctest import skip_doctest
83 from IPython.testing.skipdoctest import skip_doctest
84 from IPython.utils import PyColorize, io, openpy, py3compat
84 from IPython.utils import PyColorize, io, openpy, py3compat
85 from IPython.utils.decorators import undoc
85 from IPython.utils.decorators import undoc
86 from IPython.utils.io import ask_yes_no
86 from IPython.utils.io import ask_yes_no
87 from IPython.utils.ipstruct import Struct
87 from IPython.utils.ipstruct import Struct
88 from IPython.utils.path import ensure_dir_exists, get_home_dir, get_py_filename
88 from IPython.utils.path import ensure_dir_exists, get_home_dir, get_py_filename
89 from IPython.utils.process import getoutput, system
89 from IPython.utils.process import getoutput, system
90 from IPython.utils.strdispatch import StrDispatch
90 from IPython.utils.strdispatch import StrDispatch
91 from IPython.utils.syspathcontext import prepended_to_syspath
91 from IPython.utils.syspathcontext import prepended_to_syspath
92 from IPython.utils.text import DollarFormatter, LSString, SList, format_screen
92 from IPython.utils.text import DollarFormatter, LSString, SList, format_screen
93 from IPython.core.oinspect import OInfo
93 from IPython.core.oinspect import OInfo
94
94
95
95
96 sphinxify: Optional[Callable]
96 sphinxify: Optional[Callable]
97
97
98 try:
98 try:
99 import docrepr.sphinxify as sphx
99 import docrepr.sphinxify as sphx
100
100
101 def sphinxify(oinfo):
101 def sphinxify(oinfo):
102 wrapped_docstring = sphx.wrap_main_docstring(oinfo)
102 wrapped_docstring = sphx.wrap_main_docstring(oinfo)
103
103
104 def sphinxify_docstring(docstring):
104 def sphinxify_docstring(docstring):
105 with TemporaryDirectory() as dirname:
105 with TemporaryDirectory() as dirname:
106 return {
106 return {
107 "text/html": sphx.sphinxify(wrapped_docstring, dirname),
107 "text/html": sphx.sphinxify(wrapped_docstring, dirname),
108 "text/plain": docstring,
108 "text/plain": docstring,
109 }
109 }
110
110
111 return sphinxify_docstring
111 return sphinxify_docstring
112 except ImportError:
112 except ImportError:
113 sphinxify = None
113 sphinxify = None
114
114
115
115
116 class ProvisionalWarning(DeprecationWarning):
116 class ProvisionalWarning(DeprecationWarning):
117 """
117 """
118 Warning class for unstable features
118 Warning class for unstable features
119 """
119 """
120 pass
120 pass
121
121
122 from ast import Module
122 from ast import Module
123
123
124 _assign_nodes = (ast.AugAssign, ast.AnnAssign, ast.Assign)
124 _assign_nodes = (ast.AugAssign, ast.AnnAssign, ast.Assign)
125 _single_targets_nodes = (ast.AugAssign, ast.AnnAssign)
125 _single_targets_nodes = (ast.AugAssign, ast.AnnAssign)
126
126
127 #-----------------------------------------------------------------------------
127 #-----------------------------------------------------------------------------
128 # Await Helpers
128 # Await Helpers
129 #-----------------------------------------------------------------------------
129 #-----------------------------------------------------------------------------
130
130
131 # we still need to run things using the asyncio eventloop, but there is no
131 # we still need to run things using the asyncio eventloop, but there is no
132 # async integration
132 # async integration
133 from .async_helpers import (
133 from .async_helpers import (
134 _asyncio_runner,
134 _asyncio_runner,
135 _curio_runner,
135 _curio_runner,
136 _pseudo_sync_runner,
136 _pseudo_sync_runner,
137 _should_be_async,
137 _should_be_async,
138 _trio_runner,
138 _trio_runner,
139 )
139 )
140
140
141 #-----------------------------------------------------------------------------
141 #-----------------------------------------------------------------------------
142 # Globals
142 # Globals
143 #-----------------------------------------------------------------------------
143 #-----------------------------------------------------------------------------
144
144
145 # compiled regexps for autoindent management
145 # compiled regexps for autoindent management
146 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
146 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
147
147
148 #-----------------------------------------------------------------------------
148 #-----------------------------------------------------------------------------
149 # Utilities
149 # Utilities
150 #-----------------------------------------------------------------------------
150 #-----------------------------------------------------------------------------
151
151
152
152
153 def is_integer_string(s: str):
153 def is_integer_string(s: str):
154 """
154 """
155 Variant of "str.isnumeric()" that allow negative values and other ints.
155 Variant of "str.isnumeric()" that allow negative values and other ints.
156 """
156 """
157 try:
157 try:
158 int(s)
158 int(s)
159 return True
159 return True
160 except ValueError:
160 except ValueError:
161 return False
161 return False
162 raise ValueError("Unexpected error")
162 raise ValueError("Unexpected error")
163
163
164
164
165 @undoc
165 @undoc
166 def softspace(file, newvalue):
166 def softspace(file, newvalue):
167 """Copied from code.py, to remove the dependency"""
167 """Copied from code.py, to remove the dependency"""
168
168
169 oldvalue = 0
169 oldvalue = 0
170 try:
170 try:
171 oldvalue = file.softspace
171 oldvalue = file.softspace
172 except AttributeError:
172 except AttributeError:
173 pass
173 pass
174 try:
174 try:
175 file.softspace = newvalue
175 file.softspace = newvalue
176 except (AttributeError, TypeError):
176 except (AttributeError, TypeError):
177 # "attribute-less object" or "read-only attributes"
177 # "attribute-less object" or "read-only attributes"
178 pass
178 pass
179 return oldvalue
179 return oldvalue
180
180
181 @undoc
181 @undoc
182 def no_op(*a, **kw):
182 def no_op(*a, **kw):
183 pass
183 pass
184
184
185
185
186 class SpaceInInput(Exception): pass
186 class SpaceInInput(Exception): pass
187
187
188
188
189 class SeparateUnicode(Unicode):
189 class SeparateUnicode(Unicode):
190 r"""A Unicode subclass to validate separate_in, separate_out, etc.
190 r"""A Unicode subclass to validate separate_in, separate_out, etc.
191
191
192 This is a Unicode based trait that converts '0'->'' and ``'\\n'->'\n'``.
192 This is a Unicode based trait that converts '0'->'' and ``'\\n'->'\n'``.
193 """
193 """
194
194
195 def validate(self, obj, value):
195 def validate(self, obj, value):
196 if value == '0': value = ''
196 if value == '0': value = ''
197 value = value.replace('\\n','\n')
197 value = value.replace('\\n','\n')
198 return super(SeparateUnicode, self).validate(obj, value)
198 return super(SeparateUnicode, self).validate(obj, value)
199
199
200
200
201 @undoc
201 @undoc
202 class DummyMod(object):
202 class DummyMod(object):
203 """A dummy module used for IPython's interactive module when
203 """A dummy module used for IPython's interactive module when
204 a namespace must be assigned to the module's __dict__."""
204 a namespace must be assigned to the module's __dict__."""
205 __spec__ = None
205 __spec__ = None
206
206
207
207
208 class ExecutionInfo(object):
208 class ExecutionInfo(object):
209 """The arguments used for a call to :meth:`InteractiveShell.run_cell`
209 """The arguments used for a call to :meth:`InteractiveShell.run_cell`
210
210
211 Stores information about what is going to happen.
211 Stores information about what is going to happen.
212 """
212 """
213 raw_cell = None
213 raw_cell = None
214 store_history = False
214 store_history = False
215 silent = False
215 silent = False
216 shell_futures = True
216 shell_futures = True
217 cell_id = None
217 cell_id = None
218
218
219 def __init__(self, raw_cell, store_history, silent, shell_futures, cell_id):
219 def __init__(self, raw_cell, store_history, silent, shell_futures, cell_id):
220 self.raw_cell = raw_cell
220 self.raw_cell = raw_cell
221 self.store_history = store_history
221 self.store_history = store_history
222 self.silent = silent
222 self.silent = silent
223 self.shell_futures = shell_futures
223 self.shell_futures = shell_futures
224 self.cell_id = cell_id
224 self.cell_id = cell_id
225
225
226 def __repr__(self):
226 def __repr__(self):
227 name = self.__class__.__qualname__
227 name = self.__class__.__qualname__
228 raw_cell = (
228 raw_cell = (
229 (self.raw_cell[:50] + "..") if len(self.raw_cell) > 50 else self.raw_cell
229 (self.raw_cell[:50] + "..") if len(self.raw_cell) > 50 else self.raw_cell
230 )
230 )
231 return (
231 return (
232 '<%s object at %x, raw_cell="%s" store_history=%s silent=%s shell_futures=%s cell_id=%s>'
232 '<%s object at %x, raw_cell="%s" store_history=%s silent=%s shell_futures=%s cell_id=%s>'
233 % (
233 % (
234 name,
234 name,
235 id(self),
235 id(self),
236 raw_cell,
236 raw_cell,
237 self.store_history,
237 self.store_history,
238 self.silent,
238 self.silent,
239 self.shell_futures,
239 self.shell_futures,
240 self.cell_id,
240 self.cell_id,
241 )
241 )
242 )
242 )
243
243
244
244
245 class ExecutionResult(object):
245 class ExecutionResult(object):
246 """The result of a call to :meth:`InteractiveShell.run_cell`
246 """The result of a call to :meth:`InteractiveShell.run_cell`
247
247
248 Stores information about what took place.
248 Stores information about what took place.
249 """
249 """
250 execution_count = None
250 execution_count = None
251 error_before_exec = None
251 error_before_exec = None
252 error_in_exec: Optional[BaseException] = None
252 error_in_exec: Optional[BaseException] = None
253 info = None
253 info = None
254 result = None
254 result = None
255
255
256 def __init__(self, info):
256 def __init__(self, info):
257 self.info = info
257 self.info = info
258
258
259 @property
259 @property
260 def success(self):
260 def success(self):
261 return (self.error_before_exec is None) and (self.error_in_exec is None)
261 return (self.error_before_exec is None) and (self.error_in_exec is None)
262
262
263 def raise_error(self):
263 def raise_error(self):
264 """Reraises error if `success` is `False`, otherwise does nothing"""
264 """Reraises error if `success` is `False`, otherwise does nothing"""
265 if self.error_before_exec is not None:
265 if self.error_before_exec is not None:
266 raise self.error_before_exec
266 raise self.error_before_exec
267 if self.error_in_exec is not None:
267 if self.error_in_exec is not None:
268 raise self.error_in_exec
268 raise self.error_in_exec
269
269
270 def __repr__(self):
270 def __repr__(self):
271 name = self.__class__.__qualname__
271 name = self.__class__.__qualname__
272 return '<%s object at %x, execution_count=%s error_before_exec=%s error_in_exec=%s info=%s result=%s>' %\
272 return '<%s object at %x, execution_count=%s error_before_exec=%s error_in_exec=%s info=%s result=%s>' %\
273 (name, id(self), self.execution_count, self.error_before_exec, self.error_in_exec, repr(self.info), repr(self.result))
273 (name, id(self), self.execution_count, self.error_before_exec, self.error_in_exec, repr(self.info), repr(self.result))
274
274
275 @functools.wraps(io_open)
275 @functools.wraps(io_open)
276 def _modified_open(file, *args, **kwargs):
276 def _modified_open(file, *args, **kwargs):
277 if file in {0, 1, 2}:
277 if file in {0, 1, 2}:
278 raise ValueError(
278 raise ValueError(
279 f"IPython won't let you open fd={file} by default "
279 f"IPython won't let you open fd={file} by default "
280 "as it is likely to crash IPython. If you know what you are doing, "
280 "as it is likely to crash IPython. If you know what you are doing, "
281 "you can use builtins' open."
281 "you can use builtins' open."
282 )
282 )
283
283
284 return io_open(file, *args, **kwargs)
284 return io_open(file, *args, **kwargs)
285
285
286 class InteractiveShell(SingletonConfigurable):
286 class InteractiveShell(SingletonConfigurable):
287 """An enhanced, interactive shell for Python."""
287 """An enhanced, interactive shell for Python."""
288
288
289 _instance = None
289 _instance = None
290
290
291 ast_transformers = List([], help=
291 ast_transformers = List([], help=
292 """
292 """
293 A list of ast.NodeTransformer subclass instances, which will be applied
293 A list of ast.NodeTransformer subclass instances, which will be applied
294 to user input before code is run.
294 to user input before code is run.
295 """
295 """
296 ).tag(config=True)
296 ).tag(config=True)
297
297
298 autocall = Enum((0,1,2), default_value=0, help=
298 autocall = Enum((0,1,2), default_value=0, help=
299 """
299 """
300 Make IPython automatically call any callable object even if you didn't
300 Make IPython automatically call any callable object even if you didn't
301 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
301 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
302 automatically. The value can be '0' to disable the feature, '1' for
302 automatically. The value can be '0' to disable the feature, '1' for
303 'smart' autocall, where it is not applied if there are no more
303 'smart' autocall, where it is not applied if there are no more
304 arguments on the line, and '2' for 'full' autocall, where all callable
304 arguments on the line, and '2' for 'full' autocall, where all callable
305 objects are automatically called (even if no arguments are present).
305 objects are automatically called (even if no arguments are present).
306 """
306 """
307 ).tag(config=True)
307 ).tag(config=True)
308
308
309 autoindent = Bool(True, help=
309 autoindent = Bool(True, help=
310 """
310 """
311 Autoindent IPython code entered interactively.
311 Autoindent IPython code entered interactively.
312 """
312 """
313 ).tag(config=True)
313 ).tag(config=True)
314
314
315 autoawait = Bool(True, help=
315 autoawait = Bool(True, help=
316 """
316 """
317 Automatically run await statement in the top level repl.
317 Automatically run await statement in the top level repl.
318 """
318 """
319 ).tag(config=True)
319 ).tag(config=True)
320
320
321 loop_runner_map ={
321 loop_runner_map ={
322 'asyncio':(_asyncio_runner, True),
322 'asyncio':(_asyncio_runner, True),
323 'curio':(_curio_runner, True),
323 'curio':(_curio_runner, True),
324 'trio':(_trio_runner, True),
324 'trio':(_trio_runner, True),
325 'sync': (_pseudo_sync_runner, False)
325 'sync': (_pseudo_sync_runner, False)
326 }
326 }
327
327
328 loop_runner = Any(default_value="IPython.core.interactiveshell._asyncio_runner",
328 loop_runner = Any(default_value="IPython.core.interactiveshell._asyncio_runner",
329 allow_none=True,
329 allow_none=True,
330 help="""Select the loop runner that will be used to execute top-level asynchronous code"""
330 help="""Select the loop runner that will be used to execute top-level asynchronous code"""
331 ).tag(config=True)
331 ).tag(config=True)
332
332
333 @default('loop_runner')
333 @default('loop_runner')
334 def _default_loop_runner(self):
334 def _default_loop_runner(self):
335 return import_item("IPython.core.interactiveshell._asyncio_runner")
335 return import_item("IPython.core.interactiveshell._asyncio_runner")
336
336
337 @validate('loop_runner')
337 @validate('loop_runner')
338 def _import_runner(self, proposal):
338 def _import_runner(self, proposal):
339 if isinstance(proposal.value, str):
339 if isinstance(proposal.value, str):
340 if proposal.value in self.loop_runner_map:
340 if proposal.value in self.loop_runner_map:
341 runner, autoawait = self.loop_runner_map[proposal.value]
341 runner, autoawait = self.loop_runner_map[proposal.value]
342 self.autoawait = autoawait
342 self.autoawait = autoawait
343 return runner
343 return runner
344 runner = import_item(proposal.value)
344 runner = import_item(proposal.value)
345 if not callable(runner):
345 if not callable(runner):
346 raise ValueError('loop_runner must be callable')
346 raise ValueError('loop_runner must be callable')
347 return runner
347 return runner
348 if not callable(proposal.value):
348 if not callable(proposal.value):
349 raise ValueError('loop_runner must be callable')
349 raise ValueError('loop_runner must be callable')
350 return proposal.value
350 return proposal.value
351
351
352 automagic = Bool(True, help=
352 automagic = Bool(True, help=
353 """
353 """
354 Enable magic commands to be called without the leading %.
354 Enable magic commands to be called without the leading %.
355 """
355 """
356 ).tag(config=True)
356 ).tag(config=True)
357
357
358 banner1 = Unicode(default_banner,
358 banner1 = Unicode(default_banner,
359 help="""The part of the banner to be printed before the profile"""
359 help="""The part of the banner to be printed before the profile"""
360 ).tag(config=True)
360 ).tag(config=True)
361 banner2 = Unicode('',
361 banner2 = Unicode('',
362 help="""The part of the banner to be printed after the profile"""
362 help="""The part of the banner to be printed after the profile"""
363 ).tag(config=True)
363 ).tag(config=True)
364
364
365 cache_size = Integer(1000, help=
365 cache_size = Integer(1000, help=
366 """
366 """
367 Set the size of the output cache. The default is 1000, you can
367 Set the size of the output cache. The default is 1000, you can
368 change it permanently in your config file. Setting it to 0 completely
368 change it permanently in your config file. Setting it to 0 completely
369 disables the caching system, and the minimum value accepted is 3 (if
369 disables the caching system, and the minimum value accepted is 3 (if
370 you provide a value less than 3, it is reset to 0 and a warning is
370 you provide a value less than 3, it is reset to 0 and a warning is
371 issued). This limit is defined because otherwise you'll spend more
371 issued). This limit is defined because otherwise you'll spend more
372 time re-flushing a too small cache than working
372 time re-flushing a too small cache than working
373 """
373 """
374 ).tag(config=True)
374 ).tag(config=True)
375 color_info = Bool(True, help=
375 color_info = Bool(True, help=
376 """
376 """
377 Use colors for displaying information about objects. Because this
377 Use colors for displaying information about objects. Because this
378 information is passed through a pager (like 'less'), and some pagers
378 information is passed through a pager (like 'less'), and some pagers
379 get confused with color codes, this capability can be turned off.
379 get confused with color codes, this capability can be turned off.
380 """
380 """
381 ).tag(config=True)
381 ).tag(config=True)
382 colors = CaselessStrEnum(('Neutral', 'NoColor','LightBG','Linux'),
382 colors = CaselessStrEnum(('Neutral', 'NoColor','LightBG','Linux'),
383 default_value='Neutral',
383 default_value='Neutral',
384 help="Set the color scheme (NoColor, Neutral, Linux, or LightBG)."
384 help="Set the color scheme (NoColor, Neutral, Linux, or LightBG)."
385 ).tag(config=True)
385 ).tag(config=True)
386 debug = Bool(False).tag(config=True)
386 debug = Bool(False).tag(config=True)
387 disable_failing_post_execute = Bool(False,
387 disable_failing_post_execute = Bool(False,
388 help="Don't call post-execute functions that have failed in the past."
388 help="Don't call post-execute functions that have failed in the past."
389 ).tag(config=True)
389 ).tag(config=True)
390 display_formatter = Instance(DisplayFormatter, allow_none=True)
390 display_formatter = Instance(DisplayFormatter, allow_none=True)
391 displayhook_class = Type(DisplayHook)
391 displayhook_class = Type(DisplayHook)
392 display_pub_class = Type(DisplayPublisher)
392 display_pub_class = Type(DisplayPublisher)
393 compiler_class = Type(CachingCompiler)
393 compiler_class = Type(CachingCompiler)
394 inspector_class = Type(
394 inspector_class = Type(
395 oinspect.Inspector, help="Class to use to instantiate the shell inspector"
395 oinspect.Inspector, help="Class to use to instantiate the shell inspector"
396 ).tag(config=True)
396 ).tag(config=True)
397
397
398 sphinxify_docstring = Bool(False, help=
398 sphinxify_docstring = Bool(False, help=
399 """
399 """
400 Enables rich html representation of docstrings. (This requires the
400 Enables rich html representation of docstrings. (This requires the
401 docrepr module).
401 docrepr module).
402 """).tag(config=True)
402 """).tag(config=True)
403
403
404 @observe("sphinxify_docstring")
404 @observe("sphinxify_docstring")
405 def _sphinxify_docstring_changed(self, change):
405 def _sphinxify_docstring_changed(self, change):
406 if change['new']:
406 if change['new']:
407 warn("`sphinxify_docstring` is provisional since IPython 5.0 and might change in future versions." , ProvisionalWarning)
407 warn("`sphinxify_docstring` is provisional since IPython 5.0 and might change in future versions." , ProvisionalWarning)
408
408
409 enable_html_pager = Bool(False, help=
409 enable_html_pager = Bool(False, help=
410 """
410 """
411 (Provisional API) enables html representation in mime bundles sent
411 (Provisional API) enables html representation in mime bundles sent
412 to pagers.
412 to pagers.
413 """).tag(config=True)
413 """).tag(config=True)
414
414
415 @observe("enable_html_pager")
415 @observe("enable_html_pager")
416 def _enable_html_pager_changed(self, change):
416 def _enable_html_pager_changed(self, change):
417 if change['new']:
417 if change['new']:
418 warn("`enable_html_pager` is provisional since IPython 5.0 and might change in future versions.", ProvisionalWarning)
418 warn("`enable_html_pager` is provisional since IPython 5.0 and might change in future versions.", ProvisionalWarning)
419
419
420 data_pub_class = None
420 data_pub_class = None
421
421
422 exit_now = Bool(False)
422 exit_now = Bool(False)
423 exiter = Instance(ExitAutocall)
423 exiter = Instance(ExitAutocall)
424 @default('exiter')
424 @default('exiter')
425 def _exiter_default(self):
425 def _exiter_default(self):
426 return ExitAutocall(self)
426 return ExitAutocall(self)
427 # Monotonically increasing execution counter
427 # Monotonically increasing execution counter
428 execution_count = Integer(1)
428 execution_count = Integer(1)
429 filename = Unicode("<ipython console>")
429 filename = Unicode("<ipython console>")
430 ipython_dir= Unicode('').tag(config=True) # Set to get_ipython_dir() in __init__
430 ipython_dir= Unicode('').tag(config=True) # Set to get_ipython_dir() in __init__
431
431
432 # Used to transform cells before running them, and check whether code is complete
432 # Used to transform cells before running them, and check whether code is complete
433 input_transformer_manager = Instance('IPython.core.inputtransformer2.TransformerManager',
433 input_transformer_manager = Instance('IPython.core.inputtransformer2.TransformerManager',
434 ())
434 ())
435
435
436 @property
436 @property
437 def input_transformers_cleanup(self):
437 def input_transformers_cleanup(self):
438 return self.input_transformer_manager.cleanup_transforms
438 return self.input_transformer_manager.cleanup_transforms
439
439
440 input_transformers_post = List([],
440 input_transformers_post = List([],
441 help="A list of string input transformers, to be applied after IPython's "
441 help="A list of string input transformers, to be applied after IPython's "
442 "own input transformations."
442 "own input transformations."
443 )
443 )
444
444
445 @property
445 @property
446 def input_splitter(self):
446 def input_splitter(self):
447 """Make this available for backward compatibility (pre-7.0 release) with existing code.
447 """Make this available for backward compatibility (pre-7.0 release) with existing code.
448
448
449 For example, ipykernel ipykernel currently uses
449 For example, ipykernel ipykernel currently uses
450 `shell.input_splitter.check_complete`
450 `shell.input_splitter.check_complete`
451 """
451 """
452 from warnings import warn
452 from warnings import warn
453 warn("`input_splitter` is deprecated since IPython 7.0, prefer `input_transformer_manager`.",
453 warn("`input_splitter` is deprecated since IPython 7.0, prefer `input_transformer_manager`.",
454 DeprecationWarning, stacklevel=2
454 DeprecationWarning, stacklevel=2
455 )
455 )
456 return self.input_transformer_manager
456 return self.input_transformer_manager
457
457
458 logstart = Bool(False, help=
458 logstart = Bool(False, help=
459 """
459 """
460 Start logging to the default log file in overwrite mode.
460 Start logging to the default log file in overwrite mode.
461 Use `logappend` to specify a log file to **append** logs to.
461 Use `logappend` to specify a log file to **append** logs to.
462 """
462 """
463 ).tag(config=True)
463 ).tag(config=True)
464 logfile = Unicode('', help=
464 logfile = Unicode('', help=
465 """
465 """
466 The name of the logfile to use.
466 The name of the logfile to use.
467 """
467 """
468 ).tag(config=True)
468 ).tag(config=True)
469 logappend = Unicode('', help=
469 logappend = Unicode('', help=
470 """
470 """
471 Start logging to the given file in append mode.
471 Start logging to the given file in append mode.
472 Use `logfile` to specify a log file to **overwrite** logs to.
472 Use `logfile` to specify a log file to **overwrite** logs to.
473 """
473 """
474 ).tag(config=True)
474 ).tag(config=True)
475 object_info_string_level = Enum((0,1,2), default_value=0,
475 object_info_string_level = Enum((0,1,2), default_value=0,
476 ).tag(config=True)
476 ).tag(config=True)
477 pdb = Bool(False, help=
477 pdb = Bool(False, help=
478 """
478 """
479 Automatically call the pdb debugger after every exception.
479 Automatically call the pdb debugger after every exception.
480 """
480 """
481 ).tag(config=True)
481 ).tag(config=True)
482 display_page = Bool(False,
482 display_page = Bool(False,
483 help="""If True, anything that would be passed to the pager
483 help="""If True, anything that would be passed to the pager
484 will be displayed as regular output instead."""
484 will be displayed as regular output instead."""
485 ).tag(config=True)
485 ).tag(config=True)
486
486
487
487
488 show_rewritten_input = Bool(True,
488 show_rewritten_input = Bool(True,
489 help="Show rewritten input, e.g. for autocall."
489 help="Show rewritten input, e.g. for autocall."
490 ).tag(config=True)
490 ).tag(config=True)
491
491
492 quiet = Bool(False).tag(config=True)
492 quiet = Bool(False).tag(config=True)
493
493
494 history_length = Integer(10000,
494 history_length = Integer(10000,
495 help='Total length of command history'
495 help='Total length of command history'
496 ).tag(config=True)
496 ).tag(config=True)
497
497
498 history_load_length = Integer(1000, help=
498 history_load_length = Integer(1000, help=
499 """
499 """
500 The number of saved history entries to be loaded
500 The number of saved history entries to be loaded
501 into the history buffer at startup.
501 into the history buffer at startup.
502 """
502 """
503 ).tag(config=True)
503 ).tag(config=True)
504
504
505 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none', 'last_expr_or_assign'],
505 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none', 'last_expr_or_assign'],
506 default_value='last_expr',
506 default_value='last_expr',
507 help="""
507 help="""
508 'all', 'last', 'last_expr' or 'none', 'last_expr_or_assign' specifying
508 'all', 'last', 'last_expr' or 'none', 'last_expr_or_assign' specifying
509 which nodes should be run interactively (displaying output from expressions).
509 which nodes should be run interactively (displaying output from expressions).
510 """
510 """
511 ).tag(config=True)
511 ).tag(config=True)
512
512
513 warn_venv = Bool(
513 warn_venv = Bool(
514 True,
514 True,
515 help="Warn if running in a virtual environment with no IPython installed (so IPython from the global environment is used).",
515 help="Warn if running in a virtual environment with no IPython installed (so IPython from the global environment is used).",
516 ).tag(config=True)
516 ).tag(config=True)
517
517
518 # TODO: this part of prompt management should be moved to the frontends.
518 # TODO: this part of prompt management should be moved to the frontends.
519 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
519 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
520 separate_in = SeparateUnicode('\n').tag(config=True)
520 separate_in = SeparateUnicode('\n').tag(config=True)
521 separate_out = SeparateUnicode('').tag(config=True)
521 separate_out = SeparateUnicode('').tag(config=True)
522 separate_out2 = SeparateUnicode('').tag(config=True)
522 separate_out2 = SeparateUnicode('').tag(config=True)
523 wildcards_case_sensitive = Bool(True).tag(config=True)
523 wildcards_case_sensitive = Bool(True).tag(config=True)
524 xmode = CaselessStrEnum(('Context', 'Plain', 'Verbose', 'Minimal'),
524 xmode = CaselessStrEnum(('Context', 'Plain', 'Verbose', 'Minimal'),
525 default_value='Context',
525 default_value='Context',
526 help="Switch modes for the IPython exception handlers."
526 help="Switch modes for the IPython exception handlers."
527 ).tag(config=True)
527 ).tag(config=True)
528
528
529 # Subcomponents of InteractiveShell
529 # Subcomponents of InteractiveShell
530 alias_manager = Instance('IPython.core.alias.AliasManager', allow_none=True)
530 alias_manager = Instance('IPython.core.alias.AliasManager', allow_none=True)
531 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager', allow_none=True)
531 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager', allow_none=True)
532 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap', allow_none=True)
532 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap', allow_none=True)
533 display_trap = Instance('IPython.core.display_trap.DisplayTrap', allow_none=True)
533 display_trap = Instance('IPython.core.display_trap.DisplayTrap', allow_none=True)
534 extension_manager = Instance('IPython.core.extensions.ExtensionManager', allow_none=True)
534 extension_manager = Instance('IPython.core.extensions.ExtensionManager', allow_none=True)
535 payload_manager = Instance('IPython.core.payload.PayloadManager', allow_none=True)
535 payload_manager = Instance('IPython.core.payload.PayloadManager', allow_none=True)
536 history_manager = Instance('IPython.core.history.HistoryAccessorBase', allow_none=True)
536 history_manager = Instance('IPython.core.history.HistoryAccessorBase', allow_none=True)
537 magics_manager = Instance('IPython.core.magic.MagicsManager', allow_none=True)
537 magics_manager = Instance('IPython.core.magic.MagicsManager', allow_none=True)
538
538
539 profile_dir = Instance('IPython.core.application.ProfileDir', allow_none=True)
539 profile_dir = Instance('IPython.core.application.ProfileDir', allow_none=True)
540 @property
540 @property
541 def profile(self):
541 def profile(self):
542 if self.profile_dir is not None:
542 if self.profile_dir is not None:
543 name = os.path.basename(self.profile_dir.location)
543 name = os.path.basename(self.profile_dir.location)
544 return name.replace('profile_','')
544 return name.replace('profile_','')
545
545
546
546
547 # Private interface
547 # Private interface
548 _post_execute = Dict()
548 _post_execute = Dict()
549
549
550 # Tracks any GUI loop loaded for pylab
550 # Tracks any GUI loop loaded for pylab
551 pylab_gui_select = None
551 pylab_gui_select = None
552
552
553 last_execution_succeeded = Bool(True, help='Did last executed command succeeded')
553 last_execution_succeeded = Bool(True, help='Did last executed command succeeded')
554
554
555 last_execution_result = Instance('IPython.core.interactiveshell.ExecutionResult', help='Result of executing the last command', allow_none=True)
555 last_execution_result = Instance('IPython.core.interactiveshell.ExecutionResult', help='Result of executing the last command', allow_none=True)
556
556
557 def __init__(self, ipython_dir=None, profile_dir=None,
557 def __init__(self, ipython_dir=None, profile_dir=None,
558 user_module=None, user_ns=None,
558 user_module=None, user_ns=None,
559 custom_exceptions=((), None), **kwargs):
559 custom_exceptions=((), None), **kwargs):
560 # This is where traits with a config_key argument are updated
560 # This is where traits with a config_key argument are updated
561 # from the values on config.
561 # from the values on config.
562 super(InteractiveShell, self).__init__(**kwargs)
562 super(InteractiveShell, self).__init__(**kwargs)
563 if 'PromptManager' in self.config:
563 if 'PromptManager' in self.config:
564 warn('As of IPython 5.0 `PromptManager` config will have no effect'
564 warn('As of IPython 5.0 `PromptManager` config will have no effect'
565 ' and has been replaced by TerminalInteractiveShell.prompts_class')
565 ' and has been replaced by TerminalInteractiveShell.prompts_class')
566 self.configurables = [self]
566 self.configurables = [self]
567
567
568 # These are relatively independent and stateless
568 # These are relatively independent and stateless
569 self.init_ipython_dir(ipython_dir)
569 self.init_ipython_dir(ipython_dir)
570 self.init_profile_dir(profile_dir)
570 self.init_profile_dir(profile_dir)
571 self.init_instance_attrs()
571 self.init_instance_attrs()
572 self.init_environment()
572 self.init_environment()
573
573
574 # Check if we're in a virtualenv, and set up sys.path.
574 # Check if we're in a virtualenv, and set up sys.path.
575 self.init_virtualenv()
575 self.init_virtualenv()
576
576
577 # Create namespaces (user_ns, user_global_ns, etc.)
577 # Create namespaces (user_ns, user_global_ns, etc.)
578 self.init_create_namespaces(user_module, user_ns)
578 self.init_create_namespaces(user_module, user_ns)
579 # This has to be done after init_create_namespaces because it uses
579 # This has to be done after init_create_namespaces because it uses
580 # something in self.user_ns, but before init_sys_modules, which
580 # something in self.user_ns, but before init_sys_modules, which
581 # is the first thing to modify sys.
581 # is the first thing to modify sys.
582 # TODO: When we override sys.stdout and sys.stderr before this class
582 # TODO: When we override sys.stdout and sys.stderr before this class
583 # is created, we are saving the overridden ones here. Not sure if this
583 # is created, we are saving the overridden ones here. Not sure if this
584 # is what we want to do.
584 # is what we want to do.
585 self.save_sys_module_state()
585 self.save_sys_module_state()
586 self.init_sys_modules()
586 self.init_sys_modules()
587
587
588 # While we're trying to have each part of the code directly access what
588 # While we're trying to have each part of the code directly access what
589 # it needs without keeping redundant references to objects, we have too
589 # it needs without keeping redundant references to objects, we have too
590 # much legacy code that expects ip.db to exist.
590 # much legacy code that expects ip.db to exist.
591 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
591 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
592
592
593 self.init_history()
593 self.init_history()
594 self.init_encoding()
594 self.init_encoding()
595 self.init_prefilter()
595 self.init_prefilter()
596
596
597 self.init_syntax_highlighting()
597 self.init_syntax_highlighting()
598 self.init_hooks()
598 self.init_hooks()
599 self.init_events()
599 self.init_events()
600 self.init_pushd_popd_magic()
600 self.init_pushd_popd_magic()
601 self.init_user_ns()
601 self.init_user_ns()
602 self.init_logger()
602 self.init_logger()
603 self.init_builtins()
603 self.init_builtins()
604
604
605 # The following was in post_config_initialization
605 # The following was in post_config_initialization
606 self.init_inspector()
606 self.init_inspector()
607 self.raw_input_original = input
607 self.raw_input_original = input
608 self.init_completer()
608 self.init_completer()
609 # TODO: init_io() needs to happen before init_traceback handlers
609 # TODO: init_io() needs to happen before init_traceback handlers
610 # because the traceback handlers hardcode the stdout/stderr streams.
610 # because the traceback handlers hardcode the stdout/stderr streams.
611 # This logic in in debugger.Pdb and should eventually be changed.
611 # This logic in in debugger.Pdb and should eventually be changed.
612 self.init_io()
612 self.init_io()
613 self.init_traceback_handlers(custom_exceptions)
613 self.init_traceback_handlers(custom_exceptions)
614 self.init_prompts()
614 self.init_prompts()
615 self.init_display_formatter()
615 self.init_display_formatter()
616 self.init_display_pub()
616 self.init_display_pub()
617 self.init_data_pub()
617 self.init_data_pub()
618 self.init_displayhook()
618 self.init_displayhook()
619 self.init_magics()
619 self.init_magics()
620 self.init_alias()
620 self.init_alias()
621 self.init_logstart()
621 self.init_logstart()
622 self.init_pdb()
622 self.init_pdb()
623 self.init_extension_manager()
623 self.init_extension_manager()
624 self.init_payload()
624 self.init_payload()
625 self.events.trigger('shell_initialized', self)
625 self.events.trigger('shell_initialized', self)
626 atexit.register(self.atexit_operations)
626 atexit.register(self.atexit_operations)
627
627
628 # The trio runner is used for running Trio in the foreground thread. It
628 # The trio runner is used for running Trio in the foreground thread. It
629 # is different from `_trio_runner(async_fn)` in `async_helpers.py`
629 # is different from `_trio_runner(async_fn)` in `async_helpers.py`
630 # which calls `trio.run()` for every cell. This runner runs all cells
630 # which calls `trio.run()` for every cell. This runner runs all cells
631 # inside a single Trio event loop. If used, it is set from
631 # inside a single Trio event loop. If used, it is set from
632 # `ipykernel.kernelapp`.
632 # `ipykernel.kernelapp`.
633 self.trio_runner = None
633 self.trio_runner = None
634
634
635 def get_ipython(self):
635 def get_ipython(self):
636 """Return the currently running IPython instance."""
636 """Return the currently running IPython instance."""
637 return self
637 return self
638
638
639 #-------------------------------------------------------------------------
639 #-------------------------------------------------------------------------
640 # Trait changed handlers
640 # Trait changed handlers
641 #-------------------------------------------------------------------------
641 #-------------------------------------------------------------------------
642 @observe('ipython_dir')
642 @observe('ipython_dir')
643 def _ipython_dir_changed(self, change):
643 def _ipython_dir_changed(self, change):
644 ensure_dir_exists(change['new'])
644 ensure_dir_exists(change['new'])
645
645
646 def set_autoindent(self,value=None):
646 def set_autoindent(self,value=None):
647 """Set the autoindent flag.
647 """Set the autoindent flag.
648
648
649 If called with no arguments, it acts as a toggle."""
649 If called with no arguments, it acts as a toggle."""
650 if value is None:
650 if value is None:
651 self.autoindent = not self.autoindent
651 self.autoindent = not self.autoindent
652 else:
652 else:
653 self.autoindent = value
653 self.autoindent = value
654
654
655 def set_trio_runner(self, tr):
655 def set_trio_runner(self, tr):
656 self.trio_runner = tr
656 self.trio_runner = tr
657
657
658 #-------------------------------------------------------------------------
658 #-------------------------------------------------------------------------
659 # init_* methods called by __init__
659 # init_* methods called by __init__
660 #-------------------------------------------------------------------------
660 #-------------------------------------------------------------------------
661
661
662 def init_ipython_dir(self, ipython_dir):
662 def init_ipython_dir(self, ipython_dir):
663 if ipython_dir is not None:
663 if ipython_dir is not None:
664 self.ipython_dir = ipython_dir
664 self.ipython_dir = ipython_dir
665 return
665 return
666
666
667 self.ipython_dir = get_ipython_dir()
667 self.ipython_dir = get_ipython_dir()
668
668
669 def init_profile_dir(self, profile_dir):
669 def init_profile_dir(self, profile_dir):
670 if profile_dir is not None:
670 if profile_dir is not None:
671 self.profile_dir = profile_dir
671 self.profile_dir = profile_dir
672 return
672 return
673 self.profile_dir = ProfileDir.create_profile_dir_by_name(
673 self.profile_dir = ProfileDir.create_profile_dir_by_name(
674 self.ipython_dir, "default"
674 self.ipython_dir, "default"
675 )
675 )
676
676
677 def init_instance_attrs(self):
677 def init_instance_attrs(self):
678 self.more = False
678 self.more = False
679
679
680 # command compiler
680 # command compiler
681 self.compile = self.compiler_class()
681 self.compile = self.compiler_class()
682
682
683 # Make an empty namespace, which extension writers can rely on both
683 # Make an empty namespace, which extension writers can rely on both
684 # existing and NEVER being used by ipython itself. This gives them a
684 # existing and NEVER being used by ipython itself. This gives them a
685 # convenient location for storing additional information and state
685 # convenient location for storing additional information and state
686 # their extensions may require, without fear of collisions with other
686 # their extensions may require, without fear of collisions with other
687 # ipython names that may develop later.
687 # ipython names that may develop later.
688 self.meta = Struct()
688 self.meta = Struct()
689
689
690 # Temporary files used for various purposes. Deleted at exit.
690 # Temporary files used for various purposes. Deleted at exit.
691 # The files here are stored with Path from Pathlib
691 # The files here are stored with Path from Pathlib
692 self.tempfiles = []
692 self.tempfiles = []
693 self.tempdirs = []
693 self.tempdirs = []
694
694
695 # keep track of where we started running (mainly for crash post-mortem)
695 # keep track of where we started running (mainly for crash post-mortem)
696 # This is not being used anywhere currently.
696 # This is not being used anywhere currently.
697 self.starting_dir = os.getcwd()
697 self.starting_dir = os.getcwd()
698
698
699 # Indentation management
699 # Indentation management
700 self.indent_current_nsp = 0
700 self.indent_current_nsp = 0
701
701
702 # Dict to track post-execution functions that have been registered
702 # Dict to track post-execution functions that have been registered
703 self._post_execute = {}
703 self._post_execute = {}
704
704
705 def init_environment(self):
705 def init_environment(self):
706 """Any changes we need to make to the user's environment."""
706 """Any changes we need to make to the user's environment."""
707 pass
707 pass
708
708
709 def init_encoding(self):
709 def init_encoding(self):
710 # Get system encoding at startup time. Certain terminals (like Emacs
710 # Get system encoding at startup time. Certain terminals (like Emacs
711 # under Win32 have it set to None, and we need to have a known valid
711 # under Win32 have it set to None, and we need to have a known valid
712 # encoding to use in the raw_input() method
712 # encoding to use in the raw_input() method
713 try:
713 try:
714 self.stdin_encoding = sys.stdin.encoding or 'ascii'
714 self.stdin_encoding = sys.stdin.encoding or 'ascii'
715 except AttributeError:
715 except AttributeError:
716 self.stdin_encoding = 'ascii'
716 self.stdin_encoding = 'ascii'
717
717
718
718
719 @observe('colors')
719 @observe('colors')
720 def init_syntax_highlighting(self, changes=None):
720 def init_syntax_highlighting(self, changes=None):
721 # Python source parser/formatter for syntax highlighting
721 # Python source parser/formatter for syntax highlighting
722 pyformat = PyColorize.Parser(style=self.colors, parent=self).format
722 pyformat = PyColorize.Parser(style=self.colors, parent=self).format
723 self.pycolorize = lambda src: pyformat(src,'str')
723 self.pycolorize = lambda src: pyformat(src,'str')
724
724
725 def refresh_style(self):
725 def refresh_style(self):
726 # No-op here, used in subclass
726 # No-op here, used in subclass
727 pass
727 pass
728
728
729 def init_pushd_popd_magic(self):
729 def init_pushd_popd_magic(self):
730 # for pushd/popd management
730 # for pushd/popd management
731 self.home_dir = get_home_dir()
731 self.home_dir = get_home_dir()
732
732
733 self.dir_stack = []
733 self.dir_stack = []
734
734
735 def init_logger(self):
735 def init_logger(self):
736 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
736 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
737 logmode='rotate')
737 logmode='rotate')
738
738
739 def init_logstart(self):
739 def init_logstart(self):
740 """Initialize logging in case it was requested at the command line.
740 """Initialize logging in case it was requested at the command line.
741 """
741 """
742 if self.logappend:
742 if self.logappend:
743 self.magic('logstart %s append' % self.logappend)
743 self.magic('logstart %s append' % self.logappend)
744 elif self.logfile:
744 elif self.logfile:
745 self.magic('logstart %s' % self.logfile)
745 self.magic('logstart %s' % self.logfile)
746 elif self.logstart:
746 elif self.logstart:
747 self.magic('logstart')
747 self.magic('logstart')
748
748
749
749
750 def init_builtins(self):
750 def init_builtins(self):
751 # A single, static flag that we set to True. Its presence indicates
751 # A single, static flag that we set to True. Its presence indicates
752 # that an IPython shell has been created, and we make no attempts at
752 # that an IPython shell has been created, and we make no attempts at
753 # removing on exit or representing the existence of more than one
753 # removing on exit or representing the existence of more than one
754 # IPython at a time.
754 # IPython at a time.
755 builtin_mod.__dict__['__IPYTHON__'] = True
755 builtin_mod.__dict__['__IPYTHON__'] = True
756 builtin_mod.__dict__['display'] = display
756 builtin_mod.__dict__['display'] = display
757
757
758 self.builtin_trap = BuiltinTrap(shell=self)
758 self.builtin_trap = BuiltinTrap(shell=self)
759
759
760 @observe('colors')
760 @observe('colors')
761 def init_inspector(self, changes=None):
761 def init_inspector(self, changes=None):
762 # Object inspector
762 # Object inspector
763 self.inspector = self.inspector_class(
763 self.inspector = self.inspector_class(
764 oinspect.InspectColors,
764 oinspect.InspectColors,
765 PyColorize.ANSICodeColors,
765 PyColorize.ANSICodeColors,
766 self.colors,
766 self.colors,
767 self.object_info_string_level,
767 self.object_info_string_level,
768 )
768 )
769
769
770 def init_io(self):
770 def init_io(self):
771 # implemented in subclasses, TerminalInteractiveShell does call
771 # implemented in subclasses, TerminalInteractiveShell does call
772 # colorama.init().
772 # colorama.init().
773 pass
773 pass
774
774
775 def init_prompts(self):
775 def init_prompts(self):
776 # Set system prompts, so that scripts can decide if they are running
776 # Set system prompts, so that scripts can decide if they are running
777 # interactively.
777 # interactively.
778 sys.ps1 = 'In : '
778 sys.ps1 = 'In : '
779 sys.ps2 = '...: '
779 sys.ps2 = '...: '
780 sys.ps3 = 'Out: '
780 sys.ps3 = 'Out: '
781
781
782 def init_display_formatter(self):
782 def init_display_formatter(self):
783 self.display_formatter = DisplayFormatter(parent=self)
783 self.display_formatter = DisplayFormatter(parent=self)
784 self.configurables.append(self.display_formatter)
784 self.configurables.append(self.display_formatter)
785
785
786 def init_display_pub(self):
786 def init_display_pub(self):
787 self.display_pub = self.display_pub_class(parent=self, shell=self)
787 self.display_pub = self.display_pub_class(parent=self, shell=self)
788 self.configurables.append(self.display_pub)
788 self.configurables.append(self.display_pub)
789
789
790 def init_data_pub(self):
790 def init_data_pub(self):
791 if not self.data_pub_class:
791 if not self.data_pub_class:
792 self.data_pub = None
792 self.data_pub = None
793 return
793 return
794 self.data_pub = self.data_pub_class(parent=self)
794 self.data_pub = self.data_pub_class(parent=self)
795 self.configurables.append(self.data_pub)
795 self.configurables.append(self.data_pub)
796
796
797 def init_displayhook(self):
797 def init_displayhook(self):
798 # Initialize displayhook, set in/out prompts and printing system
798 # Initialize displayhook, set in/out prompts and printing system
799 self.displayhook = self.displayhook_class(
799 self.displayhook = self.displayhook_class(
800 parent=self,
800 parent=self,
801 shell=self,
801 shell=self,
802 cache_size=self.cache_size,
802 cache_size=self.cache_size,
803 )
803 )
804 self.configurables.append(self.displayhook)
804 self.configurables.append(self.displayhook)
805 # This is a context manager that installs/revmoes the displayhook at
805 # This is a context manager that installs/revmoes the displayhook at
806 # the appropriate time.
806 # the appropriate time.
807 self.display_trap = DisplayTrap(hook=self.displayhook)
807 self.display_trap = DisplayTrap(hook=self.displayhook)
808
808
809 @staticmethod
809 @staticmethod
810 def get_path_links(p: Path):
810 def get_path_links(p: Path):
811 """Gets path links including all symlinks
811 """Gets path links including all symlinks
812
812
813 Examples
813 Examples
814 --------
814 --------
815 In [1]: from IPython.core.interactiveshell import InteractiveShell
815 In [1]: from IPython.core.interactiveshell import InteractiveShell
816
816
817 In [2]: import sys, pathlib
817 In [2]: import sys, pathlib
818
818
819 In [3]: paths = InteractiveShell.get_path_links(pathlib.Path(sys.executable))
819 In [3]: paths = InteractiveShell.get_path_links(pathlib.Path(sys.executable))
820
820
821 In [4]: len(paths) == len(set(paths))
821 In [4]: len(paths) == len(set(paths))
822 Out[4]: True
822 Out[4]: True
823
823
824 In [5]: bool(paths)
824 In [5]: bool(paths)
825 Out[5]: True
825 Out[5]: True
826 """
826 """
827 paths = [p]
827 paths = [p]
828 while p.is_symlink():
828 while p.is_symlink():
829 new_path = Path(os.readlink(p))
829 new_path = Path(os.readlink(p))
830 if not new_path.is_absolute():
830 if not new_path.is_absolute():
831 new_path = p.parent / new_path
831 new_path = p.parent / new_path
832 p = new_path
832 p = new_path
833 paths.append(p)
833 paths.append(p)
834 return paths
834 return paths
835
835
836 def init_virtualenv(self):
836 def init_virtualenv(self):
837 """Add the current virtualenv to sys.path so the user can import modules from it.
837 """Add the current virtualenv to sys.path so the user can import modules from it.
838 This isn't perfect: it doesn't use the Python interpreter with which the
838 This isn't perfect: it doesn't use the Python interpreter with which the
839 virtualenv was built, and it ignores the --no-site-packages option. A
839 virtualenv was built, and it ignores the --no-site-packages option. A
840 warning will appear suggesting the user installs IPython in the
840 warning will appear suggesting the user installs IPython in the
841 virtualenv, but for many cases, it probably works well enough.
841 virtualenv, but for many cases, it probably works well enough.
842
842
843 Adapted from code snippets online.
843 Adapted from code snippets online.
844
844
845 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
845 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
846 """
846 """
847 if 'VIRTUAL_ENV' not in os.environ:
847 if 'VIRTUAL_ENV' not in os.environ:
848 # Not in a virtualenv
848 # Not in a virtualenv
849 return
849 return
850 elif os.environ["VIRTUAL_ENV"] == "":
850 elif os.environ["VIRTUAL_ENV"] == "":
851 warn("Virtual env path set to '', please check if this is intended.")
851 warn("Virtual env path set to '', please check if this is intended.")
852 return
852 return
853
853
854 p = Path(sys.executable)
854 p = Path(sys.executable)
855 p_venv = Path(os.environ["VIRTUAL_ENV"])
855 p_venv = Path(os.environ["VIRTUAL_ENV"])
856
856
857 # fallback venv detection:
857 # fallback venv detection:
858 # stdlib venv may symlink sys.executable, so we can't use realpath.
858 # stdlib venv may symlink sys.executable, so we can't use realpath.
859 # but others can symlink *to* the venv Python, so we can't just use sys.executable.
859 # but others can symlink *to* the venv Python, so we can't just use sys.executable.
860 # So we just check every item in the symlink tree (generally <= 3)
860 # So we just check every item in the symlink tree (generally <= 3)
861 paths = self.get_path_links(p)
861 paths = self.get_path_links(p)
862
862
863 # In Cygwin paths like "c:\..." and '\cygdrive\c\...' are possible
863 # In Cygwin paths like "c:\..." and '\cygdrive\c\...' are possible
864 if p_venv.parts[1] == "cygdrive":
864 if p_venv.parts[1] == "cygdrive":
865 drive_name = p_venv.parts[2]
865 drive_name = p_venv.parts[2]
866 p_venv = (drive_name + ":/") / Path(*p_venv.parts[3:])
866 p_venv = (drive_name + ":/") / Path(*p_venv.parts[3:])
867
867
868 if any(p_venv == p.parents[1] for p in paths):
868 if any(p_venv == p.parents[1] for p in paths):
869 # Our exe is inside or has access to the virtualenv, don't need to do anything.
869 # Our exe is inside or has access to the virtualenv, don't need to do anything.
870 return
870 return
871
871
872 if sys.platform == "win32":
872 if sys.platform == "win32":
873 virtual_env = str(Path(os.environ["VIRTUAL_ENV"], "Lib", "site-packages"))
873 virtual_env = str(Path(os.environ["VIRTUAL_ENV"], "Lib", "site-packages"))
874 else:
874 else:
875 virtual_env_path = Path(
875 virtual_env_path = Path(
876 os.environ["VIRTUAL_ENV"], "lib", "python{}.{}", "site-packages"
876 os.environ["VIRTUAL_ENV"], "lib", "python{}.{}", "site-packages"
877 )
877 )
878 p_ver = sys.version_info[:2]
878 p_ver = sys.version_info[:2]
879
879
880 # Predict version from py[thon]-x.x in the $VIRTUAL_ENV
880 # Predict version from py[thon]-x.x in the $VIRTUAL_ENV
881 re_m = re.search(r"\bpy(?:thon)?([23])\.(\d+)\b", os.environ["VIRTUAL_ENV"])
881 re_m = re.search(r"\bpy(?:thon)?([23])\.(\d+)\b", os.environ["VIRTUAL_ENV"])
882 if re_m:
882 if re_m:
883 predicted_path = Path(str(virtual_env_path).format(*re_m.groups()))
883 predicted_path = Path(str(virtual_env_path).format(*re_m.groups()))
884 if predicted_path.exists():
884 if predicted_path.exists():
885 p_ver = re_m.groups()
885 p_ver = re_m.groups()
886
886
887 virtual_env = str(virtual_env_path).format(*p_ver)
887 virtual_env = str(virtual_env_path).format(*p_ver)
888 if self.warn_venv:
888 if self.warn_venv:
889 warn(
889 warn(
890 "Attempting to work in a virtualenv. If you encounter problems, "
890 "Attempting to work in a virtualenv. If you encounter problems, "
891 "please install IPython inside the virtualenv."
891 "please install IPython inside the virtualenv."
892 )
892 )
893 import site
893 import site
894 sys.path.insert(0, virtual_env)
894 sys.path.insert(0, virtual_env)
895 site.addsitedir(virtual_env)
895 site.addsitedir(virtual_env)
896
896
897 #-------------------------------------------------------------------------
897 #-------------------------------------------------------------------------
898 # Things related to injections into the sys module
898 # Things related to injections into the sys module
899 #-------------------------------------------------------------------------
899 #-------------------------------------------------------------------------
900
900
901 def save_sys_module_state(self):
901 def save_sys_module_state(self):
902 """Save the state of hooks in the sys module.
902 """Save the state of hooks in the sys module.
903
903
904 This has to be called after self.user_module is created.
904 This has to be called after self.user_module is created.
905 """
905 """
906 self._orig_sys_module_state = {'stdin': sys.stdin,
906 self._orig_sys_module_state = {'stdin': sys.stdin,
907 'stdout': sys.stdout,
907 'stdout': sys.stdout,
908 'stderr': sys.stderr,
908 'stderr': sys.stderr,
909 'excepthook': sys.excepthook}
909 'excepthook': sys.excepthook}
910 self._orig_sys_modules_main_name = self.user_module.__name__
910 self._orig_sys_modules_main_name = self.user_module.__name__
911 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
911 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
912
912
913 def restore_sys_module_state(self):
913 def restore_sys_module_state(self):
914 """Restore the state of the sys module."""
914 """Restore the state of the sys module."""
915 try:
915 try:
916 for k, v in self._orig_sys_module_state.items():
916 for k, v in self._orig_sys_module_state.items():
917 setattr(sys, k, v)
917 setattr(sys, k, v)
918 except AttributeError:
918 except AttributeError:
919 pass
919 pass
920 # Reset what what done in self.init_sys_modules
920 # Reset what what done in self.init_sys_modules
921 if self._orig_sys_modules_main_mod is not None:
921 if self._orig_sys_modules_main_mod is not None:
922 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
922 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
923
923
924 #-------------------------------------------------------------------------
924 #-------------------------------------------------------------------------
925 # Things related to the banner
925 # Things related to the banner
926 #-------------------------------------------------------------------------
926 #-------------------------------------------------------------------------
927
927
928 @property
928 @property
929 def banner(self):
929 def banner(self):
930 banner = self.banner1
930 banner = self.banner1
931 if self.profile and self.profile != 'default':
931 if self.profile and self.profile != 'default':
932 banner += '\nIPython profile: %s\n' % self.profile
932 banner += '\nIPython profile: %s\n' % self.profile
933 if self.banner2:
933 if self.banner2:
934 banner += '\n' + self.banner2
934 banner += '\n' + self.banner2
935 return banner
935 return banner
936
936
937 def show_banner(self, banner=None):
937 def show_banner(self, banner=None):
938 if banner is None:
938 if banner is None:
939 banner = self.banner
939 banner = self.banner
940 sys.stdout.write(banner)
940 sys.stdout.write(banner)
941
941
942 #-------------------------------------------------------------------------
942 #-------------------------------------------------------------------------
943 # Things related to hooks
943 # Things related to hooks
944 #-------------------------------------------------------------------------
944 #-------------------------------------------------------------------------
945
945
946 def init_hooks(self):
946 def init_hooks(self):
947 # hooks holds pointers used for user-side customizations
947 # hooks holds pointers used for user-side customizations
948 self.hooks = Struct()
948 self.hooks = Struct()
949
949
950 self.strdispatchers = {}
950 self.strdispatchers = {}
951
951
952 # Set all default hooks, defined in the IPython.hooks module.
952 # Set all default hooks, defined in the IPython.hooks module.
953 hooks = IPython.core.hooks
953 hooks = IPython.core.hooks
954 for hook_name in hooks.__all__:
954 for hook_name in hooks.__all__:
955 # default hooks have priority 100, i.e. low; user hooks should have
955 # default hooks have priority 100, i.e. low; user hooks should have
956 # 0-100 priority
956 # 0-100 priority
957 self.set_hook(hook_name, getattr(hooks, hook_name), 100)
957 self.set_hook(hook_name, getattr(hooks, hook_name), 100)
958
958
959 if self.display_page:
959 if self.display_page:
960 self.set_hook('show_in_pager', page.as_hook(page.display_page), 90)
960 self.set_hook('show_in_pager', page.as_hook(page.display_page), 90)
961
961
962 def set_hook(self, name, hook, priority=50, str_key=None, re_key=None):
962 def set_hook(self, name, hook, priority=50, str_key=None, re_key=None):
963 """set_hook(name,hook) -> sets an internal IPython hook.
963 """set_hook(name,hook) -> sets an internal IPython hook.
964
964
965 IPython exposes some of its internal API as user-modifiable hooks. By
965 IPython exposes some of its internal API as user-modifiable hooks. By
966 adding your function to one of these hooks, you can modify IPython's
966 adding your function to one of these hooks, you can modify IPython's
967 behavior to call at runtime your own routines."""
967 behavior to call at runtime your own routines."""
968
968
969 # At some point in the future, this should validate the hook before it
969 # At some point in the future, this should validate the hook before it
970 # accepts it. Probably at least check that the hook takes the number
970 # accepts it. Probably at least check that the hook takes the number
971 # of args it's supposed to.
971 # of args it's supposed to.
972
972
973 f = types.MethodType(hook,self)
973 f = types.MethodType(hook,self)
974
974
975 # check if the hook is for strdispatcher first
975 # check if the hook is for strdispatcher first
976 if str_key is not None:
976 if str_key is not None:
977 sdp = self.strdispatchers.get(name, StrDispatch())
977 sdp = self.strdispatchers.get(name, StrDispatch())
978 sdp.add_s(str_key, f, priority )
978 sdp.add_s(str_key, f, priority )
979 self.strdispatchers[name] = sdp
979 self.strdispatchers[name] = sdp
980 return
980 return
981 if re_key is not None:
981 if re_key is not None:
982 sdp = self.strdispatchers.get(name, StrDispatch())
982 sdp = self.strdispatchers.get(name, StrDispatch())
983 sdp.add_re(re.compile(re_key), f, priority )
983 sdp.add_re(re.compile(re_key), f, priority )
984 self.strdispatchers[name] = sdp
984 self.strdispatchers[name] = sdp
985 return
985 return
986
986
987 dp = getattr(self.hooks, name, None)
987 dp = getattr(self.hooks, name, None)
988 if name not in IPython.core.hooks.__all__:
988 if name not in IPython.core.hooks.__all__:
989 print("Warning! Hook '%s' is not one of %s" % \
989 print("Warning! Hook '%s' is not one of %s" % \
990 (name, IPython.core.hooks.__all__ ))
990 (name, IPython.core.hooks.__all__ ))
991
991
992 if name in IPython.core.hooks.deprecated:
992 if name in IPython.core.hooks.deprecated:
993 alternative = IPython.core.hooks.deprecated[name]
993 alternative = IPython.core.hooks.deprecated[name]
994 raise ValueError(
994 raise ValueError(
995 "Hook {} has been deprecated since IPython 5.0. Use {} instead.".format(
995 "Hook {} has been deprecated since IPython 5.0. Use {} instead.".format(
996 name, alternative
996 name, alternative
997 )
997 )
998 )
998 )
999
999
1000 if not dp:
1000 if not dp:
1001 dp = IPython.core.hooks.CommandChainDispatcher()
1001 dp = IPython.core.hooks.CommandChainDispatcher()
1002
1002
1003 try:
1003 try:
1004 dp.add(f,priority)
1004 dp.add(f,priority)
1005 except AttributeError:
1005 except AttributeError:
1006 # it was not commandchain, plain old func - replace
1006 # it was not commandchain, plain old func - replace
1007 dp = f
1007 dp = f
1008
1008
1009 setattr(self.hooks,name, dp)
1009 setattr(self.hooks,name, dp)
1010
1010
1011 #-------------------------------------------------------------------------
1011 #-------------------------------------------------------------------------
1012 # Things related to events
1012 # Things related to events
1013 #-------------------------------------------------------------------------
1013 #-------------------------------------------------------------------------
1014
1014
1015 def init_events(self):
1015 def init_events(self):
1016 self.events = EventManager(self, available_events)
1016 self.events = EventManager(self, available_events)
1017
1017
1018 self.events.register("pre_execute", self._clear_warning_registry)
1018 self.events.register("pre_execute", self._clear_warning_registry)
1019
1019
1020 def register_post_execute(self, func):
1020 def register_post_execute(self, func):
1021 """DEPRECATED: Use ip.events.register('post_run_cell', func)
1021 """DEPRECATED: Use ip.events.register('post_run_cell', func)
1022
1022
1023 Register a function for calling after code execution.
1023 Register a function for calling after code execution.
1024 """
1024 """
1025 raise ValueError(
1025 raise ValueError(
1026 "ip.register_post_execute is deprecated since IPython 1.0, use "
1026 "ip.register_post_execute is deprecated since IPython 1.0, use "
1027 "ip.events.register('post_run_cell', func) instead."
1027 "ip.events.register('post_run_cell', func) instead."
1028 )
1028 )
1029
1029
1030 def _clear_warning_registry(self):
1030 def _clear_warning_registry(self):
1031 # clear the warning registry, so that different code blocks with
1031 # clear the warning registry, so that different code blocks with
1032 # overlapping line number ranges don't cause spurious suppression of
1032 # overlapping line number ranges don't cause spurious suppression of
1033 # warnings (see gh-6611 for details)
1033 # warnings (see gh-6611 for details)
1034 if "__warningregistry__" in self.user_global_ns:
1034 if "__warningregistry__" in self.user_global_ns:
1035 del self.user_global_ns["__warningregistry__"]
1035 del self.user_global_ns["__warningregistry__"]
1036
1036
1037 #-------------------------------------------------------------------------
1037 #-------------------------------------------------------------------------
1038 # Things related to the "main" module
1038 # Things related to the "main" module
1039 #-------------------------------------------------------------------------
1039 #-------------------------------------------------------------------------
1040
1040
1041 def new_main_mod(self, filename, modname):
1041 def new_main_mod(self, filename, modname):
1042 """Return a new 'main' module object for user code execution.
1042 """Return a new 'main' module object for user code execution.
1043
1043
1044 ``filename`` should be the path of the script which will be run in the
1044 ``filename`` should be the path of the script which will be run in the
1045 module. Requests with the same filename will get the same module, with
1045 module. Requests with the same filename will get the same module, with
1046 its namespace cleared.
1046 its namespace cleared.
1047
1047
1048 ``modname`` should be the module name - normally either '__main__' or
1048 ``modname`` should be the module name - normally either '__main__' or
1049 the basename of the file without the extension.
1049 the basename of the file without the extension.
1050
1050
1051 When scripts are executed via %run, we must keep a reference to their
1051 When scripts are executed via %run, we must keep a reference to their
1052 __main__ module around so that Python doesn't
1052 __main__ module around so that Python doesn't
1053 clear it, rendering references to module globals useless.
1053 clear it, rendering references to module globals useless.
1054
1054
1055 This method keeps said reference in a private dict, keyed by the
1055 This method keeps said reference in a private dict, keyed by the
1056 absolute path of the script. This way, for multiple executions of the
1056 absolute path of the script. This way, for multiple executions of the
1057 same script we only keep one copy of the namespace (the last one),
1057 same script we only keep one copy of the namespace (the last one),
1058 thus preventing memory leaks from old references while allowing the
1058 thus preventing memory leaks from old references while allowing the
1059 objects from the last execution to be accessible.
1059 objects from the last execution to be accessible.
1060 """
1060 """
1061 filename = os.path.abspath(filename)
1061 filename = os.path.abspath(filename)
1062 try:
1062 try:
1063 main_mod = self._main_mod_cache[filename]
1063 main_mod = self._main_mod_cache[filename]
1064 except KeyError:
1064 except KeyError:
1065 main_mod = self._main_mod_cache[filename] = types.ModuleType(
1065 main_mod = self._main_mod_cache[filename] = types.ModuleType(
1066 modname,
1066 modname,
1067 doc="Module created for script run in IPython")
1067 doc="Module created for script run in IPython")
1068 else:
1068 else:
1069 main_mod.__dict__.clear()
1069 main_mod.__dict__.clear()
1070 main_mod.__name__ = modname
1070 main_mod.__name__ = modname
1071
1071
1072 main_mod.__file__ = filename
1072 main_mod.__file__ = filename
1073 # It seems pydoc (and perhaps others) needs any module instance to
1073 # It seems pydoc (and perhaps others) needs any module instance to
1074 # implement a __nonzero__ method
1074 # implement a __nonzero__ method
1075 main_mod.__nonzero__ = lambda : True
1075 main_mod.__nonzero__ = lambda : True
1076
1076
1077 return main_mod
1077 return main_mod
1078
1078
1079 def clear_main_mod_cache(self):
1079 def clear_main_mod_cache(self):
1080 """Clear the cache of main modules.
1080 """Clear the cache of main modules.
1081
1081
1082 Mainly for use by utilities like %reset.
1082 Mainly for use by utilities like %reset.
1083
1083
1084 Examples
1084 Examples
1085 --------
1085 --------
1086 In [15]: import IPython
1086 In [15]: import IPython
1087
1087
1088 In [16]: m = _ip.new_main_mod(IPython.__file__, 'IPython')
1088 In [16]: m = _ip.new_main_mod(IPython.__file__, 'IPython')
1089
1089
1090 In [17]: len(_ip._main_mod_cache) > 0
1090 In [17]: len(_ip._main_mod_cache) > 0
1091 Out[17]: True
1091 Out[17]: True
1092
1092
1093 In [18]: _ip.clear_main_mod_cache()
1093 In [18]: _ip.clear_main_mod_cache()
1094
1094
1095 In [19]: len(_ip._main_mod_cache) == 0
1095 In [19]: len(_ip._main_mod_cache) == 0
1096 Out[19]: True
1096 Out[19]: True
1097 """
1097 """
1098 self._main_mod_cache.clear()
1098 self._main_mod_cache.clear()
1099
1099
1100 #-------------------------------------------------------------------------
1100 #-------------------------------------------------------------------------
1101 # Things related to debugging
1101 # Things related to debugging
1102 #-------------------------------------------------------------------------
1102 #-------------------------------------------------------------------------
1103
1103
1104 def init_pdb(self):
1104 def init_pdb(self):
1105 # Set calling of pdb on exceptions
1105 # Set calling of pdb on exceptions
1106 # self.call_pdb is a property
1106 # self.call_pdb is a property
1107 self.call_pdb = self.pdb
1107 self.call_pdb = self.pdb
1108
1108
1109 def _get_call_pdb(self):
1109 def _get_call_pdb(self):
1110 return self._call_pdb
1110 return self._call_pdb
1111
1111
1112 def _set_call_pdb(self,val):
1112 def _set_call_pdb(self,val):
1113
1113
1114 if val not in (0,1,False,True):
1114 if val not in (0,1,False,True):
1115 raise ValueError('new call_pdb value must be boolean')
1115 raise ValueError('new call_pdb value must be boolean')
1116
1116
1117 # store value in instance
1117 # store value in instance
1118 self._call_pdb = val
1118 self._call_pdb = val
1119
1119
1120 # notify the actual exception handlers
1120 # notify the actual exception handlers
1121 self.InteractiveTB.call_pdb = val
1121 self.InteractiveTB.call_pdb = val
1122
1122
1123 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
1123 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
1124 'Control auto-activation of pdb at exceptions')
1124 'Control auto-activation of pdb at exceptions')
1125
1125
1126 def debugger(self,force=False):
1126 def debugger(self,force=False):
1127 """Call the pdb debugger.
1127 """Call the pdb debugger.
1128
1128
1129 Keywords:
1129 Keywords:
1130
1130
1131 - force(False): by default, this routine checks the instance call_pdb
1131 - force(False): by default, this routine checks the instance call_pdb
1132 flag and does not actually invoke the debugger if the flag is false.
1132 flag and does not actually invoke the debugger if the flag is false.
1133 The 'force' option forces the debugger to activate even if the flag
1133 The 'force' option forces the debugger to activate even if the flag
1134 is false.
1134 is false.
1135 """
1135 """
1136
1136
1137 if not (force or self.call_pdb):
1137 if not (force or self.call_pdb):
1138 return
1138 return
1139
1139
1140 if not hasattr(sys,'last_traceback'):
1140 if not hasattr(sys,'last_traceback'):
1141 error('No traceback has been produced, nothing to debug.')
1141 error('No traceback has been produced, nothing to debug.')
1142 return
1142 return
1143
1143
1144 self.InteractiveTB.debugger(force=True)
1144 self.InteractiveTB.debugger(force=True)
1145
1145
1146 #-------------------------------------------------------------------------
1146 #-------------------------------------------------------------------------
1147 # Things related to IPython's various namespaces
1147 # Things related to IPython's various namespaces
1148 #-------------------------------------------------------------------------
1148 #-------------------------------------------------------------------------
1149 default_user_namespaces = True
1149 default_user_namespaces = True
1150
1150
1151 def init_create_namespaces(self, user_module=None, user_ns=None):
1151 def init_create_namespaces(self, user_module=None, user_ns=None):
1152 # Create the namespace where the user will operate. user_ns is
1152 # Create the namespace where the user will operate. user_ns is
1153 # normally the only one used, and it is passed to the exec calls as
1153 # normally the only one used, and it is passed to the exec calls as
1154 # the locals argument. But we do carry a user_global_ns namespace
1154 # the locals argument. But we do carry a user_global_ns namespace
1155 # given as the exec 'globals' argument, This is useful in embedding
1155 # given as the exec 'globals' argument, This is useful in embedding
1156 # situations where the ipython shell opens in a context where the
1156 # situations where the ipython shell opens in a context where the
1157 # distinction between locals and globals is meaningful. For
1157 # distinction between locals and globals is meaningful. For
1158 # non-embedded contexts, it is just the same object as the user_ns dict.
1158 # non-embedded contexts, it is just the same object as the user_ns dict.
1159
1159
1160 # FIXME. For some strange reason, __builtins__ is showing up at user
1160 # FIXME. For some strange reason, __builtins__ is showing up at user
1161 # level as a dict instead of a module. This is a manual fix, but I
1161 # level as a dict instead of a module. This is a manual fix, but I
1162 # should really track down where the problem is coming from. Alex
1162 # should really track down where the problem is coming from. Alex
1163 # Schmolck reported this problem first.
1163 # Schmolck reported this problem first.
1164
1164
1165 # A useful post by Alex Martelli on this topic:
1165 # A useful post by Alex Martelli on this topic:
1166 # Re: inconsistent value from __builtins__
1166 # Re: inconsistent value from __builtins__
1167 # Von: Alex Martelli <aleaxit@yahoo.com>
1167 # Von: Alex Martelli <aleaxit@yahoo.com>
1168 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
1168 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
1169 # Gruppen: comp.lang.python
1169 # Gruppen: comp.lang.python
1170
1170
1171 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
1171 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
1172 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
1172 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
1173 # > <type 'dict'>
1173 # > <type 'dict'>
1174 # > >>> print type(__builtins__)
1174 # > >>> print type(__builtins__)
1175 # > <type 'module'>
1175 # > <type 'module'>
1176 # > Is this difference in return value intentional?
1176 # > Is this difference in return value intentional?
1177
1177
1178 # Well, it's documented that '__builtins__' can be either a dictionary
1178 # Well, it's documented that '__builtins__' can be either a dictionary
1179 # or a module, and it's been that way for a long time. Whether it's
1179 # or a module, and it's been that way for a long time. Whether it's
1180 # intentional (or sensible), I don't know. In any case, the idea is
1180 # intentional (or sensible), I don't know. In any case, the idea is
1181 # that if you need to access the built-in namespace directly, you
1181 # that if you need to access the built-in namespace directly, you
1182 # should start with "import __builtin__" (note, no 's') which will
1182 # should start with "import __builtin__" (note, no 's') which will
1183 # definitely give you a module. Yeah, it's somewhat confusing:-(.
1183 # definitely give you a module. Yeah, it's somewhat confusing:-(.
1184
1184
1185 # These routines return a properly built module and dict as needed by
1185 # These routines return a properly built module and dict as needed by
1186 # the rest of the code, and can also be used by extension writers to
1186 # the rest of the code, and can also be used by extension writers to
1187 # generate properly initialized namespaces.
1187 # generate properly initialized namespaces.
1188 if (user_ns is not None) or (user_module is not None):
1188 if (user_ns is not None) or (user_module is not None):
1189 self.default_user_namespaces = False
1189 self.default_user_namespaces = False
1190 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
1190 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
1191
1191
1192 # A record of hidden variables we have added to the user namespace, so
1192 # A record of hidden variables we have added to the user namespace, so
1193 # we can list later only variables defined in actual interactive use.
1193 # we can list later only variables defined in actual interactive use.
1194 self.user_ns_hidden = {}
1194 self.user_ns_hidden = {}
1195
1195
1196 # Now that FakeModule produces a real module, we've run into a nasty
1196 # Now that FakeModule produces a real module, we've run into a nasty
1197 # problem: after script execution (via %run), the module where the user
1197 # problem: after script execution (via %run), the module where the user
1198 # code ran is deleted. Now that this object is a true module (needed
1198 # code ran is deleted. Now that this object is a true module (needed
1199 # so doctest and other tools work correctly), the Python module
1199 # so doctest and other tools work correctly), the Python module
1200 # teardown mechanism runs over it, and sets to None every variable
1200 # teardown mechanism runs over it, and sets to None every variable
1201 # present in that module. Top-level references to objects from the
1201 # present in that module. Top-level references to objects from the
1202 # script survive, because the user_ns is updated with them. However,
1202 # script survive, because the user_ns is updated with them. However,
1203 # calling functions defined in the script that use other things from
1203 # calling functions defined in the script that use other things from
1204 # the script will fail, because the function's closure had references
1204 # the script will fail, because the function's closure had references
1205 # to the original objects, which are now all None. So we must protect
1205 # to the original objects, which are now all None. So we must protect
1206 # these modules from deletion by keeping a cache.
1206 # these modules from deletion by keeping a cache.
1207 #
1207 #
1208 # To avoid keeping stale modules around (we only need the one from the
1208 # To avoid keeping stale modules around (we only need the one from the
1209 # last run), we use a dict keyed with the full path to the script, so
1209 # last run), we use a dict keyed with the full path to the script, so
1210 # only the last version of the module is held in the cache. Note,
1210 # only the last version of the module is held in the cache. Note,
1211 # however, that we must cache the module *namespace contents* (their
1211 # however, that we must cache the module *namespace contents* (their
1212 # __dict__). Because if we try to cache the actual modules, old ones
1212 # __dict__). Because if we try to cache the actual modules, old ones
1213 # (uncached) could be destroyed while still holding references (such as
1213 # (uncached) could be destroyed while still holding references (such as
1214 # those held by GUI objects that tend to be long-lived)>
1214 # those held by GUI objects that tend to be long-lived)>
1215 #
1215 #
1216 # The %reset command will flush this cache. See the cache_main_mod()
1216 # The %reset command will flush this cache. See the cache_main_mod()
1217 # and clear_main_mod_cache() methods for details on use.
1217 # and clear_main_mod_cache() methods for details on use.
1218
1218
1219 # This is the cache used for 'main' namespaces
1219 # This is the cache used for 'main' namespaces
1220 self._main_mod_cache = {}
1220 self._main_mod_cache = {}
1221
1221
1222 # A table holding all the namespaces IPython deals with, so that
1222 # A table holding all the namespaces IPython deals with, so that
1223 # introspection facilities can search easily.
1223 # introspection facilities can search easily.
1224 self.ns_table = {'user_global':self.user_module.__dict__,
1224 self.ns_table = {'user_global':self.user_module.__dict__,
1225 'user_local':self.user_ns,
1225 'user_local':self.user_ns,
1226 'builtin':builtin_mod.__dict__
1226 'builtin':builtin_mod.__dict__
1227 }
1227 }
1228
1228
1229 @property
1229 @property
1230 def user_global_ns(self):
1230 def user_global_ns(self):
1231 return self.user_module.__dict__
1231 return self.user_module.__dict__
1232
1232
1233 def prepare_user_module(self, user_module=None, user_ns=None):
1233 def prepare_user_module(self, user_module=None, user_ns=None):
1234 """Prepare the module and namespace in which user code will be run.
1234 """Prepare the module and namespace in which user code will be run.
1235
1235
1236 When IPython is started normally, both parameters are None: a new module
1236 When IPython is started normally, both parameters are None: a new module
1237 is created automatically, and its __dict__ used as the namespace.
1237 is created automatically, and its __dict__ used as the namespace.
1238
1238
1239 If only user_module is provided, its __dict__ is used as the namespace.
1239 If only user_module is provided, its __dict__ is used as the namespace.
1240 If only user_ns is provided, a dummy module is created, and user_ns
1240 If only user_ns is provided, a dummy module is created, and user_ns
1241 becomes the global namespace. If both are provided (as they may be
1241 becomes the global namespace. If both are provided (as they may be
1242 when embedding), user_ns is the local namespace, and user_module
1242 when embedding), user_ns is the local namespace, and user_module
1243 provides the global namespace.
1243 provides the global namespace.
1244
1244
1245 Parameters
1245 Parameters
1246 ----------
1246 ----------
1247 user_module : module, optional
1247 user_module : module, optional
1248 The current user module in which IPython is being run. If None,
1248 The current user module in which IPython is being run. If None,
1249 a clean module will be created.
1249 a clean module will be created.
1250 user_ns : dict, optional
1250 user_ns : dict, optional
1251 A namespace in which to run interactive commands.
1251 A namespace in which to run interactive commands.
1252
1252
1253 Returns
1253 Returns
1254 -------
1254 -------
1255 A tuple of user_module and user_ns, each properly initialised.
1255 A tuple of user_module and user_ns, each properly initialised.
1256 """
1256 """
1257 if user_module is None and user_ns is not None:
1257 if user_module is None and user_ns is not None:
1258 user_ns.setdefault("__name__", "__main__")
1258 user_ns.setdefault("__name__", "__main__")
1259 user_module = DummyMod()
1259 user_module = DummyMod()
1260 user_module.__dict__ = user_ns
1260 user_module.__dict__ = user_ns
1261
1261
1262 if user_module is None:
1262 if user_module is None:
1263 user_module = types.ModuleType("__main__",
1263 user_module = types.ModuleType("__main__",
1264 doc="Automatically created module for IPython interactive environment")
1264 doc="Automatically created module for IPython interactive environment")
1265
1265
1266 # We must ensure that __builtin__ (without the final 's') is always
1266 # We must ensure that __builtin__ (without the final 's') is always
1267 # available and pointing to the __builtin__ *module*. For more details:
1267 # available and pointing to the __builtin__ *module*. For more details:
1268 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1268 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1269 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1269 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1270 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1270 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1271
1271
1272 if user_ns is None:
1272 if user_ns is None:
1273 user_ns = user_module.__dict__
1273 user_ns = user_module.__dict__
1274
1274
1275 return user_module, user_ns
1275 return user_module, user_ns
1276
1276
1277 def init_sys_modules(self):
1277 def init_sys_modules(self):
1278 # We need to insert into sys.modules something that looks like a
1278 # We need to insert into sys.modules something that looks like a
1279 # module but which accesses the IPython namespace, for shelve and
1279 # module but which accesses the IPython namespace, for shelve and
1280 # pickle to work interactively. Normally they rely on getting
1280 # pickle to work interactively. Normally they rely on getting
1281 # everything out of __main__, but for embedding purposes each IPython
1281 # everything out of __main__, but for embedding purposes each IPython
1282 # instance has its own private namespace, so we can't go shoving
1282 # instance has its own private namespace, so we can't go shoving
1283 # everything into __main__.
1283 # everything into __main__.
1284
1284
1285 # note, however, that we should only do this for non-embedded
1285 # note, however, that we should only do this for non-embedded
1286 # ipythons, which really mimic the __main__.__dict__ with their own
1286 # ipythons, which really mimic the __main__.__dict__ with their own
1287 # namespace. Embedded instances, on the other hand, should not do
1287 # namespace. Embedded instances, on the other hand, should not do
1288 # this because they need to manage the user local/global namespaces
1288 # this because they need to manage the user local/global namespaces
1289 # only, but they live within a 'normal' __main__ (meaning, they
1289 # only, but they live within a 'normal' __main__ (meaning, they
1290 # shouldn't overtake the execution environment of the script they're
1290 # shouldn't overtake the execution environment of the script they're
1291 # embedded in).
1291 # embedded in).
1292
1292
1293 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1293 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1294 main_name = self.user_module.__name__
1294 main_name = self.user_module.__name__
1295 sys.modules[main_name] = self.user_module
1295 sys.modules[main_name] = self.user_module
1296
1296
1297 def init_user_ns(self):
1297 def init_user_ns(self):
1298 """Initialize all user-visible namespaces to their minimum defaults.
1298 """Initialize all user-visible namespaces to their minimum defaults.
1299
1299
1300 Certain history lists are also initialized here, as they effectively
1300 Certain history lists are also initialized here, as they effectively
1301 act as user namespaces.
1301 act as user namespaces.
1302
1302
1303 Notes
1303 Notes
1304 -----
1304 -----
1305 All data structures here are only filled in, they are NOT reset by this
1305 All data structures here are only filled in, they are NOT reset by this
1306 method. If they were not empty before, data will simply be added to
1306 method. If they were not empty before, data will simply be added to
1307 them.
1307 them.
1308 """
1308 """
1309 # This function works in two parts: first we put a few things in
1309 # This function works in two parts: first we put a few things in
1310 # user_ns, and we sync that contents into user_ns_hidden so that these
1310 # user_ns, and we sync that contents into user_ns_hidden so that these
1311 # initial variables aren't shown by %who. After the sync, we add the
1311 # initial variables aren't shown by %who. After the sync, we add the
1312 # rest of what we *do* want the user to see with %who even on a new
1312 # rest of what we *do* want the user to see with %who even on a new
1313 # session (probably nothing, so they really only see their own stuff)
1313 # session (probably nothing, so they really only see their own stuff)
1314
1314
1315 # The user dict must *always* have a __builtin__ reference to the
1315 # The user dict must *always* have a __builtin__ reference to the
1316 # Python standard __builtin__ namespace, which must be imported.
1316 # Python standard __builtin__ namespace, which must be imported.
1317 # This is so that certain operations in prompt evaluation can be
1317 # This is so that certain operations in prompt evaluation can be
1318 # reliably executed with builtins. Note that we can NOT use
1318 # reliably executed with builtins. Note that we can NOT use
1319 # __builtins__ (note the 's'), because that can either be a dict or a
1319 # __builtins__ (note the 's'), because that can either be a dict or a
1320 # module, and can even mutate at runtime, depending on the context
1320 # module, and can even mutate at runtime, depending on the context
1321 # (Python makes no guarantees on it). In contrast, __builtin__ is
1321 # (Python makes no guarantees on it). In contrast, __builtin__ is
1322 # always a module object, though it must be explicitly imported.
1322 # always a module object, though it must be explicitly imported.
1323
1323
1324 # For more details:
1324 # For more details:
1325 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1325 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1326 ns = {}
1326 ns = {}
1327
1327
1328 # make global variables for user access to the histories
1328 # make global variables for user access to the histories
1329 ns['_ih'] = self.history_manager.input_hist_parsed
1329 ns['_ih'] = self.history_manager.input_hist_parsed
1330 ns['_oh'] = self.history_manager.output_hist
1330 ns['_oh'] = self.history_manager.output_hist
1331 ns['_dh'] = self.history_manager.dir_hist
1331 ns['_dh'] = self.history_manager.dir_hist
1332
1332
1333 # user aliases to input and output histories. These shouldn't show up
1333 # user aliases to input and output histories. These shouldn't show up
1334 # in %who, as they can have very large reprs.
1334 # in %who, as they can have very large reprs.
1335 ns['In'] = self.history_manager.input_hist_parsed
1335 ns['In'] = self.history_manager.input_hist_parsed
1336 ns['Out'] = self.history_manager.output_hist
1336 ns['Out'] = self.history_manager.output_hist
1337
1337
1338 # Store myself as the public api!!!
1338 # Store myself as the public api!!!
1339 ns['get_ipython'] = self.get_ipython
1339 ns['get_ipython'] = self.get_ipython
1340
1340
1341 ns['exit'] = self.exiter
1341 ns['exit'] = self.exiter
1342 ns['quit'] = self.exiter
1342 ns['quit'] = self.exiter
1343 ns["open"] = _modified_open
1343 ns["open"] = _modified_open
1344
1344
1345 # Sync what we've added so far to user_ns_hidden so these aren't seen
1345 # Sync what we've added so far to user_ns_hidden so these aren't seen
1346 # by %who
1346 # by %who
1347 self.user_ns_hidden.update(ns)
1347 self.user_ns_hidden.update(ns)
1348
1348
1349 # Anything put into ns now would show up in %who. Think twice before
1349 # Anything put into ns now would show up in %who. Think twice before
1350 # putting anything here, as we really want %who to show the user their
1350 # putting anything here, as we really want %who to show the user their
1351 # stuff, not our variables.
1351 # stuff, not our variables.
1352
1352
1353 # Finally, update the real user's namespace
1353 # Finally, update the real user's namespace
1354 self.user_ns.update(ns)
1354 self.user_ns.update(ns)
1355
1355
1356 @property
1356 @property
1357 def all_ns_refs(self):
1357 def all_ns_refs(self):
1358 """Get a list of references to all the namespace dictionaries in which
1358 """Get a list of references to all the namespace dictionaries in which
1359 IPython might store a user-created object.
1359 IPython might store a user-created object.
1360
1360
1361 Note that this does not include the displayhook, which also caches
1361 Note that this does not include the displayhook, which also caches
1362 objects from the output."""
1362 objects from the output."""
1363 return [self.user_ns, self.user_global_ns, self.user_ns_hidden] + \
1363 return [self.user_ns, self.user_global_ns, self.user_ns_hidden] + \
1364 [m.__dict__ for m in self._main_mod_cache.values()]
1364 [m.__dict__ for m in self._main_mod_cache.values()]
1365
1365
1366 def reset(self, new_session=True, aggressive=False):
1366 def reset(self, new_session=True, aggressive=False):
1367 """Clear all internal namespaces, and attempt to release references to
1367 """Clear all internal namespaces, and attempt to release references to
1368 user objects.
1368 user objects.
1369
1369
1370 If new_session is True, a new history session will be opened.
1370 If new_session is True, a new history session will be opened.
1371 """
1371 """
1372 # Clear histories
1372 # Clear histories
1373 self.history_manager.reset(new_session)
1373 self.history_manager.reset(new_session)
1374 # Reset counter used to index all histories
1374 # Reset counter used to index all histories
1375 if new_session:
1375 if new_session:
1376 self.execution_count = 1
1376 self.execution_count = 1
1377
1377
1378 # Reset last execution result
1378 # Reset last execution result
1379 self.last_execution_succeeded = True
1379 self.last_execution_succeeded = True
1380 self.last_execution_result = None
1380 self.last_execution_result = None
1381
1381
1382 # Flush cached output items
1382 # Flush cached output items
1383 if self.displayhook.do_full_cache:
1383 if self.displayhook.do_full_cache:
1384 self.displayhook.flush()
1384 self.displayhook.flush()
1385
1385
1386 # The main execution namespaces must be cleared very carefully,
1386 # The main execution namespaces must be cleared very carefully,
1387 # skipping the deletion of the builtin-related keys, because doing so
1387 # skipping the deletion of the builtin-related keys, because doing so
1388 # would cause errors in many object's __del__ methods.
1388 # would cause errors in many object's __del__ methods.
1389 if self.user_ns is not self.user_global_ns:
1389 if self.user_ns is not self.user_global_ns:
1390 self.user_ns.clear()
1390 self.user_ns.clear()
1391 ns = self.user_global_ns
1391 ns = self.user_global_ns
1392 drop_keys = set(ns.keys())
1392 drop_keys = set(ns.keys())
1393 drop_keys.discard('__builtin__')
1393 drop_keys.discard('__builtin__')
1394 drop_keys.discard('__builtins__')
1394 drop_keys.discard('__builtins__')
1395 drop_keys.discard('__name__')
1395 drop_keys.discard('__name__')
1396 for k in drop_keys:
1396 for k in drop_keys:
1397 del ns[k]
1397 del ns[k]
1398
1398
1399 self.user_ns_hidden.clear()
1399 self.user_ns_hidden.clear()
1400
1400
1401 # Restore the user namespaces to minimal usability
1401 # Restore the user namespaces to minimal usability
1402 self.init_user_ns()
1402 self.init_user_ns()
1403 if aggressive and not hasattr(self, "_sys_modules_keys"):
1403 if aggressive and not hasattr(self, "_sys_modules_keys"):
1404 print("Cannot restore sys.module, no snapshot")
1404 print("Cannot restore sys.module, no snapshot")
1405 elif aggressive:
1405 elif aggressive:
1406 print("culling sys module...")
1406 print("culling sys module...")
1407 current_keys = set(sys.modules.keys())
1407 current_keys = set(sys.modules.keys())
1408 for k in current_keys - self._sys_modules_keys:
1408 for k in current_keys - self._sys_modules_keys:
1409 if k.startswith("multiprocessing"):
1409 if k.startswith("multiprocessing"):
1410 continue
1410 continue
1411 del sys.modules[k]
1411 del sys.modules[k]
1412
1412
1413 # Restore the default and user aliases
1413 # Restore the default and user aliases
1414 self.alias_manager.clear_aliases()
1414 self.alias_manager.clear_aliases()
1415 self.alias_manager.init_aliases()
1415 self.alias_manager.init_aliases()
1416
1416
1417 # Now define aliases that only make sense on the terminal, because they
1417 # Now define aliases that only make sense on the terminal, because they
1418 # need direct access to the console in a way that we can't emulate in
1418 # need direct access to the console in a way that we can't emulate in
1419 # GUI or web frontend
1419 # GUI or web frontend
1420 if os.name == 'posix':
1420 if os.name == 'posix':
1421 for cmd in ('clear', 'more', 'less', 'man'):
1421 for cmd in ('clear', 'more', 'less', 'man'):
1422 if cmd not in self.magics_manager.magics['line']:
1422 if cmd not in self.magics_manager.magics['line']:
1423 self.alias_manager.soft_define_alias(cmd, cmd)
1423 self.alias_manager.soft_define_alias(cmd, cmd)
1424
1424
1425 # Flush the private list of module references kept for script
1425 # Flush the private list of module references kept for script
1426 # execution protection
1426 # execution protection
1427 self.clear_main_mod_cache()
1427 self.clear_main_mod_cache()
1428
1428
1429 def del_var(self, varname, by_name=False):
1429 def del_var(self, varname, by_name=False):
1430 """Delete a variable from the various namespaces, so that, as
1430 """Delete a variable from the various namespaces, so that, as
1431 far as possible, we're not keeping any hidden references to it.
1431 far as possible, we're not keeping any hidden references to it.
1432
1432
1433 Parameters
1433 Parameters
1434 ----------
1434 ----------
1435 varname : str
1435 varname : str
1436 The name of the variable to delete.
1436 The name of the variable to delete.
1437 by_name : bool
1437 by_name : bool
1438 If True, delete variables with the given name in each
1438 If True, delete variables with the given name in each
1439 namespace. If False (default), find the variable in the user
1439 namespace. If False (default), find the variable in the user
1440 namespace, and delete references to it.
1440 namespace, and delete references to it.
1441 """
1441 """
1442 if varname in ('__builtin__', '__builtins__'):
1442 if varname in ('__builtin__', '__builtins__'):
1443 raise ValueError("Refusing to delete %s" % varname)
1443 raise ValueError("Refusing to delete %s" % varname)
1444
1444
1445 ns_refs = self.all_ns_refs
1445 ns_refs = self.all_ns_refs
1446
1446
1447 if by_name: # Delete by name
1447 if by_name: # Delete by name
1448 for ns in ns_refs:
1448 for ns in ns_refs:
1449 try:
1449 try:
1450 del ns[varname]
1450 del ns[varname]
1451 except KeyError:
1451 except KeyError:
1452 pass
1452 pass
1453 else: # Delete by object
1453 else: # Delete by object
1454 try:
1454 try:
1455 obj = self.user_ns[varname]
1455 obj = self.user_ns[varname]
1456 except KeyError as e:
1456 except KeyError as e:
1457 raise NameError("name '%s' is not defined" % varname) from e
1457 raise NameError("name '%s' is not defined" % varname) from e
1458 # Also check in output history
1458 # Also check in output history
1459 ns_refs.append(self.history_manager.output_hist)
1459 ns_refs.append(self.history_manager.output_hist)
1460 for ns in ns_refs:
1460 for ns in ns_refs:
1461 to_delete = [n for n, o in ns.items() if o is obj]
1461 to_delete = [n for n, o in ns.items() if o is obj]
1462 for name in to_delete:
1462 for name in to_delete:
1463 del ns[name]
1463 del ns[name]
1464
1464
1465 # Ensure it is removed from the last execution result
1465 # Ensure it is removed from the last execution result
1466 if self.last_execution_result.result is obj:
1466 if self.last_execution_result.result is obj:
1467 self.last_execution_result = None
1467 self.last_execution_result = None
1468
1468
1469 # displayhook keeps extra references, but not in a dictionary
1469 # displayhook keeps extra references, but not in a dictionary
1470 for name in ('_', '__', '___'):
1470 for name in ('_', '__', '___'):
1471 if getattr(self.displayhook, name) is obj:
1471 if getattr(self.displayhook, name) is obj:
1472 setattr(self.displayhook, name, None)
1472 setattr(self.displayhook, name, None)
1473
1473
1474 def reset_selective(self, regex=None):
1474 def reset_selective(self, regex=None):
1475 """Clear selective variables from internal namespaces based on a
1475 """Clear selective variables from internal namespaces based on a
1476 specified regular expression.
1476 specified regular expression.
1477
1477
1478 Parameters
1478 Parameters
1479 ----------
1479 ----------
1480 regex : string or compiled pattern, optional
1480 regex : string or compiled pattern, optional
1481 A regular expression pattern that will be used in searching
1481 A regular expression pattern that will be used in searching
1482 variable names in the users namespaces.
1482 variable names in the users namespaces.
1483 """
1483 """
1484 if regex is not None:
1484 if regex is not None:
1485 try:
1485 try:
1486 m = re.compile(regex)
1486 m = re.compile(regex)
1487 except TypeError as e:
1487 except TypeError as e:
1488 raise TypeError('regex must be a string or compiled pattern') from e
1488 raise TypeError('regex must be a string or compiled pattern') from e
1489 # Search for keys in each namespace that match the given regex
1489 # Search for keys in each namespace that match the given regex
1490 # If a match is found, delete the key/value pair.
1490 # If a match is found, delete the key/value pair.
1491 for ns in self.all_ns_refs:
1491 for ns in self.all_ns_refs:
1492 for var in ns:
1492 for var in ns:
1493 if m.search(var):
1493 if m.search(var):
1494 del ns[var]
1494 del ns[var]
1495
1495
1496 def push(self, variables, interactive=True):
1496 def push(self, variables, interactive=True):
1497 """Inject a group of variables into the IPython user namespace.
1497 """Inject a group of variables into the IPython user namespace.
1498
1498
1499 Parameters
1499 Parameters
1500 ----------
1500 ----------
1501 variables : dict, str or list/tuple of str
1501 variables : dict, str or list/tuple of str
1502 The variables to inject into the user's namespace. If a dict, a
1502 The variables to inject into the user's namespace. If a dict, a
1503 simple update is done. If a str, the string is assumed to have
1503 simple update is done. If a str, the string is assumed to have
1504 variable names separated by spaces. A list/tuple of str can also
1504 variable names separated by spaces. A list/tuple of str can also
1505 be used to give the variable names. If just the variable names are
1505 be used to give the variable names. If just the variable names are
1506 give (list/tuple/str) then the variable values looked up in the
1506 give (list/tuple/str) then the variable values looked up in the
1507 callers frame.
1507 callers frame.
1508 interactive : bool
1508 interactive : bool
1509 If True (default), the variables will be listed with the ``who``
1509 If True (default), the variables will be listed with the ``who``
1510 magic.
1510 magic.
1511 """
1511 """
1512 vdict = None
1512 vdict = None
1513
1513
1514 # We need a dict of name/value pairs to do namespace updates.
1514 # We need a dict of name/value pairs to do namespace updates.
1515 if isinstance(variables, dict):
1515 if isinstance(variables, dict):
1516 vdict = variables
1516 vdict = variables
1517 elif isinstance(variables, (str, list, tuple)):
1517 elif isinstance(variables, (str, list, tuple)):
1518 if isinstance(variables, str):
1518 if isinstance(variables, str):
1519 vlist = variables.split()
1519 vlist = variables.split()
1520 else:
1520 else:
1521 vlist = variables
1521 vlist = variables
1522 vdict = {}
1522 vdict = {}
1523 cf = sys._getframe(1)
1523 cf = sys._getframe(1)
1524 for name in vlist:
1524 for name in vlist:
1525 try:
1525 try:
1526 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1526 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1527 except:
1527 except:
1528 print('Could not get variable %s from %s' %
1528 print('Could not get variable %s from %s' %
1529 (name,cf.f_code.co_name))
1529 (name,cf.f_code.co_name))
1530 else:
1530 else:
1531 raise ValueError('variables must be a dict/str/list/tuple')
1531 raise ValueError('variables must be a dict/str/list/tuple')
1532
1532
1533 # Propagate variables to user namespace
1533 # Propagate variables to user namespace
1534 self.user_ns.update(vdict)
1534 self.user_ns.update(vdict)
1535
1535
1536 # And configure interactive visibility
1536 # And configure interactive visibility
1537 user_ns_hidden = self.user_ns_hidden
1537 user_ns_hidden = self.user_ns_hidden
1538 if interactive:
1538 if interactive:
1539 for name in vdict:
1539 for name in vdict:
1540 user_ns_hidden.pop(name, None)
1540 user_ns_hidden.pop(name, None)
1541 else:
1541 else:
1542 user_ns_hidden.update(vdict)
1542 user_ns_hidden.update(vdict)
1543
1543
1544 def drop_by_id(self, variables):
1544 def drop_by_id(self, variables):
1545 """Remove a dict of variables from the user namespace, if they are the
1545 """Remove a dict of variables from the user namespace, if they are the
1546 same as the values in the dictionary.
1546 same as the values in the dictionary.
1547
1547
1548 This is intended for use by extensions: variables that they've added can
1548 This is intended for use by extensions: variables that they've added can
1549 be taken back out if they are unloaded, without removing any that the
1549 be taken back out if they are unloaded, without removing any that the
1550 user has overwritten.
1550 user has overwritten.
1551
1551
1552 Parameters
1552 Parameters
1553 ----------
1553 ----------
1554 variables : dict
1554 variables : dict
1555 A dictionary mapping object names (as strings) to the objects.
1555 A dictionary mapping object names (as strings) to the objects.
1556 """
1556 """
1557 for name, obj in variables.items():
1557 for name, obj in variables.items():
1558 if name in self.user_ns and self.user_ns[name] is obj:
1558 if name in self.user_ns and self.user_ns[name] is obj:
1559 del self.user_ns[name]
1559 del self.user_ns[name]
1560 self.user_ns_hidden.pop(name, None)
1560 self.user_ns_hidden.pop(name, None)
1561
1561
1562 #-------------------------------------------------------------------------
1562 #-------------------------------------------------------------------------
1563 # Things related to object introspection
1563 # Things related to object introspection
1564 #-------------------------------------------------------------------------
1564 #-------------------------------------------------------------------------
1565 @staticmethod
1565 @staticmethod
1566 def _find_parts(oname: str) -> Tuple[bool, ListType[str]]:
1566 def _find_parts(oname: str) -> Tuple[bool, ListType[str]]:
1567 """
1567 """
1568 Given an object name, return a list of parts of this object name.
1568 Given an object name, return a list of parts of this object name.
1569
1569
1570 Basically split on docs when using attribute access,
1570 Basically split on docs when using attribute access,
1571 and extract the value when using square bracket.
1571 and extract the value when using square bracket.
1572
1572
1573
1573
1574 For example foo.bar[3].baz[x] -> foo, bar, 3, baz, x
1574 For example foo.bar[3].baz[x] -> foo, bar, 3, baz, x
1575
1575
1576
1576
1577 Returns
1577 Returns
1578 -------
1578 -------
1579 parts_ok: bool
1579 parts_ok: bool
1580 wether we were properly able to parse parts.
1580 wether we were properly able to parse parts.
1581 parts: list of str
1581 parts: list of str
1582 extracted parts
1582 extracted parts
1583
1583
1584
1584
1585
1585
1586 """
1586 """
1587 raw_parts = oname.split(".")
1587 raw_parts = oname.split(".")
1588 parts = []
1588 parts = []
1589 parts_ok = True
1589 parts_ok = True
1590 for p in raw_parts:
1590 for p in raw_parts:
1591 if p.endswith("]"):
1591 if p.endswith("]"):
1592 var, *indices = p.split("[")
1592 var, *indices = p.split("[")
1593 if not var.isidentifier():
1593 if not var.isidentifier():
1594 parts_ok = False
1594 parts_ok = False
1595 break
1595 break
1596 parts.append(var)
1596 parts.append(var)
1597 for ind in indices:
1597 for ind in indices:
1598 if ind[-1] != "]" and not is_integer_string(ind[:-1]):
1598 if ind[-1] != "]" and not is_integer_string(ind[:-1]):
1599 parts_ok = False
1599 parts_ok = False
1600 break
1600 break
1601 parts.append(ind[:-1])
1601 parts.append(ind[:-1])
1602 continue
1602 continue
1603
1603
1604 if not p.isidentifier():
1604 if not p.isidentifier():
1605 parts_ok = False
1605 parts_ok = False
1606 parts.append(p)
1606 parts.append(p)
1607
1607
1608 return parts_ok, parts
1608 return parts_ok, parts
1609
1609
1610 def _ofind(
1610 def _ofind(
1611 self, oname: str, namespaces: Optional[Sequence[Tuple[str, AnyType]]] = None
1611 self, oname: str, namespaces: Optional[Sequence[Tuple[str, AnyType]]] = None
1612 ) -> OInfo:
1612 ) -> OInfo:
1613 """Find an object in the available namespaces.
1613 """Find an object in the available namespaces.
1614
1614
1615
1615
1616 Returns
1616 Returns
1617 -------
1617 -------
1618 OInfo with fields:
1618 OInfo with fields:
1619 - ismagic
1619 - ismagic
1620 - isalias
1620 - isalias
1621 - found
1621 - found
1622 - obj
1622 - obj
1623 - namespac
1623 - namespac
1624 - parent
1624 - parent
1625
1625
1626 Has special code to detect magic functions.
1626 Has special code to detect magic functions.
1627 """
1627 """
1628 oname = oname.strip()
1628 oname = oname.strip()
1629 parts_ok, parts = self._find_parts(oname)
1629 parts_ok, parts = self._find_parts(oname)
1630
1630
1631 if (
1631 if (
1632 not oname.startswith(ESC_MAGIC)
1632 not oname.startswith(ESC_MAGIC)
1633 and not oname.startswith(ESC_MAGIC2)
1633 and not oname.startswith(ESC_MAGIC2)
1634 and not parts_ok
1634 and not parts_ok
1635 ):
1635 ):
1636 return OInfo(
1636 return OInfo(
1637 ismagic=False,
1637 ismagic=False,
1638 isalias=False,
1638 isalias=False,
1639 found=False,
1639 found=False,
1640 obj=None,
1640 obj=None,
1641 namespace=None,
1641 namespace=None,
1642 parent=None,
1642 parent=None,
1643 )
1643 )
1644
1644
1645 if namespaces is None:
1645 if namespaces is None:
1646 # Namespaces to search in:
1646 # Namespaces to search in:
1647 # Put them in a list. The order is important so that we
1647 # Put them in a list. The order is important so that we
1648 # find things in the same order that Python finds them.
1648 # find things in the same order that Python finds them.
1649 namespaces = [ ('Interactive', self.user_ns),
1649 namespaces = [ ('Interactive', self.user_ns),
1650 ('Interactive (global)', self.user_global_ns),
1650 ('Interactive (global)', self.user_global_ns),
1651 ('Python builtin', builtin_mod.__dict__),
1651 ('Python builtin', builtin_mod.__dict__),
1652 ]
1652 ]
1653
1653
1654 ismagic = False
1654 ismagic = False
1655 isalias = False
1655 isalias = False
1656 found = False
1656 found = False
1657 ospace = None
1657 ospace = None
1658 parent = None
1658 parent = None
1659 obj = None
1659 obj = None
1660
1660
1661
1661
1662 # Look for the given name by splitting it in parts. If the head is
1662 # Look for the given name by splitting it in parts. If the head is
1663 # found, then we look for all the remaining parts as members, and only
1663 # found, then we look for all the remaining parts as members, and only
1664 # declare success if we can find them all.
1664 # declare success if we can find them all.
1665 oname_parts = parts
1665 oname_parts = parts
1666 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1666 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1667 for nsname,ns in namespaces:
1667 for nsname,ns in namespaces:
1668 try:
1668 try:
1669 obj = ns[oname_head]
1669 obj = ns[oname_head]
1670 except KeyError:
1670 except KeyError:
1671 continue
1671 continue
1672 else:
1672 else:
1673 for idx, part in enumerate(oname_rest):
1673 for idx, part in enumerate(oname_rest):
1674 try:
1674 try:
1675 parent = obj
1675 parent = obj
1676 # The last part is looked up in a special way to avoid
1676 # The last part is looked up in a special way to avoid
1677 # descriptor invocation as it may raise or have side
1677 # descriptor invocation as it may raise or have side
1678 # effects.
1678 # effects.
1679 if idx == len(oname_rest) - 1:
1679 if idx == len(oname_rest) - 1:
1680 obj = self._getattr_property(obj, part)
1680 obj = self._getattr_property(obj, part)
1681 else:
1681 else:
1682 if is_integer_string(part):
1682 if is_integer_string(part):
1683 obj = obj[int(part)]
1683 obj = obj[int(part)]
1684 else:
1684 else:
1685 obj = getattr(obj, part)
1685 obj = getattr(obj, part)
1686 except:
1686 except:
1687 # Blanket except b/c some badly implemented objects
1687 # Blanket except b/c some badly implemented objects
1688 # allow __getattr__ to raise exceptions other than
1688 # allow __getattr__ to raise exceptions other than
1689 # AttributeError, which then crashes IPython.
1689 # AttributeError, which then crashes IPython.
1690 break
1690 break
1691 else:
1691 else:
1692 # If we finish the for loop (no break), we got all members
1692 # If we finish the for loop (no break), we got all members
1693 found = True
1693 found = True
1694 ospace = nsname
1694 ospace = nsname
1695 break # namespace loop
1695 break # namespace loop
1696
1696
1697 # Try to see if it's magic
1697 # Try to see if it's magic
1698 if not found:
1698 if not found:
1699 obj = None
1699 obj = None
1700 if oname.startswith(ESC_MAGIC2):
1700 if oname.startswith(ESC_MAGIC2):
1701 oname = oname.lstrip(ESC_MAGIC2)
1701 oname = oname.lstrip(ESC_MAGIC2)
1702 obj = self.find_cell_magic(oname)
1702 obj = self.find_cell_magic(oname)
1703 elif oname.startswith(ESC_MAGIC):
1703 elif oname.startswith(ESC_MAGIC):
1704 oname = oname.lstrip(ESC_MAGIC)
1704 oname = oname.lstrip(ESC_MAGIC)
1705 obj = self.find_line_magic(oname)
1705 obj = self.find_line_magic(oname)
1706 else:
1706 else:
1707 # search without prefix, so run? will find %run?
1707 # search without prefix, so run? will find %run?
1708 obj = self.find_line_magic(oname)
1708 obj = self.find_line_magic(oname)
1709 if obj is None:
1709 if obj is None:
1710 obj = self.find_cell_magic(oname)
1710 obj = self.find_cell_magic(oname)
1711 if obj is not None:
1711 if obj is not None:
1712 found = True
1712 found = True
1713 ospace = 'IPython internal'
1713 ospace = 'IPython internal'
1714 ismagic = True
1714 ismagic = True
1715 isalias = isinstance(obj, Alias)
1715 isalias = isinstance(obj, Alias)
1716
1716
1717 # Last try: special-case some literals like '', [], {}, etc:
1717 # Last try: special-case some literals like '', [], {}, etc:
1718 if not found and oname_head in ["''",'""','[]','{}','()']:
1718 if not found and oname_head in ["''",'""','[]','{}','()']:
1719 obj = eval(oname_head)
1719 obj = eval(oname_head)
1720 found = True
1720 found = True
1721 ospace = 'Interactive'
1721 ospace = 'Interactive'
1722
1722
1723 return OInfo(
1723 return OInfo(
1724 obj=obj,
1724 obj=obj,
1725 found=found,
1725 found=found,
1726 parent=parent,
1726 parent=parent,
1727 ismagic=ismagic,
1727 ismagic=ismagic,
1728 isalias=isalias,
1728 isalias=isalias,
1729 namespace=ospace,
1729 namespace=ospace,
1730 )
1730 )
1731
1731
1732 @staticmethod
1732 @staticmethod
1733 def _getattr_property(obj, attrname):
1733 def _getattr_property(obj, attrname):
1734 """Property-aware getattr to use in object finding.
1734 """Property-aware getattr to use in object finding.
1735
1735
1736 If attrname represents a property, return it unevaluated (in case it has
1736 If attrname represents a property, return it unevaluated (in case it has
1737 side effects or raises an error.
1737 side effects or raises an error.
1738
1738
1739 """
1739 """
1740 if not isinstance(obj, type):
1740 if not isinstance(obj, type):
1741 try:
1741 try:
1742 # `getattr(type(obj), attrname)` is not guaranteed to return
1742 # `getattr(type(obj), attrname)` is not guaranteed to return
1743 # `obj`, but does so for property:
1743 # `obj`, but does so for property:
1744 #
1744 #
1745 # property.__get__(self, None, cls) -> self
1745 # property.__get__(self, None, cls) -> self
1746 #
1746 #
1747 # The universal alternative is to traverse the mro manually
1747 # The universal alternative is to traverse the mro manually
1748 # searching for attrname in class dicts.
1748 # searching for attrname in class dicts.
1749 if is_integer_string(attrname):
1749 if is_integer_string(attrname):
1750 return obj[int(attrname)]
1750 return obj[int(attrname)]
1751 else:
1751 else:
1752 attr = getattr(type(obj), attrname)
1752 attr = getattr(type(obj), attrname)
1753 except AttributeError:
1753 except AttributeError:
1754 pass
1754 pass
1755 else:
1755 else:
1756 # This relies on the fact that data descriptors (with both
1756 # This relies on the fact that data descriptors (with both
1757 # __get__ & __set__ magic methods) take precedence over
1757 # __get__ & __set__ magic methods) take precedence over
1758 # instance-level attributes:
1758 # instance-level attributes:
1759 #
1759 #
1760 # class A(object):
1760 # class A(object):
1761 # @property
1761 # @property
1762 # def foobar(self): return 123
1762 # def foobar(self): return 123
1763 # a = A()
1763 # a = A()
1764 # a.__dict__['foobar'] = 345
1764 # a.__dict__['foobar'] = 345
1765 # a.foobar # == 123
1765 # a.foobar # == 123
1766 #
1766 #
1767 # So, a property may be returned right away.
1767 # So, a property may be returned right away.
1768 if isinstance(attr, property):
1768 if isinstance(attr, property):
1769 return attr
1769 return attr
1770
1770
1771 # Nothing helped, fall back.
1771 # Nothing helped, fall back.
1772 return getattr(obj, attrname)
1772 return getattr(obj, attrname)
1773
1773
1774 def _object_find(self, oname, namespaces=None) -> OInfo:
1774 def _object_find(self, oname, namespaces=None) -> OInfo:
1775 """Find an object and return a struct with info about it."""
1775 """Find an object and return a struct with info about it."""
1776 return self._ofind(oname, namespaces)
1776 return self._ofind(oname, namespaces)
1777
1777
1778 def _inspect(self, meth, oname, namespaces=None, **kw):
1778 def _inspect(self, meth, oname, namespaces=None, **kw):
1779 """Generic interface to the inspector system.
1779 """Generic interface to the inspector system.
1780
1780
1781 This function is meant to be called by pdef, pdoc & friends.
1781 This function is meant to be called by pdef, pdoc & friends.
1782 """
1782 """
1783 info: OInfo = self._object_find(oname, namespaces)
1783 info: OInfo = self._object_find(oname, namespaces)
1784 if self.sphinxify_docstring:
1784 if self.sphinxify_docstring:
1785 if sphinxify is None:
1785 if sphinxify is None:
1786 raise ImportError("Module ``docrepr`` required but missing")
1786 raise ImportError("Module ``docrepr`` required but missing")
1787 docformat = sphinxify(self.object_inspect(oname))
1787 docformat = sphinxify(self.object_inspect(oname))
1788 else:
1788 else:
1789 docformat = None
1789 docformat = None
1790 if info.found or hasattr(info.parent, oinspect.HOOK_NAME):
1790 if info.found or hasattr(info.parent, oinspect.HOOK_NAME):
1791 pmethod = getattr(self.inspector, meth)
1791 pmethod = getattr(self.inspector, meth)
1792 # TODO: only apply format_screen to the plain/text repr of the mime
1792 # TODO: only apply format_screen to the plain/text repr of the mime
1793 # bundle.
1793 # bundle.
1794 formatter = format_screen if info.ismagic else docformat
1794 formatter = format_screen if info.ismagic else docformat
1795 if meth == 'pdoc':
1795 if meth == 'pdoc':
1796 pmethod(info.obj, oname, formatter)
1796 pmethod(info.obj, oname, formatter)
1797 elif meth == 'pinfo':
1797 elif meth == 'pinfo':
1798 pmethod(
1798 pmethod(
1799 info.obj,
1799 info.obj,
1800 oname,
1800 oname,
1801 formatter,
1801 formatter,
1802 info,
1802 info,
1803 enable_html_pager=self.enable_html_pager,
1803 enable_html_pager=self.enable_html_pager,
1804 **kw,
1804 **kw,
1805 )
1805 )
1806 else:
1806 else:
1807 pmethod(info.obj, oname)
1807 pmethod(info.obj, oname)
1808 else:
1808 else:
1809 print('Object `%s` not found.' % oname)
1809 print('Object `%s` not found.' % oname)
1810 return 'not found' # so callers can take other action
1810 return 'not found' # so callers can take other action
1811
1811
1812 def object_inspect(self, oname, detail_level=0):
1812 def object_inspect(self, oname, detail_level=0):
1813 """Get object info about oname"""
1813 """Get object info about oname"""
1814 with self.builtin_trap:
1814 with self.builtin_trap:
1815 info = self._object_find(oname)
1815 info = self._object_find(oname)
1816 if info.found:
1816 if info.found:
1817 return self.inspector.info(info.obj, oname, info=info,
1817 return self.inspector.info(info.obj, oname, info=info,
1818 detail_level=detail_level
1818 detail_level=detail_level
1819 )
1819 )
1820 else:
1820 else:
1821 return oinspect.object_info(name=oname, found=False)
1821 return oinspect.object_info(name=oname, found=False)
1822
1822
1823 def object_inspect_text(self, oname, detail_level=0):
1823 def object_inspect_text(self, oname, detail_level=0):
1824 """Get object info as formatted text"""
1824 """Get object info as formatted text"""
1825 return self.object_inspect_mime(oname, detail_level)['text/plain']
1825 return self.object_inspect_mime(oname, detail_level)['text/plain']
1826
1826
1827 def object_inspect_mime(self, oname, detail_level=0, omit_sections=()):
1827 def object_inspect_mime(self, oname, detail_level=0, omit_sections=()):
1828 """Get object info as a mimebundle of formatted representations.
1828 """Get object info as a mimebundle of formatted representations.
1829
1829
1830 A mimebundle is a dictionary, keyed by mime-type.
1830 A mimebundle is a dictionary, keyed by mime-type.
1831 It must always have the key `'text/plain'`.
1831 It must always have the key `'text/plain'`.
1832 """
1832 """
1833 with self.builtin_trap:
1833 with self.builtin_trap:
1834 info = self._object_find(oname)
1834 info = self._object_find(oname)
1835 if info.found:
1835 if info.found:
1836 docformat = (
1836 docformat = (
1837 sphinxify(self.object_inspect(oname))
1837 sphinxify(self.object_inspect(oname))
1838 if self.sphinxify_docstring
1838 if self.sphinxify_docstring
1839 else None
1839 else None
1840 )
1840 )
1841 return self.inspector._get_info(
1841 return self.inspector._get_info(
1842 info.obj,
1842 info.obj,
1843 oname,
1843 oname,
1844 info=info,
1844 info=info,
1845 detail_level=detail_level,
1845 detail_level=detail_level,
1846 formatter=docformat,
1846 formatter=docformat,
1847 omit_sections=omit_sections,
1847 omit_sections=omit_sections,
1848 )
1848 )
1849 else:
1849 else:
1850 raise KeyError(oname)
1850 raise KeyError(oname)
1851
1851
1852 #-------------------------------------------------------------------------
1852 #-------------------------------------------------------------------------
1853 # Things related to history management
1853 # Things related to history management
1854 #-------------------------------------------------------------------------
1854 #-------------------------------------------------------------------------
1855
1855
1856 def init_history(self):
1856 def init_history(self):
1857 """Sets up the command history, and starts regular autosaves."""
1857 """Sets up the command history, and starts regular autosaves."""
1858 self.history_manager = HistoryManager(shell=self, parent=self)
1858 self.history_manager = HistoryManager(shell=self, parent=self)
1859 self.configurables.append(self.history_manager)
1859 self.configurables.append(self.history_manager)
1860
1860
1861 #-------------------------------------------------------------------------
1861 #-------------------------------------------------------------------------
1862 # Things related to exception handling and tracebacks (not debugging)
1862 # Things related to exception handling and tracebacks (not debugging)
1863 #-------------------------------------------------------------------------
1863 #-------------------------------------------------------------------------
1864
1864
1865 debugger_cls = InterruptiblePdb
1865 debugger_cls = InterruptiblePdb
1866
1866
1867 def init_traceback_handlers(self, custom_exceptions):
1867 def init_traceback_handlers(self, custom_exceptions):
1868 # Syntax error handler.
1868 # Syntax error handler.
1869 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor', parent=self)
1869 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor', parent=self)
1870
1870
1871 # The interactive one is initialized with an offset, meaning we always
1871 # The interactive one is initialized with an offset, meaning we always
1872 # want to remove the topmost item in the traceback, which is our own
1872 # want to remove the topmost item in the traceback, which is our own
1873 # internal code. Valid modes: ['Plain','Context','Verbose','Minimal']
1873 # internal code. Valid modes: ['Plain','Context','Verbose','Minimal']
1874 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1874 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1875 color_scheme='NoColor',
1875 color_scheme='NoColor',
1876 tb_offset = 1,
1876 tb_offset = 1,
1877 debugger_cls=self.debugger_cls, parent=self)
1877 debugger_cls=self.debugger_cls, parent=self)
1878
1878
1879 # The instance will store a pointer to the system-wide exception hook,
1879 # The instance will store a pointer to the system-wide exception hook,
1880 # so that runtime code (such as magics) can access it. This is because
1880 # so that runtime code (such as magics) can access it. This is because
1881 # during the read-eval loop, it may get temporarily overwritten.
1881 # during the read-eval loop, it may get temporarily overwritten.
1882 self.sys_excepthook = sys.excepthook
1882 self.sys_excepthook = sys.excepthook
1883
1883
1884 # and add any custom exception handlers the user may have specified
1884 # and add any custom exception handlers the user may have specified
1885 self.set_custom_exc(*custom_exceptions)
1885 self.set_custom_exc(*custom_exceptions)
1886
1886
1887 # Set the exception mode
1887 # Set the exception mode
1888 self.InteractiveTB.set_mode(mode=self.xmode)
1888 self.InteractiveTB.set_mode(mode=self.xmode)
1889
1889
1890 def set_custom_exc(self, exc_tuple, handler):
1890 def set_custom_exc(self, exc_tuple, handler):
1891 """set_custom_exc(exc_tuple, handler)
1891 """set_custom_exc(exc_tuple, handler)
1892
1892
1893 Set a custom exception handler, which will be called if any of the
1893 Set a custom exception handler, which will be called if any of the
1894 exceptions in exc_tuple occur in the mainloop (specifically, in the
1894 exceptions in exc_tuple occur in the mainloop (specifically, in the
1895 run_code() method).
1895 run_code() method).
1896
1896
1897 Parameters
1897 Parameters
1898 ----------
1898 ----------
1899 exc_tuple : tuple of exception classes
1899 exc_tuple : tuple of exception classes
1900 A *tuple* of exception classes, for which to call the defined
1900 A *tuple* of exception classes, for which to call the defined
1901 handler. It is very important that you use a tuple, and NOT A
1901 handler. It is very important that you use a tuple, and NOT A
1902 LIST here, because of the way Python's except statement works. If
1902 LIST here, because of the way Python's except statement works. If
1903 you only want to trap a single exception, use a singleton tuple::
1903 you only want to trap a single exception, use a singleton tuple::
1904
1904
1905 exc_tuple == (MyCustomException,)
1905 exc_tuple == (MyCustomException,)
1906
1906
1907 handler : callable
1907 handler : callable
1908 handler must have the following signature::
1908 handler must have the following signature::
1909
1909
1910 def my_handler(self, etype, value, tb, tb_offset=None):
1910 def my_handler(self, etype, value, tb, tb_offset=None):
1911 ...
1911 ...
1912 return structured_traceback
1912 return structured_traceback
1913
1913
1914 Your handler must return a structured traceback (a list of strings),
1914 Your handler must return a structured traceback (a list of strings),
1915 or None.
1915 or None.
1916
1916
1917 This will be made into an instance method (via types.MethodType)
1917 This will be made into an instance method (via types.MethodType)
1918 of IPython itself, and it will be called if any of the exceptions
1918 of IPython itself, and it will be called if any of the exceptions
1919 listed in the exc_tuple are caught. If the handler is None, an
1919 listed in the exc_tuple are caught. If the handler is None, an
1920 internal basic one is used, which just prints basic info.
1920 internal basic one is used, which just prints basic info.
1921
1921
1922 To protect IPython from crashes, if your handler ever raises an
1922 To protect IPython from crashes, if your handler ever raises an
1923 exception or returns an invalid result, it will be immediately
1923 exception or returns an invalid result, it will be immediately
1924 disabled.
1924 disabled.
1925
1925
1926 Notes
1926 Notes
1927 -----
1927 -----
1928 WARNING: by putting in your own exception handler into IPython's main
1928 WARNING: by putting in your own exception handler into IPython's main
1929 execution loop, you run a very good chance of nasty crashes. This
1929 execution loop, you run a very good chance of nasty crashes. This
1930 facility should only be used if you really know what you are doing.
1930 facility should only be used if you really know what you are doing.
1931 """
1931 """
1932
1932
1933 if not isinstance(exc_tuple, tuple):
1933 if not isinstance(exc_tuple, tuple):
1934 raise TypeError("The custom exceptions must be given as a tuple.")
1934 raise TypeError("The custom exceptions must be given as a tuple.")
1935
1935
1936 def dummy_handler(self, etype, value, tb, tb_offset=None):
1936 def dummy_handler(self, etype, value, tb, tb_offset=None):
1937 print('*** Simple custom exception handler ***')
1937 print('*** Simple custom exception handler ***')
1938 print('Exception type :', etype)
1938 print('Exception type :', etype)
1939 print('Exception value:', value)
1939 print('Exception value:', value)
1940 print('Traceback :', tb)
1940 print('Traceback :', tb)
1941
1941
1942 def validate_stb(stb):
1942 def validate_stb(stb):
1943 """validate structured traceback return type
1943 """validate structured traceback return type
1944
1944
1945 return type of CustomTB *should* be a list of strings, but allow
1945 return type of CustomTB *should* be a list of strings, but allow
1946 single strings or None, which are harmless.
1946 single strings or None, which are harmless.
1947
1947
1948 This function will *always* return a list of strings,
1948 This function will *always* return a list of strings,
1949 and will raise a TypeError if stb is inappropriate.
1949 and will raise a TypeError if stb is inappropriate.
1950 """
1950 """
1951 msg = "CustomTB must return list of strings, not %r" % stb
1951 msg = "CustomTB must return list of strings, not %r" % stb
1952 if stb is None:
1952 if stb is None:
1953 return []
1953 return []
1954 elif isinstance(stb, str):
1954 elif isinstance(stb, str):
1955 return [stb]
1955 return [stb]
1956 elif not isinstance(stb, list):
1956 elif not isinstance(stb, list):
1957 raise TypeError(msg)
1957 raise TypeError(msg)
1958 # it's a list
1958 # it's a list
1959 for line in stb:
1959 for line in stb:
1960 # check every element
1960 # check every element
1961 if not isinstance(line, str):
1961 if not isinstance(line, str):
1962 raise TypeError(msg)
1962 raise TypeError(msg)
1963 return stb
1963 return stb
1964
1964
1965 if handler is None:
1965 if handler is None:
1966 wrapped = dummy_handler
1966 wrapped = dummy_handler
1967 else:
1967 else:
1968 def wrapped(self,etype,value,tb,tb_offset=None):
1968 def wrapped(self,etype,value,tb,tb_offset=None):
1969 """wrap CustomTB handler, to protect IPython from user code
1969 """wrap CustomTB handler, to protect IPython from user code
1970
1970
1971 This makes it harder (but not impossible) for custom exception
1971 This makes it harder (but not impossible) for custom exception
1972 handlers to crash IPython.
1972 handlers to crash IPython.
1973 """
1973 """
1974 try:
1974 try:
1975 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1975 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1976 return validate_stb(stb)
1976 return validate_stb(stb)
1977 except:
1977 except:
1978 # clear custom handler immediately
1978 # clear custom handler immediately
1979 self.set_custom_exc((), None)
1979 self.set_custom_exc((), None)
1980 print("Custom TB Handler failed, unregistering", file=sys.stderr)
1980 print("Custom TB Handler failed, unregistering", file=sys.stderr)
1981 # show the exception in handler first
1981 # show the exception in handler first
1982 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1982 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1983 print(self.InteractiveTB.stb2text(stb))
1983 print(self.InteractiveTB.stb2text(stb))
1984 print("The original exception:")
1984 print("The original exception:")
1985 stb = self.InteractiveTB.structured_traceback(
1985 stb = self.InteractiveTB.structured_traceback(
1986 (etype,value,tb), tb_offset=tb_offset
1986 (etype,value,tb), tb_offset=tb_offset
1987 )
1987 )
1988 return stb
1988 return stb
1989
1989
1990 self.CustomTB = types.MethodType(wrapped,self)
1990 self.CustomTB = types.MethodType(wrapped,self)
1991 self.custom_exceptions = exc_tuple
1991 self.custom_exceptions = exc_tuple
1992
1992
1993 def excepthook(self, etype, value, tb):
1993 def excepthook(self, etype, value, tb):
1994 """One more defense for GUI apps that call sys.excepthook.
1994 """One more defense for GUI apps that call sys.excepthook.
1995
1995
1996 GUI frameworks like wxPython trap exceptions and call
1996 GUI frameworks like wxPython trap exceptions and call
1997 sys.excepthook themselves. I guess this is a feature that
1997 sys.excepthook themselves. I guess this is a feature that
1998 enables them to keep running after exceptions that would
1998 enables them to keep running after exceptions that would
1999 otherwise kill their mainloop. This is a bother for IPython
1999 otherwise kill their mainloop. This is a bother for IPython
2000 which expects to catch all of the program exceptions with a try:
2000 which expects to catch all of the program exceptions with a try:
2001 except: statement.
2001 except: statement.
2002
2002
2003 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
2003 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
2004 any app directly invokes sys.excepthook, it will look to the user like
2004 any app directly invokes sys.excepthook, it will look to the user like
2005 IPython crashed. In order to work around this, we can disable the
2005 IPython crashed. In order to work around this, we can disable the
2006 CrashHandler and replace it with this excepthook instead, which prints a
2006 CrashHandler and replace it with this excepthook instead, which prints a
2007 regular traceback using our InteractiveTB. In this fashion, apps which
2007 regular traceback using our InteractiveTB. In this fashion, apps which
2008 call sys.excepthook will generate a regular-looking exception from
2008 call sys.excepthook will generate a regular-looking exception from
2009 IPython, and the CrashHandler will only be triggered by real IPython
2009 IPython, and the CrashHandler will only be triggered by real IPython
2010 crashes.
2010 crashes.
2011
2011
2012 This hook should be used sparingly, only in places which are not likely
2012 This hook should be used sparingly, only in places which are not likely
2013 to be true IPython errors.
2013 to be true IPython errors.
2014 """
2014 """
2015 self.showtraceback((etype, value, tb), tb_offset=0)
2015 self.showtraceback((etype, value, tb), tb_offset=0)
2016
2016
2017 def _get_exc_info(self, exc_tuple=None):
2017 def _get_exc_info(self, exc_tuple=None):
2018 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
2018 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
2019
2019
2020 Ensures sys.last_type,value,traceback hold the exc_info we found,
2020 Ensures sys.last_type,value,traceback hold the exc_info we found,
2021 from whichever source.
2021 from whichever source.
2022
2022
2023 raises ValueError if none of these contain any information
2023 raises ValueError if none of these contain any information
2024 """
2024 """
2025 if exc_tuple is None:
2025 if exc_tuple is None:
2026 etype, value, tb = sys.exc_info()
2026 etype, value, tb = sys.exc_info()
2027 else:
2027 else:
2028 etype, value, tb = exc_tuple
2028 etype, value, tb = exc_tuple
2029
2029
2030 if etype is None:
2030 if etype is None:
2031 if hasattr(sys, 'last_type'):
2031 if hasattr(sys, 'last_type'):
2032 etype, value, tb = sys.last_type, sys.last_value, \
2032 etype, value, tb = sys.last_type, sys.last_value, \
2033 sys.last_traceback
2033 sys.last_traceback
2034
2034
2035 if etype is None:
2035 if etype is None:
2036 raise ValueError("No exception to find")
2036 raise ValueError("No exception to find")
2037
2037
2038 # Now store the exception info in sys.last_type etc.
2038 # Now store the exception info in sys.last_type etc.
2039 # WARNING: these variables are somewhat deprecated and not
2039 # WARNING: these variables are somewhat deprecated and not
2040 # necessarily safe to use in a threaded environment, but tools
2040 # necessarily safe to use in a threaded environment, but tools
2041 # like pdb depend on their existence, so let's set them. If we
2041 # like pdb depend on their existence, so let's set them. If we
2042 # find problems in the field, we'll need to revisit their use.
2042 # find problems in the field, we'll need to revisit their use.
2043 sys.last_type = etype
2043 sys.last_type = etype
2044 sys.last_value = value
2044 sys.last_value = value
2045 sys.last_traceback = tb
2045 sys.last_traceback = tb
2046
2046
2047 return etype, value, tb
2047 return etype, value, tb
2048
2048
2049 def show_usage_error(self, exc):
2049 def show_usage_error(self, exc):
2050 """Show a short message for UsageErrors
2050 """Show a short message for UsageErrors
2051
2051
2052 These are special exceptions that shouldn't show a traceback.
2052 These are special exceptions that shouldn't show a traceback.
2053 """
2053 """
2054 print("UsageError: %s" % exc, file=sys.stderr)
2054 print("UsageError: %s" % exc, file=sys.stderr)
2055
2055
2056 def get_exception_only(self, exc_tuple=None):
2056 def get_exception_only(self, exc_tuple=None):
2057 """
2057 """
2058 Return as a string (ending with a newline) the exception that
2058 Return as a string (ending with a newline) the exception that
2059 just occurred, without any traceback.
2059 just occurred, without any traceback.
2060 """
2060 """
2061 etype, value, tb = self._get_exc_info(exc_tuple)
2061 etype, value, tb = self._get_exc_info(exc_tuple)
2062 msg = traceback.format_exception_only(etype, value)
2062 msg = traceback.format_exception_only(etype, value)
2063 return ''.join(msg)
2063 return ''.join(msg)
2064
2064
2065 def showtraceback(self, exc_tuple=None, filename=None, tb_offset=None,
2065 def showtraceback(self, exc_tuple=None, filename=None, tb_offset=None,
2066 exception_only=False, running_compiled_code=False):
2066 exception_only=False, running_compiled_code=False):
2067 """Display the exception that just occurred.
2067 """Display the exception that just occurred.
2068
2068
2069 If nothing is known about the exception, this is the method which
2069 If nothing is known about the exception, this is the method which
2070 should be used throughout the code for presenting user tracebacks,
2070 should be used throughout the code for presenting user tracebacks,
2071 rather than directly invoking the InteractiveTB object.
2071 rather than directly invoking the InteractiveTB object.
2072
2072
2073 A specific showsyntaxerror() also exists, but this method can take
2073 A specific showsyntaxerror() also exists, but this method can take
2074 care of calling it if needed, so unless you are explicitly catching a
2074 care of calling it if needed, so unless you are explicitly catching a
2075 SyntaxError exception, don't try to analyze the stack manually and
2075 SyntaxError exception, don't try to analyze the stack manually and
2076 simply call this method."""
2076 simply call this method."""
2077
2077
2078 try:
2078 try:
2079 try:
2079 try:
2080 etype, value, tb = self._get_exc_info(exc_tuple)
2080 etype, value, tb = self._get_exc_info(exc_tuple)
2081 except ValueError:
2081 except ValueError:
2082 print('No traceback available to show.', file=sys.stderr)
2082 print('No traceback available to show.', file=sys.stderr)
2083 return
2083 return
2084
2084
2085 if issubclass(etype, SyntaxError):
2085 if issubclass(etype, SyntaxError):
2086 # Though this won't be called by syntax errors in the input
2086 # Though this won't be called by syntax errors in the input
2087 # line, there may be SyntaxError cases with imported code.
2087 # line, there may be SyntaxError cases with imported code.
2088 self.showsyntaxerror(filename, running_compiled_code)
2088 self.showsyntaxerror(filename, running_compiled_code)
2089 elif etype is UsageError:
2089 elif etype is UsageError:
2090 self.show_usage_error(value)
2090 self.show_usage_error(value)
2091 else:
2091 else:
2092 if exception_only:
2092 if exception_only:
2093 stb = ['An exception has occurred, use %tb to see '
2093 stb = ['An exception has occurred, use %tb to see '
2094 'the full traceback.\n']
2094 'the full traceback.\n']
2095 stb.extend(self.InteractiveTB.get_exception_only(etype,
2095 stb.extend(self.InteractiveTB.get_exception_only(etype,
2096 value))
2096 value))
2097 else:
2097 else:
2098 try:
2098 try:
2099 # Exception classes can customise their traceback - we
2099 # Exception classes can customise their traceback - we
2100 # use this in IPython.parallel for exceptions occurring
2100 # use this in IPython.parallel for exceptions occurring
2101 # in the engines. This should return a list of strings.
2101 # in the engines. This should return a list of strings.
2102 if hasattr(value, "_render_traceback_"):
2102 if hasattr(value, "_render_traceback_"):
2103 stb = value._render_traceback_()
2103 stb = value._render_traceback_()
2104 else:
2104 else:
2105 stb = self.InteractiveTB.structured_traceback(
2105 stb = self.InteractiveTB.structured_traceback(
2106 etype, value, tb, tb_offset=tb_offset
2106 etype, value, tb, tb_offset=tb_offset
2107 )
2107 )
2108
2108
2109 except Exception:
2109 except Exception:
2110 print(
2110 print(
2111 "Unexpected exception formatting exception. Falling back to standard exception"
2111 "Unexpected exception formatting exception. Falling back to standard exception"
2112 )
2112 )
2113 traceback.print_exc()
2113 traceback.print_exc()
2114 return None
2114 return None
2115
2115
2116 self._showtraceback(etype, value, stb)
2116 self._showtraceback(etype, value, stb)
2117 if self.call_pdb:
2117 if self.call_pdb:
2118 # drop into debugger
2118 # drop into debugger
2119 self.debugger(force=True)
2119 self.debugger(force=True)
2120 return
2120 return
2121
2121
2122 # Actually show the traceback
2122 # Actually show the traceback
2123 self._showtraceback(etype, value, stb)
2123 self._showtraceback(etype, value, stb)
2124
2124
2125 except KeyboardInterrupt:
2125 except KeyboardInterrupt:
2126 print('\n' + self.get_exception_only(), file=sys.stderr)
2126 print('\n' + self.get_exception_only(), file=sys.stderr)
2127
2127
2128 def _showtraceback(self, etype, evalue, stb: str):
2128 def _showtraceback(self, etype, evalue, stb: str):
2129 """Actually show a traceback.
2129 """Actually show a traceback.
2130
2130
2131 Subclasses may override this method to put the traceback on a different
2131 Subclasses may override this method to put the traceback on a different
2132 place, like a side channel.
2132 place, like a side channel.
2133 """
2133 """
2134 val = self.InteractiveTB.stb2text(stb)
2134 val = self.InteractiveTB.stb2text(stb)
2135 try:
2135 try:
2136 print(val)
2136 print(val)
2137 except UnicodeEncodeError:
2137 except UnicodeEncodeError:
2138 print(val.encode("utf-8", "backslashreplace").decode())
2138 print(val.encode("utf-8", "backslashreplace").decode())
2139
2139
2140 def showsyntaxerror(self, filename=None, running_compiled_code=False):
2140 def showsyntaxerror(self, filename=None, running_compiled_code=False):
2141 """Display the syntax error that just occurred.
2141 """Display the syntax error that just occurred.
2142
2142
2143 This doesn't display a stack trace because there isn't one.
2143 This doesn't display a stack trace because there isn't one.
2144
2144
2145 If a filename is given, it is stuffed in the exception instead
2145 If a filename is given, it is stuffed in the exception instead
2146 of what was there before (because Python's parser always uses
2146 of what was there before (because Python's parser always uses
2147 "<string>" when reading from a string).
2147 "<string>" when reading from a string).
2148
2148
2149 If the syntax error occurred when running a compiled code (i.e. running_compile_code=True),
2149 If the syntax error occurred when running a compiled code (i.e. running_compile_code=True),
2150 longer stack trace will be displayed.
2150 longer stack trace will be displayed.
2151 """
2151 """
2152 etype, value, last_traceback = self._get_exc_info()
2152 etype, value, last_traceback = self._get_exc_info()
2153
2153
2154 if filename and issubclass(etype, SyntaxError):
2154 if filename and issubclass(etype, SyntaxError):
2155 try:
2155 try:
2156 value.filename = filename
2156 value.filename = filename
2157 except:
2157 except:
2158 # Not the format we expect; leave it alone
2158 # Not the format we expect; leave it alone
2159 pass
2159 pass
2160
2160
2161 # If the error occurred when executing compiled code, we should provide full stacktrace.
2161 # If the error occurred when executing compiled code, we should provide full stacktrace.
2162 elist = traceback.extract_tb(last_traceback) if running_compiled_code else []
2162 elist = traceback.extract_tb(last_traceback) if running_compiled_code else []
2163 stb = self.SyntaxTB.structured_traceback(etype, value, elist)
2163 stb = self.SyntaxTB.structured_traceback(etype, value, elist)
2164 self._showtraceback(etype, value, stb)
2164 self._showtraceback(etype, value, stb)
2165
2165
2166 # This is overridden in TerminalInteractiveShell to show a message about
2166 # This is overridden in TerminalInteractiveShell to show a message about
2167 # the %paste magic.
2167 # the %paste magic.
2168 def showindentationerror(self):
2168 def showindentationerror(self):
2169 """Called by _run_cell when there's an IndentationError in code entered
2169 """Called by _run_cell when there's an IndentationError in code entered
2170 at the prompt.
2170 at the prompt.
2171
2171
2172 This is overridden in TerminalInteractiveShell to show a message about
2172 This is overridden in TerminalInteractiveShell to show a message about
2173 the %paste magic."""
2173 the %paste magic."""
2174 self.showsyntaxerror()
2174 self.showsyntaxerror()
2175
2175
2176 @skip_doctest
2176 @skip_doctest
2177 def set_next_input(self, s, replace=False):
2177 def set_next_input(self, s, replace=False):
2178 """ Sets the 'default' input string for the next command line.
2178 """ Sets the 'default' input string for the next command line.
2179
2179
2180 Example::
2180 Example::
2181
2181
2182 In [1]: _ip.set_next_input("Hello Word")
2182 In [1]: _ip.set_next_input("Hello Word")
2183 In [2]: Hello Word_ # cursor is here
2183 In [2]: Hello Word_ # cursor is here
2184 """
2184 """
2185 self.rl_next_input = s
2185 self.rl_next_input = s
2186
2186
2187 def _indent_current_str(self):
2187 def _indent_current_str(self):
2188 """return the current level of indentation as a string"""
2188 """return the current level of indentation as a string"""
2189 return self.input_splitter.get_indent_spaces() * ' '
2189 return self.input_splitter.get_indent_spaces() * ' '
2190
2190
2191 #-------------------------------------------------------------------------
2191 #-------------------------------------------------------------------------
2192 # Things related to text completion
2192 # Things related to text completion
2193 #-------------------------------------------------------------------------
2193 #-------------------------------------------------------------------------
2194
2194
2195 def init_completer(self):
2195 def init_completer(self):
2196 """Initialize the completion machinery.
2196 """Initialize the completion machinery.
2197
2197
2198 This creates completion machinery that can be used by client code,
2198 This creates completion machinery that can be used by client code,
2199 either interactively in-process (typically triggered by the readline
2199 either interactively in-process (typically triggered by the readline
2200 library), programmatically (such as in test suites) or out-of-process
2200 library), programmatically (such as in test suites) or out-of-process
2201 (typically over the network by remote frontends).
2201 (typically over the network by remote frontends).
2202 """
2202 """
2203 from IPython.core.completer import IPCompleter
2203 from IPython.core.completer import IPCompleter
2204 from IPython.core.completerlib import (
2204 from IPython.core.completerlib import (
2205 cd_completer,
2205 cd_completer,
2206 magic_run_completer,
2206 magic_run_completer,
2207 module_completer,
2207 module_completer,
2208 reset_completer,
2208 reset_completer,
2209 )
2209 )
2210
2210
2211 self.Completer = IPCompleter(shell=self,
2211 self.Completer = IPCompleter(shell=self,
2212 namespace=self.user_ns,
2212 namespace=self.user_ns,
2213 global_namespace=self.user_global_ns,
2213 global_namespace=self.user_global_ns,
2214 parent=self,
2214 parent=self,
2215 )
2215 )
2216 self.configurables.append(self.Completer)
2216 self.configurables.append(self.Completer)
2217
2217
2218 # Add custom completers to the basic ones built into IPCompleter
2218 # Add custom completers to the basic ones built into IPCompleter
2219 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
2219 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
2220 self.strdispatchers['complete_command'] = sdisp
2220 self.strdispatchers['complete_command'] = sdisp
2221 self.Completer.custom_completers = sdisp
2221 self.Completer.custom_completers = sdisp
2222
2222
2223 self.set_hook('complete_command', module_completer, str_key = 'import')
2223 self.set_hook('complete_command', module_completer, str_key = 'import')
2224 self.set_hook('complete_command', module_completer, str_key = 'from')
2224 self.set_hook('complete_command', module_completer, str_key = 'from')
2225 self.set_hook('complete_command', module_completer, str_key = '%aimport')
2225 self.set_hook('complete_command', module_completer, str_key = '%aimport')
2226 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
2226 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
2227 self.set_hook('complete_command', cd_completer, str_key = '%cd')
2227 self.set_hook('complete_command', cd_completer, str_key = '%cd')
2228 self.set_hook('complete_command', reset_completer, str_key = '%reset')
2228 self.set_hook('complete_command', reset_completer, str_key = '%reset')
2229
2229
2230 @skip_doctest
2230 @skip_doctest
2231 def complete(self, text, line=None, cursor_pos=None):
2231 def complete(self, text, line=None, cursor_pos=None):
2232 """Return the completed text and a list of completions.
2232 """Return the completed text and a list of completions.
2233
2233
2234 Parameters
2234 Parameters
2235 ----------
2235 ----------
2236 text : string
2236 text : string
2237 A string of text to be completed on. It can be given as empty and
2237 A string of text to be completed on. It can be given as empty and
2238 instead a line/position pair are given. In this case, the
2238 instead a line/position pair are given. In this case, the
2239 completer itself will split the line like readline does.
2239 completer itself will split the line like readline does.
2240 line : string, optional
2240 line : string, optional
2241 The complete line that text is part of.
2241 The complete line that text is part of.
2242 cursor_pos : int, optional
2242 cursor_pos : int, optional
2243 The position of the cursor on the input line.
2243 The position of the cursor on the input line.
2244
2244
2245 Returns
2245 Returns
2246 -------
2246 -------
2247 text : string
2247 text : string
2248 The actual text that was completed.
2248 The actual text that was completed.
2249 matches : list
2249 matches : list
2250 A sorted list with all possible completions.
2250 A sorted list with all possible completions.
2251
2251
2252 Notes
2252 Notes
2253 -----
2253 -----
2254 The optional arguments allow the completion to take more context into
2254 The optional arguments allow the completion to take more context into
2255 account, and are part of the low-level completion API.
2255 account, and are part of the low-level completion API.
2256
2256
2257 This is a wrapper around the completion mechanism, similar to what
2257 This is a wrapper around the completion mechanism, similar to what
2258 readline does at the command line when the TAB key is hit. By
2258 readline does at the command line when the TAB key is hit. By
2259 exposing it as a method, it can be used by other non-readline
2259 exposing it as a method, it can be used by other non-readline
2260 environments (such as GUIs) for text completion.
2260 environments (such as GUIs) for text completion.
2261
2261
2262 Examples
2262 Examples
2263 --------
2263 --------
2264 In [1]: x = 'hello'
2264 In [1]: x = 'hello'
2265
2265
2266 In [2]: _ip.complete('x.l')
2266 In [2]: _ip.complete('x.l')
2267 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
2267 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
2268 """
2268 """
2269
2269
2270 # Inject names into __builtin__ so we can complete on the added names.
2270 # Inject names into __builtin__ so we can complete on the added names.
2271 with self.builtin_trap:
2271 with self.builtin_trap:
2272 return self.Completer.complete(text, line, cursor_pos)
2272 return self.Completer.complete(text, line, cursor_pos)
2273
2273
2274 def set_custom_completer(self, completer, pos=0) -> None:
2274 def set_custom_completer(self, completer, pos=0) -> None:
2275 """Adds a new custom completer function.
2275 """Adds a new custom completer function.
2276
2276
2277 The position argument (defaults to 0) is the index in the completers
2277 The position argument (defaults to 0) is the index in the completers
2278 list where you want the completer to be inserted.
2278 list where you want the completer to be inserted.
2279
2279
2280 `completer` should have the following signature::
2280 `completer` should have the following signature::
2281
2281
2282 def completion(self: Completer, text: string) -> List[str]:
2282 def completion(self: Completer, text: string) -> List[str]:
2283 raise NotImplementedError
2283 raise NotImplementedError
2284
2284
2285 It will be bound to the current Completer instance and pass some text
2285 It will be bound to the current Completer instance and pass some text
2286 and return a list with current completions to suggest to the user.
2286 and return a list with current completions to suggest to the user.
2287 """
2287 """
2288
2288
2289 newcomp = types.MethodType(completer, self.Completer)
2289 newcomp = types.MethodType(completer, self.Completer)
2290 self.Completer.custom_matchers.insert(pos,newcomp)
2290 self.Completer.custom_matchers.insert(pos,newcomp)
2291
2291
2292 def set_completer_frame(self, frame=None):
2292 def set_completer_frame(self, frame=None):
2293 """Set the frame of the completer."""
2293 """Set the frame of the completer."""
2294 if frame:
2294 if frame:
2295 self.Completer.namespace = frame.f_locals
2295 self.Completer.namespace = frame.f_locals
2296 self.Completer.global_namespace = frame.f_globals
2296 self.Completer.global_namespace = frame.f_globals
2297 else:
2297 else:
2298 self.Completer.namespace = self.user_ns
2298 self.Completer.namespace = self.user_ns
2299 self.Completer.global_namespace = self.user_global_ns
2299 self.Completer.global_namespace = self.user_global_ns
2300
2300
2301 #-------------------------------------------------------------------------
2301 #-------------------------------------------------------------------------
2302 # Things related to magics
2302 # Things related to magics
2303 #-------------------------------------------------------------------------
2303 #-------------------------------------------------------------------------
2304
2304
2305 def init_magics(self):
2305 def init_magics(self):
2306 from IPython.core import magics as m
2306 from IPython.core import magics as m
2307 self.magics_manager = magic.MagicsManager(shell=self,
2307 self.magics_manager = magic.MagicsManager(shell=self,
2308 parent=self,
2308 parent=self,
2309 user_magics=m.UserMagics(self))
2309 user_magics=m.UserMagics(self))
2310 self.configurables.append(self.magics_manager)
2310 self.configurables.append(self.magics_manager)
2311
2311
2312 # Expose as public API from the magics manager
2312 # Expose as public API from the magics manager
2313 self.register_magics = self.magics_manager.register
2313 self.register_magics = self.magics_manager.register
2314
2314
2315 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2315 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2316 m.ConfigMagics, m.DisplayMagics, m.ExecutionMagics,
2316 m.ConfigMagics, m.DisplayMagics, m.ExecutionMagics,
2317 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2317 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2318 m.NamespaceMagics, m.OSMagics, m.PackagingMagics,
2318 m.NamespaceMagics, m.OSMagics, m.PackagingMagics,
2319 m.PylabMagics, m.ScriptMagics,
2319 m.PylabMagics, m.ScriptMagics,
2320 )
2320 )
2321 self.register_magics(m.AsyncMagics)
2321 self.register_magics(m.AsyncMagics)
2322
2322
2323 # Register Magic Aliases
2323 # Register Magic Aliases
2324 mman = self.magics_manager
2324 mman = self.magics_manager
2325 # FIXME: magic aliases should be defined by the Magics classes
2325 # FIXME: magic aliases should be defined by the Magics classes
2326 # or in MagicsManager, not here
2326 # or in MagicsManager, not here
2327 mman.register_alias('ed', 'edit')
2327 mman.register_alias('ed', 'edit')
2328 mman.register_alias('hist', 'history')
2328 mman.register_alias('hist', 'history')
2329 mman.register_alias('rep', 'recall')
2329 mman.register_alias('rep', 'recall')
2330 mman.register_alias('SVG', 'svg', 'cell')
2330 mman.register_alias('SVG', 'svg', 'cell')
2331 mman.register_alias('HTML', 'html', 'cell')
2331 mman.register_alias('HTML', 'html', 'cell')
2332 mman.register_alias('file', 'writefile', 'cell')
2332 mman.register_alias('file', 'writefile', 'cell')
2333
2333
2334 # FIXME: Move the color initialization to the DisplayHook, which
2334 # FIXME: Move the color initialization to the DisplayHook, which
2335 # should be split into a prompt manager and displayhook. We probably
2335 # should be split into a prompt manager and displayhook. We probably
2336 # even need a centralize colors management object.
2336 # even need a centralize colors management object.
2337 self.run_line_magic('colors', self.colors)
2337 self.run_line_magic('colors', self.colors)
2338
2338
2339 # Defined here so that it's included in the documentation
2339 # Defined here so that it's included in the documentation
2340 @functools.wraps(magic.MagicsManager.register_function)
2340 @functools.wraps(magic.MagicsManager.register_function)
2341 def register_magic_function(self, func, magic_kind='line', magic_name=None):
2341 def register_magic_function(self, func, magic_kind='line', magic_name=None):
2342 self.magics_manager.register_function(
2342 self.magics_manager.register_function(
2343 func, magic_kind=magic_kind, magic_name=magic_name
2343 func, magic_kind=magic_kind, magic_name=magic_name
2344 )
2344 )
2345
2345
2346 def _find_with_lazy_load(self, /, type_, magic_name: str):
2346 def _find_with_lazy_load(self, /, type_, magic_name: str):
2347 """
2347 """
2348 Try to find a magic potentially lazy-loading it.
2348 Try to find a magic potentially lazy-loading it.
2349
2349
2350 Parameters
2350 Parameters
2351 ----------
2351 ----------
2352
2352
2353 type_: "line"|"cell"
2353 type_: "line"|"cell"
2354 the type of magics we are trying to find/lazy load.
2354 the type of magics we are trying to find/lazy load.
2355 magic_name: str
2355 magic_name: str
2356 The name of the magic we are trying to find/lazy load
2356 The name of the magic we are trying to find/lazy load
2357
2357
2358
2358
2359 Note that this may have any side effects
2359 Note that this may have any side effects
2360 """
2360 """
2361 finder = {"line": self.find_line_magic, "cell": self.find_cell_magic}[type_]
2361 finder = {"line": self.find_line_magic, "cell": self.find_cell_magic}[type_]
2362 fn = finder(magic_name)
2362 fn = finder(magic_name)
2363 if fn is not None:
2363 if fn is not None:
2364 return fn
2364 return fn
2365 lazy = self.magics_manager.lazy_magics.get(magic_name)
2365 lazy = self.magics_manager.lazy_magics.get(magic_name)
2366 if lazy is None:
2366 if lazy is None:
2367 return None
2367 return None
2368
2368
2369 self.run_line_magic("load_ext", lazy)
2369 self.run_line_magic("load_ext", lazy)
2370 res = finder(magic_name)
2370 res = finder(magic_name)
2371 return res
2371 return res
2372
2372
2373 def run_line_magic(self, magic_name: str, line, _stack_depth=1):
2373 def run_line_magic(self, magic_name: str, line, _stack_depth=1):
2374 """Execute the given line magic.
2374 """Execute the given line magic.
2375
2375
2376 Parameters
2376 Parameters
2377 ----------
2377 ----------
2378 magic_name : str
2378 magic_name : str
2379 Name of the desired magic function, without '%' prefix.
2379 Name of the desired magic function, without '%' prefix.
2380 line : str
2380 line : str
2381 The rest of the input line as a single string.
2381 The rest of the input line as a single string.
2382 _stack_depth : int
2382 _stack_depth : int
2383 If run_line_magic() is called from magic() then _stack_depth=2.
2383 If run_line_magic() is called from magic() then _stack_depth=2.
2384 This is added to ensure backward compatibility for use of 'get_ipython().magic()'
2384 This is added to ensure backward compatibility for use of 'get_ipython().magic()'
2385 """
2385 """
2386 fn = self._find_with_lazy_load("line", magic_name)
2386 fn = self._find_with_lazy_load("line", magic_name)
2387 if fn is None:
2387 if fn is None:
2388 lazy = self.magics_manager.lazy_magics.get(magic_name)
2388 lazy = self.magics_manager.lazy_magics.get(magic_name)
2389 if lazy:
2389 if lazy:
2390 self.run_line_magic("load_ext", lazy)
2390 self.run_line_magic("load_ext", lazy)
2391 fn = self.find_line_magic(magic_name)
2391 fn = self.find_line_magic(magic_name)
2392 if fn is None:
2392 if fn is None:
2393 cm = self.find_cell_magic(magic_name)
2393 cm = self.find_cell_magic(magic_name)
2394 etpl = "Line magic function `%%%s` not found%s."
2394 etpl = "Line magic function `%%%s` not found%s."
2395 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2395 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2396 'did you mean that instead?)' % magic_name )
2396 'did you mean that instead?)' % magic_name )
2397 raise UsageError(etpl % (magic_name, extra))
2397 raise UsageError(etpl % (magic_name, extra))
2398 else:
2398 else:
2399 # Note: this is the distance in the stack to the user's frame.
2399 # Note: this is the distance in the stack to the user's frame.
2400 # This will need to be updated if the internal calling logic gets
2400 # This will need to be updated if the internal calling logic gets
2401 # refactored, or else we'll be expanding the wrong variables.
2401 # refactored, or else we'll be expanding the wrong variables.
2402
2402
2403 # Determine stack_depth depending on where run_line_magic() has been called
2403 # Determine stack_depth depending on where run_line_magic() has been called
2404 stack_depth = _stack_depth
2404 stack_depth = _stack_depth
2405 if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False):
2405 if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False):
2406 # magic has opted out of var_expand
2406 # magic has opted out of var_expand
2407 magic_arg_s = line
2407 magic_arg_s = line
2408 else:
2408 else:
2409 magic_arg_s = self.var_expand(line, stack_depth)
2409 magic_arg_s = self.var_expand(line, stack_depth)
2410 # Put magic args in a list so we can call with f(*a) syntax
2410 # Put magic args in a list so we can call with f(*a) syntax
2411 args = [magic_arg_s]
2411 args = [magic_arg_s]
2412 kwargs = {}
2412 kwargs = {}
2413 # Grab local namespace if we need it:
2413 # Grab local namespace if we need it:
2414 if getattr(fn, "needs_local_scope", False):
2414 if getattr(fn, "needs_local_scope", False):
2415 kwargs['local_ns'] = self.get_local_scope(stack_depth)
2415 kwargs['local_ns'] = self.get_local_scope(stack_depth)
2416 with self.builtin_trap:
2416 with self.builtin_trap:
2417 result = fn(*args, **kwargs)
2417 result = fn(*args, **kwargs)
2418
2418
2419 # The code below prevents the output from being displayed
2419 # The code below prevents the output from being displayed
2420 # when using magics with decodator @output_can_be_silenced
2420 # when using magics with decodator @output_can_be_silenced
2421 # when the last Python token in the expression is a ';'.
2421 # when the last Python token in the expression is a ';'.
2422 if getattr(fn, magic.MAGIC_OUTPUT_CAN_BE_SILENCED, False):
2422 if getattr(fn, magic.MAGIC_OUTPUT_CAN_BE_SILENCED, False):
2423 if DisplayHook.semicolon_at_end_of_expression(magic_arg_s):
2423 if DisplayHook.semicolon_at_end_of_expression(magic_arg_s):
2424 return None
2424 return None
2425
2425
2426 return result
2426 return result
2427
2427
2428 def get_local_scope(self, stack_depth):
2428 def get_local_scope(self, stack_depth):
2429 """Get local scope at given stack depth.
2429 """Get local scope at given stack depth.
2430
2430
2431 Parameters
2431 Parameters
2432 ----------
2432 ----------
2433 stack_depth : int
2433 stack_depth : int
2434 Depth relative to calling frame
2434 Depth relative to calling frame
2435 """
2435 """
2436 return sys._getframe(stack_depth + 1).f_locals
2436 return sys._getframe(stack_depth + 1).f_locals
2437
2437
2438 def run_cell_magic(self, magic_name, line, cell):
2438 def run_cell_magic(self, magic_name, line, cell):
2439 """Execute the given cell magic.
2439 """Execute the given cell magic.
2440
2440
2441 Parameters
2441 Parameters
2442 ----------
2442 ----------
2443 magic_name : str
2443 magic_name : str
2444 Name of the desired magic function, without '%' prefix.
2444 Name of the desired magic function, without '%' prefix.
2445 line : str
2445 line : str
2446 The rest of the first input line as a single string.
2446 The rest of the first input line as a single string.
2447 cell : str
2447 cell : str
2448 The body of the cell as a (possibly multiline) string.
2448 The body of the cell as a (possibly multiline) string.
2449 """
2449 """
2450 fn = self._find_with_lazy_load("cell", magic_name)
2450 fn = self._find_with_lazy_load("cell", magic_name)
2451 if fn is None:
2451 if fn is None:
2452 lm = self.find_line_magic(magic_name)
2452 lm = self.find_line_magic(magic_name)
2453 etpl = "Cell magic `%%{0}` not found{1}."
2453 etpl = "Cell magic `%%{0}` not found{1}."
2454 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2454 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2455 'did you mean that instead?)'.format(magic_name))
2455 'did you mean that instead?)'.format(magic_name))
2456 raise UsageError(etpl.format(magic_name, extra))
2456 raise UsageError(etpl.format(magic_name, extra))
2457 elif cell == '':
2457 elif cell == '':
2458 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2458 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2459 if self.find_line_magic(magic_name) is not None:
2459 if self.find_line_magic(magic_name) is not None:
2460 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2460 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2461 raise UsageError(message)
2461 raise UsageError(message)
2462 else:
2462 else:
2463 # Note: this is the distance in the stack to the user's frame.
2463 # Note: this is the distance in the stack to the user's frame.
2464 # This will need to be updated if the internal calling logic gets
2464 # This will need to be updated if the internal calling logic gets
2465 # refactored, or else we'll be expanding the wrong variables.
2465 # refactored, or else we'll be expanding the wrong variables.
2466 stack_depth = 2
2466 stack_depth = 2
2467 if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False):
2467 if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False):
2468 # magic has opted out of var_expand
2468 # magic has opted out of var_expand
2469 magic_arg_s = line
2469 magic_arg_s = line
2470 else:
2470 else:
2471 magic_arg_s = self.var_expand(line, stack_depth)
2471 magic_arg_s = self.var_expand(line, stack_depth)
2472 kwargs = {}
2472 kwargs = {}
2473 if getattr(fn, "needs_local_scope", False):
2473 if getattr(fn, "needs_local_scope", False):
2474 kwargs['local_ns'] = self.user_ns
2474 kwargs['local_ns'] = self.user_ns
2475
2475
2476 with self.builtin_trap:
2476 with self.builtin_trap:
2477 args = (magic_arg_s, cell)
2477 args = (magic_arg_s, cell)
2478 result = fn(*args, **kwargs)
2478 result = fn(*args, **kwargs)
2479
2479
2480 # The code below prevents the output from being displayed
2480 # The code below prevents the output from being displayed
2481 # when using magics with decodator @output_can_be_silenced
2481 # when using magics with decodator @output_can_be_silenced
2482 # when the last Python token in the expression is a ';'.
2482 # when the last Python token in the expression is a ';'.
2483 if getattr(fn, magic.MAGIC_OUTPUT_CAN_BE_SILENCED, False):
2483 if getattr(fn, magic.MAGIC_OUTPUT_CAN_BE_SILENCED, False):
2484 if DisplayHook.semicolon_at_end_of_expression(cell):
2484 if DisplayHook.semicolon_at_end_of_expression(cell):
2485 return None
2485 return None
2486
2486
2487 return result
2487 return result
2488
2488
2489 def find_line_magic(self, magic_name):
2489 def find_line_magic(self, magic_name):
2490 """Find and return a line magic by name.
2490 """Find and return a line magic by name.
2491
2491
2492 Returns None if the magic isn't found."""
2492 Returns None if the magic isn't found."""
2493 return self.magics_manager.magics['line'].get(magic_name)
2493 return self.magics_manager.magics['line'].get(magic_name)
2494
2494
2495 def find_cell_magic(self, magic_name):
2495 def find_cell_magic(self, magic_name):
2496 """Find and return a cell magic by name.
2496 """Find and return a cell magic by name.
2497
2497
2498 Returns None if the magic isn't found."""
2498 Returns None if the magic isn't found."""
2499 return self.magics_manager.magics['cell'].get(magic_name)
2499 return self.magics_manager.magics['cell'].get(magic_name)
2500
2500
2501 def find_magic(self, magic_name, magic_kind='line'):
2501 def find_magic(self, magic_name, magic_kind='line'):
2502 """Find and return a magic of the given type by name.
2502 """Find and return a magic of the given type by name.
2503
2503
2504 Returns None if the magic isn't found."""
2504 Returns None if the magic isn't found."""
2505 return self.magics_manager.magics[magic_kind].get(magic_name)
2505 return self.magics_manager.magics[magic_kind].get(magic_name)
2506
2506
2507 def magic(self, arg_s):
2507 def magic(self, arg_s):
2508 """
2508 """
2509 DEPRECATED
2509 DEPRECATED
2510
2510
2511 Deprecated since IPython 0.13 (warning added in
2511 Deprecated since IPython 0.13 (warning added in
2512 8.1), use run_line_magic(magic_name, parameter_s).
2512 8.1), use run_line_magic(magic_name, parameter_s).
2513
2513
2514 Call a magic function by name.
2514 Call a magic function by name.
2515
2515
2516 Input: a string containing the name of the magic function to call and
2516 Input: a string containing the name of the magic function to call and
2517 any additional arguments to be passed to the magic.
2517 any additional arguments to be passed to the magic.
2518
2518
2519 magic('name -opt foo bar') is equivalent to typing at the ipython
2519 magic('name -opt foo bar') is equivalent to typing at the ipython
2520 prompt:
2520 prompt:
2521
2521
2522 In[1]: %name -opt foo bar
2522 In[1]: %name -opt foo bar
2523
2523
2524 To call a magic without arguments, simply use magic('name').
2524 To call a magic without arguments, simply use magic('name').
2525
2525
2526 This provides a proper Python function to call IPython's magics in any
2526 This provides a proper Python function to call IPython's magics in any
2527 valid Python code you can type at the interpreter, including loops and
2527 valid Python code you can type at the interpreter, including loops and
2528 compound statements.
2528 compound statements.
2529 """
2529 """
2530 warnings.warn(
2530 warnings.warn(
2531 "`magic(...)` is deprecated since IPython 0.13 (warning added in "
2531 "`magic(...)` is deprecated since IPython 0.13 (warning added in "
2532 "8.1), use run_line_magic(magic_name, parameter_s).",
2532 "8.1), use run_line_magic(magic_name, parameter_s).",
2533 DeprecationWarning,
2533 DeprecationWarning,
2534 stacklevel=2,
2534 stacklevel=2,
2535 )
2535 )
2536 # TODO: should we issue a loud deprecation warning here?
2536 # TODO: should we issue a loud deprecation warning here?
2537 magic_name, _, magic_arg_s = arg_s.partition(' ')
2537 magic_name, _, magic_arg_s = arg_s.partition(' ')
2538 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2538 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2539 return self.run_line_magic(magic_name, magic_arg_s, _stack_depth=2)
2539 return self.run_line_magic(magic_name, magic_arg_s, _stack_depth=2)
2540
2540
2541 #-------------------------------------------------------------------------
2541 #-------------------------------------------------------------------------
2542 # Things related to macros
2542 # Things related to macros
2543 #-------------------------------------------------------------------------
2543 #-------------------------------------------------------------------------
2544
2544
2545 def define_macro(self, name, themacro):
2545 def define_macro(self, name, themacro):
2546 """Define a new macro
2546 """Define a new macro
2547
2547
2548 Parameters
2548 Parameters
2549 ----------
2549 ----------
2550 name : str
2550 name : str
2551 The name of the macro.
2551 The name of the macro.
2552 themacro : str or Macro
2552 themacro : str or Macro
2553 The action to do upon invoking the macro. If a string, a new
2553 The action to do upon invoking the macro. If a string, a new
2554 Macro object is created by passing the string to it.
2554 Macro object is created by passing the string to it.
2555 """
2555 """
2556
2556
2557 from IPython.core import macro
2557 from IPython.core import macro
2558
2558
2559 if isinstance(themacro, str):
2559 if isinstance(themacro, str):
2560 themacro = macro.Macro(themacro)
2560 themacro = macro.Macro(themacro)
2561 if not isinstance(themacro, macro.Macro):
2561 if not isinstance(themacro, macro.Macro):
2562 raise ValueError('A macro must be a string or a Macro instance.')
2562 raise ValueError('A macro must be a string or a Macro instance.')
2563 self.user_ns[name] = themacro
2563 self.user_ns[name] = themacro
2564
2564
2565 #-------------------------------------------------------------------------
2565 #-------------------------------------------------------------------------
2566 # Things related to the running of system commands
2566 # Things related to the running of system commands
2567 #-------------------------------------------------------------------------
2567 #-------------------------------------------------------------------------
2568
2568
2569 def system_piped(self, cmd):
2569 def system_piped(self, cmd):
2570 """Call the given cmd in a subprocess, piping stdout/err
2570 """Call the given cmd in a subprocess, piping stdout/err
2571
2571
2572 Parameters
2572 Parameters
2573 ----------
2573 ----------
2574 cmd : str
2574 cmd : str
2575 Command to execute (can not end in '&', as background processes are
2575 Command to execute (can not end in '&', as background processes are
2576 not supported. Should not be a command that expects input
2576 not supported. Should not be a command that expects input
2577 other than simple text.
2577 other than simple text.
2578 """
2578 """
2579 if cmd.rstrip().endswith('&'):
2579 if cmd.rstrip().endswith('&'):
2580 # this is *far* from a rigorous test
2580 # this is *far* from a rigorous test
2581 # We do not support backgrounding processes because we either use
2581 # We do not support backgrounding processes because we either use
2582 # pexpect or pipes to read from. Users can always just call
2582 # pexpect or pipes to read from. Users can always just call
2583 # os.system() or use ip.system=ip.system_raw
2583 # os.system() or use ip.system=ip.system_raw
2584 # if they really want a background process.
2584 # if they really want a background process.
2585 raise OSError("Background processes not supported.")
2585 raise OSError("Background processes not supported.")
2586
2586
2587 # we explicitly do NOT return the subprocess status code, because
2587 # we explicitly do NOT return the subprocess status code, because
2588 # a non-None value would trigger :func:`sys.displayhook` calls.
2588 # a non-None value would trigger :func:`sys.displayhook` calls.
2589 # Instead, we store the exit_code in user_ns.
2589 # Instead, we store the exit_code in user_ns.
2590 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2590 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2591
2591
2592 def system_raw(self, cmd):
2592 def system_raw(self, cmd):
2593 """Call the given cmd in a subprocess using os.system on Windows or
2593 """Call the given cmd in a subprocess using os.system on Windows or
2594 subprocess.call using the system shell on other platforms.
2594 subprocess.call using the system shell on other platforms.
2595
2595
2596 Parameters
2596 Parameters
2597 ----------
2597 ----------
2598 cmd : str
2598 cmd : str
2599 Command to execute.
2599 Command to execute.
2600 """
2600 """
2601 cmd = self.var_expand(cmd, depth=1)
2601 cmd = self.var_expand(cmd, depth=1)
2602 # warn if there is an IPython magic alternative.
2602 # warn if there is an IPython magic alternative.
2603 main_cmd = cmd.split()[0]
2603 main_cmd = cmd.split()[0]
2604 has_magic_alternatives = ("pip", "conda", "cd")
2604 has_magic_alternatives = ("pip", "conda", "cd")
2605
2605
2606 if main_cmd in has_magic_alternatives:
2606 if main_cmd in has_magic_alternatives:
2607 warnings.warn(
2607 warnings.warn(
2608 (
2608 (
2609 "You executed the system command !{0} which may not work "
2609 "You executed the system command !{0} which may not work "
2610 "as expected. Try the IPython magic %{0} instead."
2610 "as expected. Try the IPython magic %{0} instead."
2611 ).format(main_cmd)
2611 ).format(main_cmd)
2612 )
2612 )
2613
2613
2614 # protect os.system from UNC paths on Windows, which it can't handle:
2614 # protect os.system from UNC paths on Windows, which it can't handle:
2615 if sys.platform == 'win32':
2615 if sys.platform == 'win32':
2616 from IPython.utils._process_win32 import AvoidUNCPath
2616 from IPython.utils._process_win32 import AvoidUNCPath
2617 with AvoidUNCPath() as path:
2617 with AvoidUNCPath() as path:
2618 if path is not None:
2618 if path is not None:
2619 cmd = '"pushd %s &&"%s' % (path, cmd)
2619 cmd = '"pushd %s &&"%s' % (path, cmd)
2620 try:
2620 try:
2621 ec = os.system(cmd)
2621 ec = os.system(cmd)
2622 except KeyboardInterrupt:
2622 except KeyboardInterrupt:
2623 print('\n' + self.get_exception_only(), file=sys.stderr)
2623 print('\n' + self.get_exception_only(), file=sys.stderr)
2624 ec = -2
2624 ec = -2
2625 else:
2625 else:
2626 # For posix the result of the subprocess.call() below is an exit
2626 # For posix the result of the subprocess.call() below is an exit
2627 # code, which by convention is zero for success, positive for
2627 # code, which by convention is zero for success, positive for
2628 # program failure. Exit codes above 128 are reserved for signals,
2628 # program failure. Exit codes above 128 are reserved for signals,
2629 # and the formula for converting a signal to an exit code is usually
2629 # and the formula for converting a signal to an exit code is usually
2630 # signal_number+128. To more easily differentiate between exit
2630 # signal_number+128. To more easily differentiate between exit
2631 # codes and signals, ipython uses negative numbers. For instance
2631 # codes and signals, ipython uses negative numbers. For instance
2632 # since control-c is signal 2 but exit code 130, ipython's
2632 # since control-c is signal 2 but exit code 130, ipython's
2633 # _exit_code variable will read -2. Note that some shells like
2633 # _exit_code variable will read -2. Note that some shells like
2634 # csh and fish don't follow sh/bash conventions for exit codes.
2634 # csh and fish don't follow sh/bash conventions for exit codes.
2635 executable = os.environ.get('SHELL', None)
2635 executable = os.environ.get('SHELL', None)
2636 try:
2636 try:
2637 # Use env shell instead of default /bin/sh
2637 # Use env shell instead of default /bin/sh
2638 ec = subprocess.call(cmd, shell=True, executable=executable)
2638 ec = subprocess.call(cmd, shell=True, executable=executable)
2639 except KeyboardInterrupt:
2639 except KeyboardInterrupt:
2640 # intercept control-C; a long traceback is not useful here
2640 # intercept control-C; a long traceback is not useful here
2641 print('\n' + self.get_exception_only(), file=sys.stderr)
2641 print('\n' + self.get_exception_only(), file=sys.stderr)
2642 ec = 130
2642 ec = 130
2643 if ec > 128:
2643 if ec > 128:
2644 ec = -(ec - 128)
2644 ec = -(ec - 128)
2645
2645
2646 # We explicitly do NOT return the subprocess status code, because
2646 # We explicitly do NOT return the subprocess status code, because
2647 # a non-None value would trigger :func:`sys.displayhook` calls.
2647 # a non-None value would trigger :func:`sys.displayhook` calls.
2648 # Instead, we store the exit_code in user_ns. Note the semantics
2648 # Instead, we store the exit_code in user_ns. Note the semantics
2649 # of _exit_code: for control-c, _exit_code == -signal.SIGNIT,
2649 # of _exit_code: for control-c, _exit_code == -signal.SIGNIT,
2650 # but raising SystemExit(_exit_code) will give status 254!
2650 # but raising SystemExit(_exit_code) will give status 254!
2651 self.user_ns['_exit_code'] = ec
2651 self.user_ns['_exit_code'] = ec
2652
2652
2653 # use piped system by default, because it is better behaved
2653 # use piped system by default, because it is better behaved
2654 system = system_piped
2654 system = system_piped
2655
2655
2656 def getoutput(self, cmd, split=True, depth=0):
2656 def getoutput(self, cmd, split=True, depth=0):
2657 """Get output (possibly including stderr) from a subprocess.
2657 """Get output (possibly including stderr) from a subprocess.
2658
2658
2659 Parameters
2659 Parameters
2660 ----------
2660 ----------
2661 cmd : str
2661 cmd : str
2662 Command to execute (can not end in '&', as background processes are
2662 Command to execute (can not end in '&', as background processes are
2663 not supported.
2663 not supported.
2664 split : bool, optional
2664 split : bool, optional
2665 If True, split the output into an IPython SList. Otherwise, an
2665 If True, split the output into an IPython SList. Otherwise, an
2666 IPython LSString is returned. These are objects similar to normal
2666 IPython LSString is returned. These are objects similar to normal
2667 lists and strings, with a few convenience attributes for easier
2667 lists and strings, with a few convenience attributes for easier
2668 manipulation of line-based output. You can use '?' on them for
2668 manipulation of line-based output. You can use '?' on them for
2669 details.
2669 details.
2670 depth : int, optional
2670 depth : int, optional
2671 How many frames above the caller are the local variables which should
2671 How many frames above the caller are the local variables which should
2672 be expanded in the command string? The default (0) assumes that the
2672 be expanded in the command string? The default (0) assumes that the
2673 expansion variables are in the stack frame calling this function.
2673 expansion variables are in the stack frame calling this function.
2674 """
2674 """
2675 if cmd.rstrip().endswith('&'):
2675 if cmd.rstrip().endswith('&'):
2676 # this is *far* from a rigorous test
2676 # this is *far* from a rigorous test
2677 raise OSError("Background processes not supported.")
2677 raise OSError("Background processes not supported.")
2678 out = getoutput(self.var_expand(cmd, depth=depth+1))
2678 out = getoutput(self.var_expand(cmd, depth=depth+1))
2679 if split:
2679 if split:
2680 out = SList(out.splitlines())
2680 out = SList(out.splitlines())
2681 else:
2681 else:
2682 out = LSString(out)
2682 out = LSString(out)
2683 return out
2683 return out
2684
2684
2685 #-------------------------------------------------------------------------
2685 #-------------------------------------------------------------------------
2686 # Things related to aliases
2686 # Things related to aliases
2687 #-------------------------------------------------------------------------
2687 #-------------------------------------------------------------------------
2688
2688
2689 def init_alias(self):
2689 def init_alias(self):
2690 self.alias_manager = AliasManager(shell=self, parent=self)
2690 self.alias_manager = AliasManager(shell=self, parent=self)
2691 self.configurables.append(self.alias_manager)
2691 self.configurables.append(self.alias_manager)
2692
2692
2693 #-------------------------------------------------------------------------
2693 #-------------------------------------------------------------------------
2694 # Things related to extensions
2694 # Things related to extensions
2695 #-------------------------------------------------------------------------
2695 #-------------------------------------------------------------------------
2696
2696
2697 def init_extension_manager(self):
2697 def init_extension_manager(self):
2698 self.extension_manager = ExtensionManager(shell=self, parent=self)
2698 self.extension_manager = ExtensionManager(shell=self, parent=self)
2699 self.configurables.append(self.extension_manager)
2699 self.configurables.append(self.extension_manager)
2700
2700
2701 #-------------------------------------------------------------------------
2701 #-------------------------------------------------------------------------
2702 # Things related to payloads
2702 # Things related to payloads
2703 #-------------------------------------------------------------------------
2703 #-------------------------------------------------------------------------
2704
2704
2705 def init_payload(self):
2705 def init_payload(self):
2706 self.payload_manager = PayloadManager(parent=self)
2706 self.payload_manager = PayloadManager(parent=self)
2707 self.configurables.append(self.payload_manager)
2707 self.configurables.append(self.payload_manager)
2708
2708
2709 #-------------------------------------------------------------------------
2709 #-------------------------------------------------------------------------
2710 # Things related to the prefilter
2710 # Things related to the prefilter
2711 #-------------------------------------------------------------------------
2711 #-------------------------------------------------------------------------
2712
2712
2713 def init_prefilter(self):
2713 def init_prefilter(self):
2714 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2714 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2715 self.configurables.append(self.prefilter_manager)
2715 self.configurables.append(self.prefilter_manager)
2716 # Ultimately this will be refactored in the new interpreter code, but
2716 # Ultimately this will be refactored in the new interpreter code, but
2717 # for now, we should expose the main prefilter method (there's legacy
2717 # for now, we should expose the main prefilter method (there's legacy
2718 # code out there that may rely on this).
2718 # code out there that may rely on this).
2719 self.prefilter = self.prefilter_manager.prefilter_lines
2719 self.prefilter = self.prefilter_manager.prefilter_lines
2720
2720
2721 def auto_rewrite_input(self, cmd):
2721 def auto_rewrite_input(self, cmd):
2722 """Print to the screen the rewritten form of the user's command.
2722 """Print to the screen the rewritten form of the user's command.
2723
2723
2724 This shows visual feedback by rewriting input lines that cause
2724 This shows visual feedback by rewriting input lines that cause
2725 automatic calling to kick in, like::
2725 automatic calling to kick in, like::
2726
2726
2727 /f x
2727 /f x
2728
2728
2729 into::
2729 into::
2730
2730
2731 ------> f(x)
2731 ------> f(x)
2732
2732
2733 after the user's input prompt. This helps the user understand that the
2733 after the user's input prompt. This helps the user understand that the
2734 input line was transformed automatically by IPython.
2734 input line was transformed automatically by IPython.
2735 """
2735 """
2736 if not self.show_rewritten_input:
2736 if not self.show_rewritten_input:
2737 return
2737 return
2738
2738
2739 # This is overridden in TerminalInteractiveShell to use fancy prompts
2739 # This is overridden in TerminalInteractiveShell to use fancy prompts
2740 print("------> " + cmd)
2740 print("------> " + cmd)
2741
2741
2742 #-------------------------------------------------------------------------
2742 #-------------------------------------------------------------------------
2743 # Things related to extracting values/expressions from kernel and user_ns
2743 # Things related to extracting values/expressions from kernel and user_ns
2744 #-------------------------------------------------------------------------
2744 #-------------------------------------------------------------------------
2745
2745
2746 def _user_obj_error(self):
2746 def _user_obj_error(self):
2747 """return simple exception dict
2747 """return simple exception dict
2748
2748
2749 for use in user_expressions
2749 for use in user_expressions
2750 """
2750 """
2751
2751
2752 etype, evalue, tb = self._get_exc_info()
2752 etype, evalue, tb = self._get_exc_info()
2753 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2753 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2754
2754
2755 exc_info = {
2755 exc_info = {
2756 "status": "error",
2756 "status": "error",
2757 "traceback": stb,
2757 "traceback": stb,
2758 "ename": etype.__name__,
2758 "ename": etype.__name__,
2759 "evalue": py3compat.safe_unicode(evalue),
2759 "evalue": py3compat.safe_unicode(evalue),
2760 }
2760 }
2761
2761
2762 return exc_info
2762 return exc_info
2763
2763
2764 def _format_user_obj(self, obj):
2764 def _format_user_obj(self, obj):
2765 """format a user object to display dict
2765 """format a user object to display dict
2766
2766
2767 for use in user_expressions
2767 for use in user_expressions
2768 """
2768 """
2769
2769
2770 data, md = self.display_formatter.format(obj)
2770 data, md = self.display_formatter.format(obj)
2771 value = {
2771 value = {
2772 'status' : 'ok',
2772 'status' : 'ok',
2773 'data' : data,
2773 'data' : data,
2774 'metadata' : md,
2774 'metadata' : md,
2775 }
2775 }
2776 return value
2776 return value
2777
2777
2778 def user_expressions(self, expressions):
2778 def user_expressions(self, expressions):
2779 """Evaluate a dict of expressions in the user's namespace.
2779 """Evaluate a dict of expressions in the user's namespace.
2780
2780
2781 Parameters
2781 Parameters
2782 ----------
2782 ----------
2783 expressions : dict
2783 expressions : dict
2784 A dict with string keys and string values. The expression values
2784 A dict with string keys and string values. The expression values
2785 should be valid Python expressions, each of which will be evaluated
2785 should be valid Python expressions, each of which will be evaluated
2786 in the user namespace.
2786 in the user namespace.
2787
2787
2788 Returns
2788 Returns
2789 -------
2789 -------
2790 A dict, keyed like the input expressions dict, with the rich mime-typed
2790 A dict, keyed like the input expressions dict, with the rich mime-typed
2791 display_data of each value.
2791 display_data of each value.
2792 """
2792 """
2793 out = {}
2793 out = {}
2794 user_ns = self.user_ns
2794 user_ns = self.user_ns
2795 global_ns = self.user_global_ns
2795 global_ns = self.user_global_ns
2796
2796
2797 for key, expr in expressions.items():
2797 for key, expr in expressions.items():
2798 try:
2798 try:
2799 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2799 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2800 except:
2800 except:
2801 value = self._user_obj_error()
2801 value = self._user_obj_error()
2802 out[key] = value
2802 out[key] = value
2803 return out
2803 return out
2804
2804
2805 #-------------------------------------------------------------------------
2805 #-------------------------------------------------------------------------
2806 # Things related to the running of code
2806 # Things related to the running of code
2807 #-------------------------------------------------------------------------
2807 #-------------------------------------------------------------------------
2808
2808
2809 def ex(self, cmd):
2809 def ex(self, cmd):
2810 """Execute a normal python statement in user namespace."""
2810 """Execute a normal python statement in user namespace."""
2811 with self.builtin_trap:
2811 with self.builtin_trap:
2812 exec(cmd, self.user_global_ns, self.user_ns)
2812 exec(cmd, self.user_global_ns, self.user_ns)
2813
2813
2814 def ev(self, expr):
2814 def ev(self, expr):
2815 """Evaluate python expression expr in user namespace.
2815 """Evaluate python expression expr in user namespace.
2816
2816
2817 Returns the result of evaluation
2817 Returns the result of evaluation
2818 """
2818 """
2819 with self.builtin_trap:
2819 with self.builtin_trap:
2820 return eval(expr, self.user_global_ns, self.user_ns)
2820 return eval(expr, self.user_global_ns, self.user_ns)
2821
2821
2822 def safe_execfile(self, fname, *where, exit_ignore=False, raise_exceptions=False, shell_futures=False):
2822 def safe_execfile(self, fname, *where, exit_ignore=False, raise_exceptions=False, shell_futures=False):
2823 """A safe version of the builtin execfile().
2823 """A safe version of the builtin execfile().
2824
2824
2825 This version will never throw an exception, but instead print
2825 This version will never throw an exception, but instead print
2826 helpful error messages to the screen. This only works on pure
2826 helpful error messages to the screen. This only works on pure
2827 Python files with the .py extension.
2827 Python files with the .py extension.
2828
2828
2829 Parameters
2829 Parameters
2830 ----------
2830 ----------
2831 fname : string
2831 fname : string
2832 The name of the file to be executed.
2832 The name of the file to be executed.
2833 *where : tuple
2833 *where : tuple
2834 One or two namespaces, passed to execfile() as (globals,locals).
2834 One or two namespaces, passed to execfile() as (globals,locals).
2835 If only one is given, it is passed as both.
2835 If only one is given, it is passed as both.
2836 exit_ignore : bool (False)
2836 exit_ignore : bool (False)
2837 If True, then silence SystemExit for non-zero status (it is always
2837 If True, then silence SystemExit for non-zero status (it is always
2838 silenced for zero status, as it is so common).
2838 silenced for zero status, as it is so common).
2839 raise_exceptions : bool (False)
2839 raise_exceptions : bool (False)
2840 If True raise exceptions everywhere. Meant for testing.
2840 If True raise exceptions everywhere. Meant for testing.
2841 shell_futures : bool (False)
2841 shell_futures : bool (False)
2842 If True, the code will share future statements with the interactive
2842 If True, the code will share future statements with the interactive
2843 shell. It will both be affected by previous __future__ imports, and
2843 shell. It will both be affected by previous __future__ imports, and
2844 any __future__ imports in the code will affect the shell. If False,
2844 any __future__ imports in the code will affect the shell. If False,
2845 __future__ imports are not shared in either direction.
2845 __future__ imports are not shared in either direction.
2846
2846
2847 """
2847 """
2848 fname = Path(fname).expanduser().resolve()
2848 fname = Path(fname).expanduser().resolve()
2849
2849
2850 # Make sure we can open the file
2850 # Make sure we can open the file
2851 try:
2851 try:
2852 with fname.open("rb"):
2852 with fname.open("rb"):
2853 pass
2853 pass
2854 except:
2854 except:
2855 warn('Could not open file <%s> for safe execution.' % fname)
2855 warn('Could not open file <%s> for safe execution.' % fname)
2856 return
2856 return
2857
2857
2858 # Find things also in current directory. This is needed to mimic the
2858 # Find things also in current directory. This is needed to mimic the
2859 # behavior of running a script from the system command line, where
2859 # behavior of running a script from the system command line, where
2860 # Python inserts the script's directory into sys.path
2860 # Python inserts the script's directory into sys.path
2861 dname = str(fname.parent)
2861 dname = str(fname.parent)
2862
2862
2863 with prepended_to_syspath(dname), self.builtin_trap:
2863 with prepended_to_syspath(dname), self.builtin_trap:
2864 try:
2864 try:
2865 glob, loc = (where + (None, ))[:2]
2865 glob, loc = (where + (None, ))[:2]
2866 py3compat.execfile(
2866 py3compat.execfile(
2867 fname, glob, loc,
2867 fname, glob, loc,
2868 self.compile if shell_futures else None)
2868 self.compile if shell_futures else None)
2869 except SystemExit as status:
2869 except SystemExit as status:
2870 # If the call was made with 0 or None exit status (sys.exit(0)
2870 # If the call was made with 0 or None exit status (sys.exit(0)
2871 # or sys.exit() ), don't bother showing a traceback, as both of
2871 # or sys.exit() ), don't bother showing a traceback, as both of
2872 # these are considered normal by the OS:
2872 # these are considered normal by the OS:
2873 # > python -c'import sys;sys.exit(0)'; echo $?
2873 # > python -c'import sys;sys.exit(0)'; echo $?
2874 # 0
2874 # 0
2875 # > python -c'import sys;sys.exit()'; echo $?
2875 # > python -c'import sys;sys.exit()'; echo $?
2876 # 0
2876 # 0
2877 # For other exit status, we show the exception unless
2877 # For other exit status, we show the exception unless
2878 # explicitly silenced, but only in short form.
2878 # explicitly silenced, but only in short form.
2879 if status.code:
2879 if status.code:
2880 if raise_exceptions:
2880 if raise_exceptions:
2881 raise
2881 raise
2882 if not exit_ignore:
2882 if not exit_ignore:
2883 self.showtraceback(exception_only=True)
2883 self.showtraceback(exception_only=True)
2884 except:
2884 except:
2885 if raise_exceptions:
2885 if raise_exceptions:
2886 raise
2886 raise
2887 # tb offset is 2 because we wrap execfile
2887 # tb offset is 2 because we wrap execfile
2888 self.showtraceback(tb_offset=2)
2888 self.showtraceback(tb_offset=2)
2889
2889
2890 def safe_execfile_ipy(self, fname, shell_futures=False, raise_exceptions=False):
2890 def safe_execfile_ipy(self, fname, shell_futures=False, raise_exceptions=False):
2891 """Like safe_execfile, but for .ipy or .ipynb files with IPython syntax.
2891 """Like safe_execfile, but for .ipy or .ipynb files with IPython syntax.
2892
2892
2893 Parameters
2893 Parameters
2894 ----------
2894 ----------
2895 fname : str
2895 fname : str
2896 The name of the file to execute. The filename must have a
2896 The name of the file to execute. The filename must have a
2897 .ipy or .ipynb extension.
2897 .ipy or .ipynb extension.
2898 shell_futures : bool (False)
2898 shell_futures : bool (False)
2899 If True, the code will share future statements with the interactive
2899 If True, the code will share future statements with the interactive
2900 shell. It will both be affected by previous __future__ imports, and
2900 shell. It will both be affected by previous __future__ imports, and
2901 any __future__ imports in the code will affect the shell. If False,
2901 any __future__ imports in the code will affect the shell. If False,
2902 __future__ imports are not shared in either direction.
2902 __future__ imports are not shared in either direction.
2903 raise_exceptions : bool (False)
2903 raise_exceptions : bool (False)
2904 If True raise exceptions everywhere. Meant for testing.
2904 If True raise exceptions everywhere. Meant for testing.
2905 """
2905 """
2906 fname = Path(fname).expanduser().resolve()
2906 fname = Path(fname).expanduser().resolve()
2907
2907
2908 # Make sure we can open the file
2908 # Make sure we can open the file
2909 try:
2909 try:
2910 with fname.open("rb"):
2910 with fname.open("rb"):
2911 pass
2911 pass
2912 except:
2912 except:
2913 warn('Could not open file <%s> for safe execution.' % fname)
2913 warn('Could not open file <%s> for safe execution.' % fname)
2914 return
2914 return
2915
2915
2916 # Find things also in current directory. This is needed to mimic the
2916 # Find things also in current directory. This is needed to mimic the
2917 # behavior of running a script from the system command line, where
2917 # behavior of running a script from the system command line, where
2918 # Python inserts the script's directory into sys.path
2918 # Python inserts the script's directory into sys.path
2919 dname = str(fname.parent)
2919 dname = str(fname.parent)
2920
2920
2921 def get_cells():
2921 def get_cells():
2922 """generator for sequence of code blocks to run"""
2922 """generator for sequence of code blocks to run"""
2923 if fname.suffix == ".ipynb":
2923 if fname.suffix == ".ipynb":
2924 from nbformat import read
2924 from nbformat import read
2925 nb = read(fname, as_version=4)
2925 nb = read(fname, as_version=4)
2926 if not nb.cells:
2926 if not nb.cells:
2927 return
2927 return
2928 for cell in nb.cells:
2928 for cell in nb.cells:
2929 if cell.cell_type == 'code':
2929 if cell.cell_type == 'code':
2930 yield cell.source
2930 yield cell.source
2931 else:
2931 else:
2932 yield fname.read_text(encoding="utf-8")
2932 yield fname.read_text(encoding="utf-8")
2933
2933
2934 with prepended_to_syspath(dname):
2934 with prepended_to_syspath(dname):
2935 try:
2935 try:
2936 for cell in get_cells():
2936 for cell in get_cells():
2937 result = self.run_cell(cell, silent=True, shell_futures=shell_futures)
2937 result = self.run_cell(cell, silent=True, shell_futures=shell_futures)
2938 if raise_exceptions:
2938 if raise_exceptions:
2939 result.raise_error()
2939 result.raise_error()
2940 elif not result.success:
2940 elif not result.success:
2941 break
2941 break
2942 except:
2942 except:
2943 if raise_exceptions:
2943 if raise_exceptions:
2944 raise
2944 raise
2945 self.showtraceback()
2945 self.showtraceback()
2946 warn('Unknown failure executing file: <%s>' % fname)
2946 warn('Unknown failure executing file: <%s>' % fname)
2947
2947
2948 def safe_run_module(self, mod_name, where):
2948 def safe_run_module(self, mod_name, where):
2949 """A safe version of runpy.run_module().
2949 """A safe version of runpy.run_module().
2950
2950
2951 This version will never throw an exception, but instead print
2951 This version will never throw an exception, but instead print
2952 helpful error messages to the screen.
2952 helpful error messages to the screen.
2953
2953
2954 `SystemExit` exceptions with status code 0 or None are ignored.
2954 `SystemExit` exceptions with status code 0 or None are ignored.
2955
2955
2956 Parameters
2956 Parameters
2957 ----------
2957 ----------
2958 mod_name : string
2958 mod_name : string
2959 The name of the module to be executed.
2959 The name of the module to be executed.
2960 where : dict
2960 where : dict
2961 The globals namespace.
2961 The globals namespace.
2962 """
2962 """
2963 try:
2963 try:
2964 try:
2964 try:
2965 where.update(
2965 where.update(
2966 runpy.run_module(str(mod_name), run_name="__main__",
2966 runpy.run_module(str(mod_name), run_name="__main__",
2967 alter_sys=True)
2967 alter_sys=True)
2968 )
2968 )
2969 except SystemExit as status:
2969 except SystemExit as status:
2970 if status.code:
2970 if status.code:
2971 raise
2971 raise
2972 except:
2972 except:
2973 self.showtraceback()
2973 self.showtraceback()
2974 warn('Unknown failure executing module: <%s>' % mod_name)
2974 warn('Unknown failure executing module: <%s>' % mod_name)
2975
2975
2976 def run_cell(
2976 def run_cell(
2977 self,
2977 self,
2978 raw_cell,
2978 raw_cell,
2979 store_history=False,
2979 store_history=False,
2980 silent=False,
2980 silent=False,
2981 shell_futures=True,
2981 shell_futures=True,
2982 cell_id=None,
2982 cell_id=None,
2983 ):
2983 ):
2984 """Run a complete IPython cell.
2984 """Run a complete IPython cell.
2985
2985
2986 Parameters
2986 Parameters
2987 ----------
2987 ----------
2988 raw_cell : str
2988 raw_cell : str
2989 The code (including IPython code such as %magic functions) to run.
2989 The code (including IPython code such as %magic functions) to run.
2990 store_history : bool
2990 store_history : bool
2991 If True, the raw and translated cell will be stored in IPython's
2991 If True, the raw and translated cell will be stored in IPython's
2992 history. For user code calling back into IPython's machinery, this
2992 history. For user code calling back into IPython's machinery, this
2993 should be set to False.
2993 should be set to False.
2994 silent : bool
2994 silent : bool
2995 If True, avoid side-effects, such as implicit displayhooks and
2995 If True, avoid side-effects, such as implicit displayhooks and
2996 and logging. silent=True forces store_history=False.
2996 and logging. silent=True forces store_history=False.
2997 shell_futures : bool
2997 shell_futures : bool
2998 If True, the code will share future statements with the interactive
2998 If True, the code will share future statements with the interactive
2999 shell. It will both be affected by previous __future__ imports, and
2999 shell. It will both be affected by previous __future__ imports, and
3000 any __future__ imports in the code will affect the shell. If False,
3000 any __future__ imports in the code will affect the shell. If False,
3001 __future__ imports are not shared in either direction.
3001 __future__ imports are not shared in either direction.
3002
3002
3003 Returns
3003 Returns
3004 -------
3004 -------
3005 result : :class:`ExecutionResult`
3005 result : :class:`ExecutionResult`
3006 """
3006 """
3007 result = None
3007 result = None
3008 try:
3008 try:
3009 result = self._run_cell(
3009 result = self._run_cell(
3010 raw_cell, store_history, silent, shell_futures, cell_id
3010 raw_cell, store_history, silent, shell_futures, cell_id
3011 )
3011 )
3012 finally:
3012 finally:
3013 self.events.trigger('post_execute')
3013 self.events.trigger('post_execute')
3014 if not silent:
3014 if not silent:
3015 self.events.trigger('post_run_cell', result)
3015 self.events.trigger('post_run_cell', result)
3016 return result
3016 return result
3017
3017
3018 def _run_cell(
3018 def _run_cell(
3019 self,
3019 self,
3020 raw_cell: str,
3020 raw_cell: str,
3021 store_history: bool,
3021 store_history: bool,
3022 silent: bool,
3022 silent: bool,
3023 shell_futures: bool,
3023 shell_futures: bool,
3024 cell_id: str,
3024 cell_id: str,
3025 ) -> ExecutionResult:
3025 ) -> ExecutionResult:
3026 """Internal method to run a complete IPython cell."""
3026 """Internal method to run a complete IPython cell."""
3027
3027
3028 # we need to avoid calling self.transform_cell multiple time on the same thing
3028 # we need to avoid calling self.transform_cell multiple time on the same thing
3029 # so we need to store some results:
3029 # so we need to store some results:
3030 preprocessing_exc_tuple = None
3030 preprocessing_exc_tuple = None
3031 try:
3031 try:
3032 transformed_cell = self.transform_cell(raw_cell)
3032 transformed_cell = self.transform_cell(raw_cell)
3033 except Exception:
3033 except Exception:
3034 transformed_cell = raw_cell
3034 transformed_cell = raw_cell
3035 preprocessing_exc_tuple = sys.exc_info()
3035 preprocessing_exc_tuple = sys.exc_info()
3036
3036
3037 assert transformed_cell is not None
3037 assert transformed_cell is not None
3038 coro = self.run_cell_async(
3038 coro = self.run_cell_async(
3039 raw_cell,
3039 raw_cell,
3040 store_history=store_history,
3040 store_history=store_history,
3041 silent=silent,
3041 silent=silent,
3042 shell_futures=shell_futures,
3042 shell_futures=shell_futures,
3043 transformed_cell=transformed_cell,
3043 transformed_cell=transformed_cell,
3044 preprocessing_exc_tuple=preprocessing_exc_tuple,
3044 preprocessing_exc_tuple=preprocessing_exc_tuple,
3045 cell_id=cell_id,
3045 cell_id=cell_id,
3046 )
3046 )
3047
3047
3048 # run_cell_async is async, but may not actually need an eventloop.
3048 # run_cell_async is async, but may not actually need an eventloop.
3049 # when this is the case, we want to run it using the pseudo_sync_runner
3049 # when this is the case, we want to run it using the pseudo_sync_runner
3050 # so that code can invoke eventloops (for example via the %run , and
3050 # so that code can invoke eventloops (for example via the %run , and
3051 # `%paste` magic.
3051 # `%paste` magic.
3052 if self.trio_runner:
3052 if self.trio_runner:
3053 runner = self.trio_runner
3053 runner = self.trio_runner
3054 elif self.should_run_async(
3054 elif self.should_run_async(
3055 raw_cell,
3055 raw_cell,
3056 transformed_cell=transformed_cell,
3056 transformed_cell=transformed_cell,
3057 preprocessing_exc_tuple=preprocessing_exc_tuple,
3057 preprocessing_exc_tuple=preprocessing_exc_tuple,
3058 ):
3058 ):
3059 runner = self.loop_runner
3059 runner = self.loop_runner
3060 else:
3060 else:
3061 runner = _pseudo_sync_runner
3061 runner = _pseudo_sync_runner
3062
3062
3063 try:
3063 try:
3064 result = runner(coro)
3064 result = runner(coro)
3065 except BaseException as e:
3065 except BaseException as e:
3066 info = ExecutionInfo(
3066 info = ExecutionInfo(
3067 raw_cell, store_history, silent, shell_futures, cell_id
3067 raw_cell, store_history, silent, shell_futures, cell_id
3068 )
3068 )
3069 result = ExecutionResult(info)
3069 result = ExecutionResult(info)
3070 result.error_in_exec = e
3070 result.error_in_exec = e
3071 self.showtraceback(running_compiled_code=True)
3071 self.showtraceback(running_compiled_code=True)
3072 finally:
3072 finally:
3073 return result
3073 return result
3074
3074
3075 def should_run_async(
3075 def should_run_async(
3076 self, raw_cell: str, *, transformed_cell=None, preprocessing_exc_tuple=None
3076 self, raw_cell: str, *, transformed_cell=None, preprocessing_exc_tuple=None
3077 ) -> bool:
3077 ) -> bool:
3078 """Return whether a cell should be run asynchronously via a coroutine runner
3078 """Return whether a cell should be run asynchronously via a coroutine runner
3079
3079
3080 Parameters
3080 Parameters
3081 ----------
3081 ----------
3082 raw_cell : str
3082 raw_cell : str
3083 The code to be executed
3083 The code to be executed
3084
3084
3085 Returns
3085 Returns
3086 -------
3086 -------
3087 result: bool
3087 result: bool
3088 Whether the code needs to be run with a coroutine runner or not
3088 Whether the code needs to be run with a coroutine runner or not
3089 .. versionadded:: 7.0
3089 .. versionadded:: 7.0
3090 """
3090 """
3091 if not self.autoawait:
3091 if not self.autoawait:
3092 return False
3092 return False
3093 if preprocessing_exc_tuple is not None:
3093 if preprocessing_exc_tuple is not None:
3094 return False
3094 return False
3095 assert preprocessing_exc_tuple is None
3095 assert preprocessing_exc_tuple is None
3096 if transformed_cell is None:
3096 if transformed_cell is None:
3097 warnings.warn(
3097 warnings.warn(
3098 "`should_run_async` will not call `transform_cell`"
3098 "`should_run_async` will not call `transform_cell`"
3099 " automatically in the future. Please pass the result to"
3099 " automatically in the future. Please pass the result to"
3100 " `transformed_cell` argument and any exception that happen"
3100 " `transformed_cell` argument and any exception that happen"
3101 " during the"
3101 " during the"
3102 "transform in `preprocessing_exc_tuple` in"
3102 "transform in `preprocessing_exc_tuple` in"
3103 " IPython 7.17 and above.",
3103 " IPython 7.17 and above.",
3104 DeprecationWarning,
3104 DeprecationWarning,
3105 stacklevel=2,
3105 stacklevel=2,
3106 )
3106 )
3107 try:
3107 try:
3108 cell = self.transform_cell(raw_cell)
3108 cell = self.transform_cell(raw_cell)
3109 except Exception:
3109 except Exception:
3110 # any exception during transform will be raised
3110 # any exception during transform will be raised
3111 # prior to execution
3111 # prior to execution
3112 return False
3112 return False
3113 else:
3113 else:
3114 cell = transformed_cell
3114 cell = transformed_cell
3115 return _should_be_async(cell)
3115 return _should_be_async(cell)
3116
3116
3117 async def run_cell_async(
3117 async def run_cell_async(
3118 self,
3118 self,
3119 raw_cell: str,
3119 raw_cell: str,
3120 store_history=False,
3120 store_history=False,
3121 silent=False,
3121 silent=False,
3122 shell_futures=True,
3122 shell_futures=True,
3123 *,
3123 *,
3124 transformed_cell: Optional[str] = None,
3124 transformed_cell: Optional[str] = None,
3125 preprocessing_exc_tuple: Optional[AnyType] = None,
3125 preprocessing_exc_tuple: Optional[AnyType] = None,
3126 cell_id=None,
3126 cell_id=None,
3127 ) -> ExecutionResult:
3127 ) -> ExecutionResult:
3128 """Run a complete IPython cell asynchronously.
3128 """Run a complete IPython cell asynchronously.
3129
3129
3130 Parameters
3130 Parameters
3131 ----------
3131 ----------
3132 raw_cell : str
3132 raw_cell : str
3133 The code (including IPython code such as %magic functions) to run.
3133 The code (including IPython code such as %magic functions) to run.
3134 store_history : bool
3134 store_history : bool
3135 If True, the raw and translated cell will be stored in IPython's
3135 If True, the raw and translated cell will be stored in IPython's
3136 history. For user code calling back into IPython's machinery, this
3136 history. For user code calling back into IPython's machinery, this
3137 should be set to False.
3137 should be set to False.
3138 silent : bool
3138 silent : bool
3139 If True, avoid side-effects, such as implicit displayhooks and
3139 If True, avoid side-effects, such as implicit displayhooks and
3140 and logging. silent=True forces store_history=False.
3140 and logging. silent=True forces store_history=False.
3141 shell_futures : bool
3141 shell_futures : bool
3142 If True, the code will share future statements with the interactive
3142 If True, the code will share future statements with the interactive
3143 shell. It will both be affected by previous __future__ imports, and
3143 shell. It will both be affected by previous __future__ imports, and
3144 any __future__ imports in the code will affect the shell. If False,
3144 any __future__ imports in the code will affect the shell. If False,
3145 __future__ imports are not shared in either direction.
3145 __future__ imports are not shared in either direction.
3146 transformed_cell: str
3146 transformed_cell: str
3147 cell that was passed through transformers
3147 cell that was passed through transformers
3148 preprocessing_exc_tuple:
3148 preprocessing_exc_tuple:
3149 trace if the transformation failed.
3149 trace if the transformation failed.
3150
3150
3151 Returns
3151 Returns
3152 -------
3152 -------
3153 result : :class:`ExecutionResult`
3153 result : :class:`ExecutionResult`
3154
3154
3155 .. versionadded:: 7.0
3155 .. versionadded:: 7.0
3156 """
3156 """
3157 info = ExecutionInfo(raw_cell, store_history, silent, shell_futures, cell_id)
3157 info = ExecutionInfo(raw_cell, store_history, silent, shell_futures, cell_id)
3158 result = ExecutionResult(info)
3158 result = ExecutionResult(info)
3159
3159
3160 if (not raw_cell) or raw_cell.isspace():
3160 if (not raw_cell) or raw_cell.isspace():
3161 self.last_execution_succeeded = True
3161 self.last_execution_succeeded = True
3162 self.last_execution_result = result
3162 self.last_execution_result = result
3163 return result
3163 return result
3164
3164
3165 if silent:
3165 if silent:
3166 store_history = False
3166 store_history = False
3167
3167
3168 if store_history:
3168 if store_history:
3169 result.execution_count = self.execution_count
3169 result.execution_count = self.execution_count
3170
3170
3171 def error_before_exec(value):
3171 def error_before_exec(value):
3172 if store_history:
3172 if store_history:
3173 self.execution_count += 1
3173 self.execution_count += 1
3174 result.error_before_exec = value
3174 result.error_before_exec = value
3175 self.last_execution_succeeded = False
3175 self.last_execution_succeeded = False
3176 self.last_execution_result = result
3176 self.last_execution_result = result
3177 return result
3177 return result
3178
3178
3179 self.events.trigger('pre_execute')
3179 self.events.trigger('pre_execute')
3180 if not silent:
3180 if not silent:
3181 self.events.trigger('pre_run_cell', info)
3181 self.events.trigger('pre_run_cell', info)
3182
3182
3183 if transformed_cell is None:
3183 if transformed_cell is None:
3184 warnings.warn(
3184 warnings.warn(
3185 "`run_cell_async` will not call `transform_cell`"
3185 "`run_cell_async` will not call `transform_cell`"
3186 " automatically in the future. Please pass the result to"
3186 " automatically in the future. Please pass the result to"
3187 " `transformed_cell` argument and any exception that happen"
3187 " `transformed_cell` argument and any exception that happen"
3188 " during the"
3188 " during the"
3189 "transform in `preprocessing_exc_tuple` in"
3189 "transform in `preprocessing_exc_tuple` in"
3190 " IPython 7.17 and above.",
3190 " IPython 7.17 and above.",
3191 DeprecationWarning,
3191 DeprecationWarning,
3192 stacklevel=2,
3192 stacklevel=2,
3193 )
3193 )
3194 # If any of our input transformation (input_transformer_manager or
3194 # If any of our input transformation (input_transformer_manager or
3195 # prefilter_manager) raises an exception, we store it in this variable
3195 # prefilter_manager) raises an exception, we store it in this variable
3196 # so that we can display the error after logging the input and storing
3196 # so that we can display the error after logging the input and storing
3197 # it in the history.
3197 # it in the history.
3198 try:
3198 try:
3199 cell = self.transform_cell(raw_cell)
3199 cell = self.transform_cell(raw_cell)
3200 except Exception:
3200 except Exception:
3201 preprocessing_exc_tuple = sys.exc_info()
3201 preprocessing_exc_tuple = sys.exc_info()
3202 cell = raw_cell # cell has to exist so it can be stored/logged
3202 cell = raw_cell # cell has to exist so it can be stored/logged
3203 else:
3203 else:
3204 preprocessing_exc_tuple = None
3204 preprocessing_exc_tuple = None
3205 else:
3205 else:
3206 if preprocessing_exc_tuple is None:
3206 if preprocessing_exc_tuple is None:
3207 cell = transformed_cell
3207 cell = transformed_cell
3208 else:
3208 else:
3209 cell = raw_cell
3209 cell = raw_cell
3210
3210
3211 # Do NOT store paste/cpaste magic history
3211 # Do NOT store paste/cpaste magic history
3212 if "get_ipython().run_line_magic(" in cell and "paste" in cell:
3212 if "get_ipython().run_line_magic(" in cell and "paste" in cell:
3213 store_history = False
3213 store_history = False
3214
3214
3215 # Store raw and processed history
3215 # Store raw and processed history
3216 if store_history:
3216 if store_history:
3217 self.history_manager.store_inputs(self.execution_count, cell, raw_cell)
3217 self.history_manager.store_inputs(self.execution_count, cell, raw_cell)
3218 if not silent:
3218 if not silent:
3219 self.logger.log(cell, raw_cell)
3219 self.logger.log(cell, raw_cell)
3220
3220
3221 # Display the exception if input processing failed.
3221 # Display the exception if input processing failed.
3222 if preprocessing_exc_tuple is not None:
3222 if preprocessing_exc_tuple is not None:
3223 self.showtraceback(preprocessing_exc_tuple)
3223 self.showtraceback(preprocessing_exc_tuple)
3224 if store_history:
3224 if store_history:
3225 self.execution_count += 1
3225 self.execution_count += 1
3226 return error_before_exec(preprocessing_exc_tuple[1])
3226 return error_before_exec(preprocessing_exc_tuple[1])
3227
3227
3228 # Our own compiler remembers the __future__ environment. If we want to
3228 # Our own compiler remembers the __future__ environment. If we want to
3229 # run code with a separate __future__ environment, use the default
3229 # run code with a separate __future__ environment, use the default
3230 # compiler
3230 # compiler
3231 compiler = self.compile if shell_futures else self.compiler_class()
3231 compiler = self.compile if shell_futures else self.compiler_class()
3232
3232
3233 _run_async = False
3233 _run_async = False
3234
3234
3235 with self.builtin_trap:
3235 with self.builtin_trap:
3236 cell_name = compiler.cache(cell, self.execution_count, raw_code=raw_cell)
3236 cell_name = compiler.cache(cell, self.execution_count, raw_code=raw_cell)
3237
3237
3238 with self.display_trap:
3238 with self.display_trap:
3239 # Compile to bytecode
3239 # Compile to bytecode
3240 try:
3240 try:
3241 code_ast = compiler.ast_parse(cell, filename=cell_name)
3241 code_ast = compiler.ast_parse(cell, filename=cell_name)
3242 except self.custom_exceptions as e:
3242 except self.custom_exceptions as e:
3243 etype, value, tb = sys.exc_info()
3243 etype, value, tb = sys.exc_info()
3244 self.CustomTB(etype, value, tb)
3244 self.CustomTB(etype, value, tb)
3245 return error_before_exec(e)
3245 return error_before_exec(e)
3246 except IndentationError as e:
3246 except IndentationError as e:
3247 self.showindentationerror()
3247 self.showindentationerror()
3248 return error_before_exec(e)
3248 return error_before_exec(e)
3249 except (OverflowError, SyntaxError, ValueError, TypeError,
3249 except (OverflowError, SyntaxError, ValueError, TypeError,
3250 MemoryError) as e:
3250 MemoryError) as e:
3251 self.showsyntaxerror()
3251 self.showsyntaxerror()
3252 return error_before_exec(e)
3252 return error_before_exec(e)
3253
3253
3254 # Apply AST transformations
3254 # Apply AST transformations
3255 try:
3255 try:
3256 code_ast = self.transform_ast(code_ast)
3256 code_ast = self.transform_ast(code_ast)
3257 except InputRejected as e:
3257 except InputRejected as e:
3258 self.showtraceback()
3258 self.showtraceback()
3259 return error_before_exec(e)
3259 return error_before_exec(e)
3260
3260
3261 # Give the displayhook a reference to our ExecutionResult so it
3261 # Give the displayhook a reference to our ExecutionResult so it
3262 # can fill in the output value.
3262 # can fill in the output value.
3263 self.displayhook.exec_result = result
3263 self.displayhook.exec_result = result
3264
3264
3265 # Execute the user code
3265 # Execute the user code
3266 interactivity = "none" if silent else self.ast_node_interactivity
3266 interactivity = "none" if silent else self.ast_node_interactivity
3267
3267
3268
3268
3269 has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
3269 has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
3270 interactivity=interactivity, compiler=compiler, result=result)
3270 interactivity=interactivity, compiler=compiler, result=result)
3271
3271
3272 self.last_execution_succeeded = not has_raised
3272 self.last_execution_succeeded = not has_raised
3273 self.last_execution_result = result
3273 self.last_execution_result = result
3274
3274
3275 # Reset this so later displayed values do not modify the
3275 # Reset this so later displayed values do not modify the
3276 # ExecutionResult
3276 # ExecutionResult
3277 self.displayhook.exec_result = None
3277 self.displayhook.exec_result = None
3278
3278
3279 if store_history:
3279 if store_history:
3280 # Write output to the database. Does nothing unless
3280 # Write output to the database. Does nothing unless
3281 # history output logging is enabled.
3281 # history output logging is enabled.
3282 self.history_manager.store_output(self.execution_count)
3282 self.history_manager.store_output(self.execution_count)
3283 # Each cell is a *single* input, regardless of how many lines it has
3283 # Each cell is a *single* input, regardless of how many lines it has
3284 self.execution_count += 1
3284 self.execution_count += 1
3285
3285
3286 return result
3286 return result
3287
3287
3288 def transform_cell(self, raw_cell):
3288 def transform_cell(self, raw_cell):
3289 """Transform an input cell before parsing it.
3289 """Transform an input cell before parsing it.
3290
3290
3291 Static transformations, implemented in IPython.core.inputtransformer2,
3291 Static transformations, implemented in IPython.core.inputtransformer2,
3292 deal with things like ``%magic`` and ``!system`` commands.
3292 deal with things like ``%magic`` and ``!system`` commands.
3293 These run on all input.
3293 These run on all input.
3294 Dynamic transformations, for things like unescaped magics and the exit
3294 Dynamic transformations, for things like unescaped magics and the exit
3295 autocall, depend on the state of the interpreter.
3295 autocall, depend on the state of the interpreter.
3296 These only apply to single line inputs.
3296 These only apply to single line inputs.
3297
3297
3298 These string-based transformations are followed by AST transformations;
3298 These string-based transformations are followed by AST transformations;
3299 see :meth:`transform_ast`.
3299 see :meth:`transform_ast`.
3300 """
3300 """
3301 # Static input transformations
3301 # Static input transformations
3302 cell = self.input_transformer_manager.transform_cell(raw_cell)
3302 cell = self.input_transformer_manager.transform_cell(raw_cell)
3303
3303
3304 if len(cell.splitlines()) == 1:
3304 if len(cell.splitlines()) == 1:
3305 # Dynamic transformations - only applied for single line commands
3305 # Dynamic transformations - only applied for single line commands
3306 with self.builtin_trap:
3306 with self.builtin_trap:
3307 # use prefilter_lines to handle trailing newlines
3307 # use prefilter_lines to handle trailing newlines
3308 # restore trailing newline for ast.parse
3308 # restore trailing newline for ast.parse
3309 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
3309 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
3310
3310
3311 lines = cell.splitlines(keepends=True)
3311 lines = cell.splitlines(keepends=True)
3312 for transform in self.input_transformers_post:
3312 for transform in self.input_transformers_post:
3313 lines = transform(lines)
3313 lines = transform(lines)
3314 cell = ''.join(lines)
3314 cell = ''.join(lines)
3315
3315
3316 return cell
3316 return cell
3317
3317
3318 def transform_ast(self, node):
3318 def transform_ast(self, node):
3319 """Apply the AST transformations from self.ast_transformers
3319 """Apply the AST transformations from self.ast_transformers
3320
3320
3321 Parameters
3321 Parameters
3322 ----------
3322 ----------
3323 node : ast.Node
3323 node : ast.Node
3324 The root node to be transformed. Typically called with the ast.Module
3324 The root node to be transformed. Typically called with the ast.Module
3325 produced by parsing user input.
3325 produced by parsing user input.
3326
3326
3327 Returns
3327 Returns
3328 -------
3328 -------
3329 An ast.Node corresponding to the node it was called with. Note that it
3329 An ast.Node corresponding to the node it was called with. Note that it
3330 may also modify the passed object, so don't rely on references to the
3330 may also modify the passed object, so don't rely on references to the
3331 original AST.
3331 original AST.
3332 """
3332 """
3333 for transformer in self.ast_transformers:
3333 for transformer in self.ast_transformers:
3334 try:
3334 try:
3335 node = transformer.visit(node)
3335 node = transformer.visit(node)
3336 except InputRejected:
3336 except InputRejected:
3337 # User-supplied AST transformers can reject an input by raising
3337 # User-supplied AST transformers can reject an input by raising
3338 # an InputRejected. Short-circuit in this case so that we
3338 # an InputRejected. Short-circuit in this case so that we
3339 # don't unregister the transform.
3339 # don't unregister the transform.
3340 raise
3340 raise
3341 except Exception:
3341 except Exception as e:
3342 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
3342 warn(
3343 "AST transformer %r threw an error. It will be unregistered. %s"
3344 % (transformer, e)
3345 )
3343 self.ast_transformers.remove(transformer)
3346 self.ast_transformers.remove(transformer)
3344
3347
3345 if self.ast_transformers:
3348 if self.ast_transformers:
3346 ast.fix_missing_locations(node)
3349 ast.fix_missing_locations(node)
3347 return node
3350 return node
3348
3351
3349 async def run_ast_nodes(
3352 async def run_ast_nodes(
3350 self,
3353 self,
3351 nodelist: ListType[stmt],
3354 nodelist: ListType[stmt],
3352 cell_name: str,
3355 cell_name: str,
3353 interactivity="last_expr",
3356 interactivity="last_expr",
3354 compiler=compile,
3357 compiler=compile,
3355 result=None,
3358 result=None,
3356 ):
3359 ):
3357 """Run a sequence of AST nodes. The execution mode depends on the
3360 """Run a sequence of AST nodes. The execution mode depends on the
3358 interactivity parameter.
3361 interactivity parameter.
3359
3362
3360 Parameters
3363 Parameters
3361 ----------
3364 ----------
3362 nodelist : list
3365 nodelist : list
3363 A sequence of AST nodes to run.
3366 A sequence of AST nodes to run.
3364 cell_name : str
3367 cell_name : str
3365 Will be passed to the compiler as the filename of the cell. Typically
3368 Will be passed to the compiler as the filename of the cell. Typically
3366 the value returned by ip.compile.cache(cell).
3369 the value returned by ip.compile.cache(cell).
3367 interactivity : str
3370 interactivity : str
3368 'all', 'last', 'last_expr' , 'last_expr_or_assign' or 'none',
3371 'all', 'last', 'last_expr' , 'last_expr_or_assign' or 'none',
3369 specifying which nodes should be run interactively (displaying output
3372 specifying which nodes should be run interactively (displaying output
3370 from expressions). 'last_expr' will run the last node interactively
3373 from expressions). 'last_expr' will run the last node interactively
3371 only if it is an expression (i.e. expressions in loops or other blocks
3374 only if it is an expression (i.e. expressions in loops or other blocks
3372 are not displayed) 'last_expr_or_assign' will run the last expression
3375 are not displayed) 'last_expr_or_assign' will run the last expression
3373 or the last assignment. Other values for this parameter will raise a
3376 or the last assignment. Other values for this parameter will raise a
3374 ValueError.
3377 ValueError.
3375
3378
3376 compiler : callable
3379 compiler : callable
3377 A function with the same interface as the built-in compile(), to turn
3380 A function with the same interface as the built-in compile(), to turn
3378 the AST nodes into code objects. Default is the built-in compile().
3381 the AST nodes into code objects. Default is the built-in compile().
3379 result : ExecutionResult, optional
3382 result : ExecutionResult, optional
3380 An object to store exceptions that occur during execution.
3383 An object to store exceptions that occur during execution.
3381
3384
3382 Returns
3385 Returns
3383 -------
3386 -------
3384 True if an exception occurred while running code, False if it finished
3387 True if an exception occurred while running code, False if it finished
3385 running.
3388 running.
3386 """
3389 """
3387 if not nodelist:
3390 if not nodelist:
3388 return
3391 return
3389
3392
3390
3393
3391 if interactivity == 'last_expr_or_assign':
3394 if interactivity == 'last_expr_or_assign':
3392 if isinstance(nodelist[-1], _assign_nodes):
3395 if isinstance(nodelist[-1], _assign_nodes):
3393 asg = nodelist[-1]
3396 asg = nodelist[-1]
3394 if isinstance(asg, ast.Assign) and len(asg.targets) == 1:
3397 if isinstance(asg, ast.Assign) and len(asg.targets) == 1:
3395 target = asg.targets[0]
3398 target = asg.targets[0]
3396 elif isinstance(asg, _single_targets_nodes):
3399 elif isinstance(asg, _single_targets_nodes):
3397 target = asg.target
3400 target = asg.target
3398 else:
3401 else:
3399 target = None
3402 target = None
3400 if isinstance(target, ast.Name):
3403 if isinstance(target, ast.Name):
3401 nnode = ast.Expr(ast.Name(target.id, ast.Load()))
3404 nnode = ast.Expr(ast.Name(target.id, ast.Load()))
3402 ast.fix_missing_locations(nnode)
3405 ast.fix_missing_locations(nnode)
3403 nodelist.append(nnode)
3406 nodelist.append(nnode)
3404 interactivity = 'last_expr'
3407 interactivity = 'last_expr'
3405
3408
3406 _async = False
3409 _async = False
3407 if interactivity == 'last_expr':
3410 if interactivity == 'last_expr':
3408 if isinstance(nodelist[-1], ast.Expr):
3411 if isinstance(nodelist[-1], ast.Expr):
3409 interactivity = "last"
3412 interactivity = "last"
3410 else:
3413 else:
3411 interactivity = "none"
3414 interactivity = "none"
3412
3415
3413 if interactivity == 'none':
3416 if interactivity == 'none':
3414 to_run_exec, to_run_interactive = nodelist, []
3417 to_run_exec, to_run_interactive = nodelist, []
3415 elif interactivity == 'last':
3418 elif interactivity == 'last':
3416 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
3419 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
3417 elif interactivity == 'all':
3420 elif interactivity == 'all':
3418 to_run_exec, to_run_interactive = [], nodelist
3421 to_run_exec, to_run_interactive = [], nodelist
3419 else:
3422 else:
3420 raise ValueError("Interactivity was %r" % interactivity)
3423 raise ValueError("Interactivity was %r" % interactivity)
3421
3424
3422 try:
3425 try:
3423
3426
3424 def compare(code):
3427 def compare(code):
3425 is_async = inspect.CO_COROUTINE & code.co_flags == inspect.CO_COROUTINE
3428 is_async = inspect.CO_COROUTINE & code.co_flags == inspect.CO_COROUTINE
3426 return is_async
3429 return is_async
3427
3430
3428 # refactor that to just change the mod constructor.
3431 # refactor that to just change the mod constructor.
3429 to_run = []
3432 to_run = []
3430 for node in to_run_exec:
3433 for node in to_run_exec:
3431 to_run.append((node, "exec"))
3434 to_run.append((node, "exec"))
3432
3435
3433 for node in to_run_interactive:
3436 for node in to_run_interactive:
3434 to_run.append((node, "single"))
3437 to_run.append((node, "single"))
3435
3438
3436 for node, mode in to_run:
3439 for node, mode in to_run:
3437 if mode == "exec":
3440 if mode == "exec":
3438 mod = Module([node], [])
3441 mod = Module([node], [])
3439 elif mode == "single":
3442 elif mode == "single":
3440 mod = ast.Interactive([node]) # type: ignore
3443 mod = ast.Interactive([node]) # type: ignore
3441 with compiler.extra_flags(
3444 with compiler.extra_flags(
3442 getattr(ast, "PyCF_ALLOW_TOP_LEVEL_AWAIT", 0x0)
3445 getattr(ast, "PyCF_ALLOW_TOP_LEVEL_AWAIT", 0x0)
3443 if self.autoawait
3446 if self.autoawait
3444 else 0x0
3447 else 0x0
3445 ):
3448 ):
3446 code = compiler(mod, cell_name, mode)
3449 code = compiler(mod, cell_name, mode)
3447 asy = compare(code)
3450 asy = compare(code)
3448 if await self.run_code(code, result, async_=asy):
3451 if await self.run_code(code, result, async_=asy):
3449 return True
3452 return True
3450
3453
3451 # Flush softspace
3454 # Flush softspace
3452 if softspace(sys.stdout, 0):
3455 if softspace(sys.stdout, 0):
3453 print()
3456 print()
3454
3457
3455 except:
3458 except:
3456 # It's possible to have exceptions raised here, typically by
3459 # It's possible to have exceptions raised here, typically by
3457 # compilation of odd code (such as a naked 'return' outside a
3460 # compilation of odd code (such as a naked 'return' outside a
3458 # function) that did parse but isn't valid. Typically the exception
3461 # function) that did parse but isn't valid. Typically the exception
3459 # is a SyntaxError, but it's safest just to catch anything and show
3462 # is a SyntaxError, but it's safest just to catch anything and show
3460 # the user a traceback.
3463 # the user a traceback.
3461
3464
3462 # We do only one try/except outside the loop to minimize the impact
3465 # We do only one try/except outside the loop to minimize the impact
3463 # on runtime, and also because if any node in the node list is
3466 # on runtime, and also because if any node in the node list is
3464 # broken, we should stop execution completely.
3467 # broken, we should stop execution completely.
3465 if result:
3468 if result:
3466 result.error_before_exec = sys.exc_info()[1]
3469 result.error_before_exec = sys.exc_info()[1]
3467 self.showtraceback()
3470 self.showtraceback()
3468 return True
3471 return True
3469
3472
3470 return False
3473 return False
3471
3474
3472 async def run_code(self, code_obj, result=None, *, async_=False):
3475 async def run_code(self, code_obj, result=None, *, async_=False):
3473 """Execute a code object.
3476 """Execute a code object.
3474
3477
3475 When an exception occurs, self.showtraceback() is called to display a
3478 When an exception occurs, self.showtraceback() is called to display a
3476 traceback.
3479 traceback.
3477
3480
3478 Parameters
3481 Parameters
3479 ----------
3482 ----------
3480 code_obj : code object
3483 code_obj : code object
3481 A compiled code object, to be executed
3484 A compiled code object, to be executed
3482 result : ExecutionResult, optional
3485 result : ExecutionResult, optional
3483 An object to store exceptions that occur during execution.
3486 An object to store exceptions that occur during execution.
3484 async_ : Bool (Experimental)
3487 async_ : Bool (Experimental)
3485 Attempt to run top-level asynchronous code in a default loop.
3488 Attempt to run top-level asynchronous code in a default loop.
3486
3489
3487 Returns
3490 Returns
3488 -------
3491 -------
3489 False : successful execution.
3492 False : successful execution.
3490 True : an error occurred.
3493 True : an error occurred.
3491 """
3494 """
3492 # special value to say that anything above is IPython and should be
3495 # special value to say that anything above is IPython and should be
3493 # hidden.
3496 # hidden.
3494 __tracebackhide__ = "__ipython_bottom__"
3497 __tracebackhide__ = "__ipython_bottom__"
3495 # Set our own excepthook in case the user code tries to call it
3498 # Set our own excepthook in case the user code tries to call it
3496 # directly, so that the IPython crash handler doesn't get triggered
3499 # directly, so that the IPython crash handler doesn't get triggered
3497 old_excepthook, sys.excepthook = sys.excepthook, self.excepthook
3500 old_excepthook, sys.excepthook = sys.excepthook, self.excepthook
3498
3501
3499 # we save the original sys.excepthook in the instance, in case config
3502 # we save the original sys.excepthook in the instance, in case config
3500 # code (such as magics) needs access to it.
3503 # code (such as magics) needs access to it.
3501 self.sys_excepthook = old_excepthook
3504 self.sys_excepthook = old_excepthook
3502 outflag = True # happens in more places, so it's easier as default
3505 outflag = True # happens in more places, so it's easier as default
3503 try:
3506 try:
3504 try:
3507 try:
3505 if async_:
3508 if async_:
3506 await eval(code_obj, self.user_global_ns, self.user_ns)
3509 await eval(code_obj, self.user_global_ns, self.user_ns)
3507 else:
3510 else:
3508 exec(code_obj, self.user_global_ns, self.user_ns)
3511 exec(code_obj, self.user_global_ns, self.user_ns)
3509 finally:
3512 finally:
3510 # Reset our crash handler in place
3513 # Reset our crash handler in place
3511 sys.excepthook = old_excepthook
3514 sys.excepthook = old_excepthook
3512 except SystemExit as e:
3515 except SystemExit as e:
3513 if result is not None:
3516 if result is not None:
3514 result.error_in_exec = e
3517 result.error_in_exec = e
3515 self.showtraceback(exception_only=True)
3518 self.showtraceback(exception_only=True)
3516 warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
3519 warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
3517 except bdb.BdbQuit:
3520 except bdb.BdbQuit:
3518 etype, value, tb = sys.exc_info()
3521 etype, value, tb = sys.exc_info()
3519 if result is not None:
3522 if result is not None:
3520 result.error_in_exec = value
3523 result.error_in_exec = value
3521 # the BdbQuit stops here
3524 # the BdbQuit stops here
3522 except self.custom_exceptions:
3525 except self.custom_exceptions:
3523 etype, value, tb = sys.exc_info()
3526 etype, value, tb = sys.exc_info()
3524 if result is not None:
3527 if result is not None:
3525 result.error_in_exec = value
3528 result.error_in_exec = value
3526 self.CustomTB(etype, value, tb)
3529 self.CustomTB(etype, value, tb)
3527 except:
3530 except:
3528 if result is not None:
3531 if result is not None:
3529 result.error_in_exec = sys.exc_info()[1]
3532 result.error_in_exec = sys.exc_info()[1]
3530 self.showtraceback(running_compiled_code=True)
3533 self.showtraceback(running_compiled_code=True)
3531 else:
3534 else:
3532 outflag = False
3535 outflag = False
3533 return outflag
3536 return outflag
3534
3537
3535 # For backwards compatibility
3538 # For backwards compatibility
3536 runcode = run_code
3539 runcode = run_code
3537
3540
3538 def check_complete(self, code: str) -> Tuple[str, str]:
3541 def check_complete(self, code: str) -> Tuple[str, str]:
3539 """Return whether a block of code is ready to execute, or should be continued
3542 """Return whether a block of code is ready to execute, or should be continued
3540
3543
3541 Parameters
3544 Parameters
3542 ----------
3545 ----------
3543 code : string
3546 code : string
3544 Python input code, which can be multiline.
3547 Python input code, which can be multiline.
3545
3548
3546 Returns
3549 Returns
3547 -------
3550 -------
3548 status : str
3551 status : str
3549 One of 'complete', 'incomplete', or 'invalid' if source is not a
3552 One of 'complete', 'incomplete', or 'invalid' if source is not a
3550 prefix of valid code.
3553 prefix of valid code.
3551 indent : str
3554 indent : str
3552 When status is 'incomplete', this is some whitespace to insert on
3555 When status is 'incomplete', this is some whitespace to insert on
3553 the next line of the prompt.
3556 the next line of the prompt.
3554 """
3557 """
3555 status, nspaces = self.input_transformer_manager.check_complete(code)
3558 status, nspaces = self.input_transformer_manager.check_complete(code)
3556 return status, ' ' * (nspaces or 0)
3559 return status, ' ' * (nspaces or 0)
3557
3560
3558 #-------------------------------------------------------------------------
3561 #-------------------------------------------------------------------------
3559 # Things related to GUI support and pylab
3562 # Things related to GUI support and pylab
3560 #-------------------------------------------------------------------------
3563 #-------------------------------------------------------------------------
3561
3564
3562 active_eventloop = None
3565 active_eventloop = None
3563
3566
3564 def enable_gui(self, gui=None):
3567 def enable_gui(self, gui=None):
3565 raise NotImplementedError('Implement enable_gui in a subclass')
3568 raise NotImplementedError('Implement enable_gui in a subclass')
3566
3569
3567 def enable_matplotlib(self, gui=None):
3570 def enable_matplotlib(self, gui=None):
3568 """Enable interactive matplotlib and inline figure support.
3571 """Enable interactive matplotlib and inline figure support.
3569
3572
3570 This takes the following steps:
3573 This takes the following steps:
3571
3574
3572 1. select the appropriate eventloop and matplotlib backend
3575 1. select the appropriate eventloop and matplotlib backend
3573 2. set up matplotlib for interactive use with that backend
3576 2. set up matplotlib for interactive use with that backend
3574 3. configure formatters for inline figure display
3577 3. configure formatters for inline figure display
3575 4. enable the selected gui eventloop
3578 4. enable the selected gui eventloop
3576
3579
3577 Parameters
3580 Parameters
3578 ----------
3581 ----------
3579 gui : optional, string
3582 gui : optional, string
3580 If given, dictates the choice of matplotlib GUI backend to use
3583 If given, dictates the choice of matplotlib GUI backend to use
3581 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3584 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3582 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3585 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3583 matplotlib (as dictated by the matplotlib build-time options plus the
3586 matplotlib (as dictated by the matplotlib build-time options plus the
3584 user's matplotlibrc configuration file). Note that not all backends
3587 user's matplotlibrc configuration file). Note that not all backends
3585 make sense in all contexts, for example a terminal ipython can't
3588 make sense in all contexts, for example a terminal ipython can't
3586 display figures inline.
3589 display figures inline.
3587 """
3590 """
3588 from matplotlib_inline.backend_inline import configure_inline_support
3591 from matplotlib_inline.backend_inline import configure_inline_support
3589
3592
3590 from IPython.core import pylabtools as pt
3593 from IPython.core import pylabtools as pt
3591 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
3594 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
3592
3595
3593 if gui != 'inline':
3596 if gui != 'inline':
3594 # If we have our first gui selection, store it
3597 # If we have our first gui selection, store it
3595 if self.pylab_gui_select is None:
3598 if self.pylab_gui_select is None:
3596 self.pylab_gui_select = gui
3599 self.pylab_gui_select = gui
3597 # Otherwise if they are different
3600 # Otherwise if they are different
3598 elif gui != self.pylab_gui_select:
3601 elif gui != self.pylab_gui_select:
3599 print('Warning: Cannot change to a different GUI toolkit: %s.'
3602 print('Warning: Cannot change to a different GUI toolkit: %s.'
3600 ' Using %s instead.' % (gui, self.pylab_gui_select))
3603 ' Using %s instead.' % (gui, self.pylab_gui_select))
3601 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
3604 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
3602
3605
3603 pt.activate_matplotlib(backend)
3606 pt.activate_matplotlib(backend)
3604 configure_inline_support(self, backend)
3607 configure_inline_support(self, backend)
3605
3608
3606 # Now we must activate the gui pylab wants to use, and fix %run to take
3609 # Now we must activate the gui pylab wants to use, and fix %run to take
3607 # plot updates into account
3610 # plot updates into account
3608 self.enable_gui(gui)
3611 self.enable_gui(gui)
3609 self.magics_manager.registry['ExecutionMagics'].default_runner = \
3612 self.magics_manager.registry['ExecutionMagics'].default_runner = \
3610 pt.mpl_runner(self.safe_execfile)
3613 pt.mpl_runner(self.safe_execfile)
3611
3614
3612 return gui, backend
3615 return gui, backend
3613
3616
3614 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
3617 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
3615 """Activate pylab support at runtime.
3618 """Activate pylab support at runtime.
3616
3619
3617 This turns on support for matplotlib, preloads into the interactive
3620 This turns on support for matplotlib, preloads into the interactive
3618 namespace all of numpy and pylab, and configures IPython to correctly
3621 namespace all of numpy and pylab, and configures IPython to correctly
3619 interact with the GUI event loop. The GUI backend to be used can be
3622 interact with the GUI event loop. The GUI backend to be used can be
3620 optionally selected with the optional ``gui`` argument.
3623 optionally selected with the optional ``gui`` argument.
3621
3624
3622 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
3625 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
3623
3626
3624 Parameters
3627 Parameters
3625 ----------
3628 ----------
3626 gui : optional, string
3629 gui : optional, string
3627 If given, dictates the choice of matplotlib GUI backend to use
3630 If given, dictates the choice of matplotlib GUI backend to use
3628 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3631 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3629 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3632 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3630 matplotlib (as dictated by the matplotlib build-time options plus the
3633 matplotlib (as dictated by the matplotlib build-time options plus the
3631 user's matplotlibrc configuration file). Note that not all backends
3634 user's matplotlibrc configuration file). Note that not all backends
3632 make sense in all contexts, for example a terminal ipython can't
3635 make sense in all contexts, for example a terminal ipython can't
3633 display figures inline.
3636 display figures inline.
3634 import_all : optional, bool, default: True
3637 import_all : optional, bool, default: True
3635 Whether to do `from numpy import *` and `from pylab import *`
3638 Whether to do `from numpy import *` and `from pylab import *`
3636 in addition to module imports.
3639 in addition to module imports.
3637 welcome_message : deprecated
3640 welcome_message : deprecated
3638 This argument is ignored, no welcome message will be displayed.
3641 This argument is ignored, no welcome message will be displayed.
3639 """
3642 """
3640 from IPython.core.pylabtools import import_pylab
3643 from IPython.core.pylabtools import import_pylab
3641
3644
3642 gui, backend = self.enable_matplotlib(gui)
3645 gui, backend = self.enable_matplotlib(gui)
3643
3646
3644 # We want to prevent the loading of pylab to pollute the user's
3647 # We want to prevent the loading of pylab to pollute the user's
3645 # namespace as shown by the %who* magics, so we execute the activation
3648 # namespace as shown by the %who* magics, so we execute the activation
3646 # code in an empty namespace, and we update *both* user_ns and
3649 # code in an empty namespace, and we update *both* user_ns and
3647 # user_ns_hidden with this information.
3650 # user_ns_hidden with this information.
3648 ns = {}
3651 ns = {}
3649 import_pylab(ns, import_all)
3652 import_pylab(ns, import_all)
3650 # warn about clobbered names
3653 # warn about clobbered names
3651 ignored = {"__builtins__"}
3654 ignored = {"__builtins__"}
3652 both = set(ns).intersection(self.user_ns).difference(ignored)
3655 both = set(ns).intersection(self.user_ns).difference(ignored)
3653 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
3656 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
3654 self.user_ns.update(ns)
3657 self.user_ns.update(ns)
3655 self.user_ns_hidden.update(ns)
3658 self.user_ns_hidden.update(ns)
3656 return gui, backend, clobbered
3659 return gui, backend, clobbered
3657
3660
3658 #-------------------------------------------------------------------------
3661 #-------------------------------------------------------------------------
3659 # Utilities
3662 # Utilities
3660 #-------------------------------------------------------------------------
3663 #-------------------------------------------------------------------------
3661
3664
3662 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
3665 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
3663 """Expand python variables in a string.
3666 """Expand python variables in a string.
3664
3667
3665 The depth argument indicates how many frames above the caller should
3668 The depth argument indicates how many frames above the caller should
3666 be walked to look for the local namespace where to expand variables.
3669 be walked to look for the local namespace where to expand variables.
3667
3670
3668 The global namespace for expansion is always the user's interactive
3671 The global namespace for expansion is always the user's interactive
3669 namespace.
3672 namespace.
3670 """
3673 """
3671 ns = self.user_ns.copy()
3674 ns = self.user_ns.copy()
3672 try:
3675 try:
3673 frame = sys._getframe(depth+1)
3676 frame = sys._getframe(depth+1)
3674 except ValueError:
3677 except ValueError:
3675 # This is thrown if there aren't that many frames on the stack,
3678 # This is thrown if there aren't that many frames on the stack,
3676 # e.g. if a script called run_line_magic() directly.
3679 # e.g. if a script called run_line_magic() directly.
3677 pass
3680 pass
3678 else:
3681 else:
3679 ns.update(frame.f_locals)
3682 ns.update(frame.f_locals)
3680
3683
3681 try:
3684 try:
3682 # We have to use .vformat() here, because 'self' is a valid and common
3685 # We have to use .vformat() here, because 'self' is a valid and common
3683 # name, and expanding **ns for .format() would make it collide with
3686 # name, and expanding **ns for .format() would make it collide with
3684 # the 'self' argument of the method.
3687 # the 'self' argument of the method.
3685 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
3688 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
3686 except Exception:
3689 except Exception:
3687 # if formatter couldn't format, just let it go untransformed
3690 # if formatter couldn't format, just let it go untransformed
3688 pass
3691 pass
3689 return cmd
3692 return cmd
3690
3693
3691 def mktempfile(self, data=None, prefix='ipython_edit_'):
3694 def mktempfile(self, data=None, prefix='ipython_edit_'):
3692 """Make a new tempfile and return its filename.
3695 """Make a new tempfile and return its filename.
3693
3696
3694 This makes a call to tempfile.mkstemp (created in a tempfile.mkdtemp),
3697 This makes a call to tempfile.mkstemp (created in a tempfile.mkdtemp),
3695 but it registers the created filename internally so ipython cleans it up
3698 but it registers the created filename internally so ipython cleans it up
3696 at exit time.
3699 at exit time.
3697
3700
3698 Optional inputs:
3701 Optional inputs:
3699
3702
3700 - data(None): if data is given, it gets written out to the temp file
3703 - data(None): if data is given, it gets written out to the temp file
3701 immediately, and the file is closed again."""
3704 immediately, and the file is closed again."""
3702
3705
3703 dir_path = Path(tempfile.mkdtemp(prefix=prefix))
3706 dir_path = Path(tempfile.mkdtemp(prefix=prefix))
3704 self.tempdirs.append(dir_path)
3707 self.tempdirs.append(dir_path)
3705
3708
3706 handle, filename = tempfile.mkstemp(".py", prefix, dir=str(dir_path))
3709 handle, filename = tempfile.mkstemp(".py", prefix, dir=str(dir_path))
3707 os.close(handle) # On Windows, there can only be one open handle on a file
3710 os.close(handle) # On Windows, there can only be one open handle on a file
3708
3711
3709 file_path = Path(filename)
3712 file_path = Path(filename)
3710 self.tempfiles.append(file_path)
3713 self.tempfiles.append(file_path)
3711
3714
3712 if data:
3715 if data:
3713 file_path.write_text(data, encoding="utf-8")
3716 file_path.write_text(data, encoding="utf-8")
3714 return filename
3717 return filename
3715
3718
3716 def ask_yes_no(self, prompt, default=None, interrupt=None):
3719 def ask_yes_no(self, prompt, default=None, interrupt=None):
3717 if self.quiet:
3720 if self.quiet:
3718 return True
3721 return True
3719 return ask_yes_no(prompt,default,interrupt)
3722 return ask_yes_no(prompt,default,interrupt)
3720
3723
3721 def show_usage(self):
3724 def show_usage(self):
3722 """Show a usage message"""
3725 """Show a usage message"""
3723 page.page(IPython.core.usage.interactive_usage)
3726 page.page(IPython.core.usage.interactive_usage)
3724
3727
3725 def extract_input_lines(self, range_str, raw=False):
3728 def extract_input_lines(self, range_str, raw=False):
3726 """Return as a string a set of input history slices.
3729 """Return as a string a set of input history slices.
3727
3730
3728 Parameters
3731 Parameters
3729 ----------
3732 ----------
3730 range_str : str
3733 range_str : str
3731 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
3734 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
3732 since this function is for use by magic functions which get their
3735 since this function is for use by magic functions which get their
3733 arguments as strings. The number before the / is the session
3736 arguments as strings. The number before the / is the session
3734 number: ~n goes n back from the current session.
3737 number: ~n goes n back from the current session.
3735
3738
3736 If empty string is given, returns history of current session
3739 If empty string is given, returns history of current session
3737 without the last input.
3740 without the last input.
3738
3741
3739 raw : bool, optional
3742 raw : bool, optional
3740 By default, the processed input is used. If this is true, the raw
3743 By default, the processed input is used. If this is true, the raw
3741 input history is used instead.
3744 input history is used instead.
3742
3745
3743 Notes
3746 Notes
3744 -----
3747 -----
3745 Slices can be described with two notations:
3748 Slices can be described with two notations:
3746
3749
3747 * ``N:M`` -> standard python form, means including items N...(M-1).
3750 * ``N:M`` -> standard python form, means including items N...(M-1).
3748 * ``N-M`` -> include items N..M (closed endpoint).
3751 * ``N-M`` -> include items N..M (closed endpoint).
3749 """
3752 """
3750 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3753 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3751 text = "\n".join(x for _, _, x in lines)
3754 text = "\n".join(x for _, _, x in lines)
3752
3755
3753 # Skip the last line, as it's probably the magic that called this
3756 # Skip the last line, as it's probably the magic that called this
3754 if not range_str:
3757 if not range_str:
3755 if "\n" not in text:
3758 if "\n" not in text:
3756 text = ""
3759 text = ""
3757 else:
3760 else:
3758 text = text[: text.rfind("\n")]
3761 text = text[: text.rfind("\n")]
3759
3762
3760 return text
3763 return text
3761
3764
3762 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True, search_ns=False):
3765 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True, search_ns=False):
3763 """Get a code string from history, file, url, or a string or macro.
3766 """Get a code string from history, file, url, or a string or macro.
3764
3767
3765 This is mainly used by magic functions.
3768 This is mainly used by magic functions.
3766
3769
3767 Parameters
3770 Parameters
3768 ----------
3771 ----------
3769 target : str
3772 target : str
3770 A string specifying code to retrieve. This will be tried respectively
3773 A string specifying code to retrieve. This will be tried respectively
3771 as: ranges of input history (see %history for syntax), url,
3774 as: ranges of input history (see %history for syntax), url,
3772 corresponding .py file, filename, or an expression evaluating to a
3775 corresponding .py file, filename, or an expression evaluating to a
3773 string or Macro in the user namespace.
3776 string or Macro in the user namespace.
3774
3777
3775 If empty string is given, returns complete history of current
3778 If empty string is given, returns complete history of current
3776 session, without the last line.
3779 session, without the last line.
3777
3780
3778 raw : bool
3781 raw : bool
3779 If true (default), retrieve raw history. Has no effect on the other
3782 If true (default), retrieve raw history. Has no effect on the other
3780 retrieval mechanisms.
3783 retrieval mechanisms.
3781
3784
3782 py_only : bool (default False)
3785 py_only : bool (default False)
3783 Only try to fetch python code, do not try alternative methods to decode file
3786 Only try to fetch python code, do not try alternative methods to decode file
3784 if unicode fails.
3787 if unicode fails.
3785
3788
3786 Returns
3789 Returns
3787 -------
3790 -------
3788 A string of code.
3791 A string of code.
3789 ValueError is raised if nothing is found, and TypeError if it evaluates
3792 ValueError is raised if nothing is found, and TypeError if it evaluates
3790 to an object of another type. In each case, .args[0] is a printable
3793 to an object of another type. In each case, .args[0] is a printable
3791 message.
3794 message.
3792 """
3795 """
3793 code = self.extract_input_lines(target, raw=raw) # Grab history
3796 code = self.extract_input_lines(target, raw=raw) # Grab history
3794 if code:
3797 if code:
3795 return code
3798 return code
3796 try:
3799 try:
3797 if target.startswith(('http://', 'https://')):
3800 if target.startswith(('http://', 'https://')):
3798 return openpy.read_py_url(target, skip_encoding_cookie=skip_encoding_cookie)
3801 return openpy.read_py_url(target, skip_encoding_cookie=skip_encoding_cookie)
3799 except UnicodeDecodeError as e:
3802 except UnicodeDecodeError as e:
3800 if not py_only :
3803 if not py_only :
3801 # Deferred import
3804 # Deferred import
3802 from urllib.request import urlopen
3805 from urllib.request import urlopen
3803 response = urlopen(target)
3806 response = urlopen(target)
3804 return response.read().decode('latin1')
3807 return response.read().decode('latin1')
3805 raise ValueError(("'%s' seem to be unreadable.") % target) from e
3808 raise ValueError(("'%s' seem to be unreadable.") % target) from e
3806
3809
3807 potential_target = [target]
3810 potential_target = [target]
3808 try :
3811 try :
3809 potential_target.insert(0,get_py_filename(target))
3812 potential_target.insert(0,get_py_filename(target))
3810 except IOError:
3813 except IOError:
3811 pass
3814 pass
3812
3815
3813 for tgt in potential_target :
3816 for tgt in potential_target :
3814 if os.path.isfile(tgt): # Read file
3817 if os.path.isfile(tgt): # Read file
3815 try :
3818 try :
3816 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3819 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3817 except UnicodeDecodeError as e:
3820 except UnicodeDecodeError as e:
3818 if not py_only :
3821 if not py_only :
3819 with io_open(tgt,'r', encoding='latin1') as f :
3822 with io_open(tgt,'r', encoding='latin1') as f :
3820 return f.read()
3823 return f.read()
3821 raise ValueError(("'%s' seem to be unreadable.") % target) from e
3824 raise ValueError(("'%s' seem to be unreadable.") % target) from e
3822 elif os.path.isdir(os.path.expanduser(tgt)):
3825 elif os.path.isdir(os.path.expanduser(tgt)):
3823 raise ValueError("'%s' is a directory, not a regular file." % target)
3826 raise ValueError("'%s' is a directory, not a regular file." % target)
3824
3827
3825 if search_ns:
3828 if search_ns:
3826 # Inspect namespace to load object source
3829 # Inspect namespace to load object source
3827 object_info = self.object_inspect(target, detail_level=1)
3830 object_info = self.object_inspect(target, detail_level=1)
3828 if object_info['found'] and object_info['source']:
3831 if object_info['found'] and object_info['source']:
3829 return object_info['source']
3832 return object_info['source']
3830
3833
3831 try: # User namespace
3834 try: # User namespace
3832 codeobj = eval(target, self.user_ns)
3835 codeobj = eval(target, self.user_ns)
3833 except Exception as e:
3836 except Exception as e:
3834 raise ValueError(("'%s' was not found in history, as a file, url, "
3837 raise ValueError(("'%s' was not found in history, as a file, url, "
3835 "nor in the user namespace.") % target) from e
3838 "nor in the user namespace.") % target) from e
3836
3839
3837 if isinstance(codeobj, str):
3840 if isinstance(codeobj, str):
3838 return codeobj
3841 return codeobj
3839 elif isinstance(codeobj, Macro):
3842 elif isinstance(codeobj, Macro):
3840 return codeobj.value
3843 return codeobj.value
3841
3844
3842 raise TypeError("%s is neither a string nor a macro." % target,
3845 raise TypeError("%s is neither a string nor a macro." % target,
3843 codeobj)
3846 codeobj)
3844
3847
3845 def _atexit_once(self):
3848 def _atexit_once(self):
3846 """
3849 """
3847 At exist operation that need to be called at most once.
3850 At exist operation that need to be called at most once.
3848 Second call to this function per instance will do nothing.
3851 Second call to this function per instance will do nothing.
3849 """
3852 """
3850
3853
3851 if not getattr(self, "_atexit_once_called", False):
3854 if not getattr(self, "_atexit_once_called", False):
3852 self._atexit_once_called = True
3855 self._atexit_once_called = True
3853 # Clear all user namespaces to release all references cleanly.
3856 # Clear all user namespaces to release all references cleanly.
3854 self.reset(new_session=False)
3857 self.reset(new_session=False)
3855 # Close the history session (this stores the end time and line count)
3858 # Close the history session (this stores the end time and line count)
3856 # this must be *before* the tempfile cleanup, in case of temporary
3859 # this must be *before* the tempfile cleanup, in case of temporary
3857 # history db
3860 # history db
3858 self.history_manager.end_session()
3861 self.history_manager.end_session()
3859 self.history_manager = None
3862 self.history_manager = None
3860
3863
3861 #-------------------------------------------------------------------------
3864 #-------------------------------------------------------------------------
3862 # Things related to IPython exiting
3865 # Things related to IPython exiting
3863 #-------------------------------------------------------------------------
3866 #-------------------------------------------------------------------------
3864 def atexit_operations(self):
3867 def atexit_operations(self):
3865 """This will be executed at the time of exit.
3868 """This will be executed at the time of exit.
3866
3869
3867 Cleanup operations and saving of persistent data that is done
3870 Cleanup operations and saving of persistent data that is done
3868 unconditionally by IPython should be performed here.
3871 unconditionally by IPython should be performed here.
3869
3872
3870 For things that may depend on startup flags or platform specifics (such
3873 For things that may depend on startup flags or platform specifics (such
3871 as having readline or not), register a separate atexit function in the
3874 as having readline or not), register a separate atexit function in the
3872 code that has the appropriate information, rather than trying to
3875 code that has the appropriate information, rather than trying to
3873 clutter
3876 clutter
3874 """
3877 """
3875 self._atexit_once()
3878 self._atexit_once()
3876
3879
3877 # Cleanup all tempfiles and folders left around
3880 # Cleanup all tempfiles and folders left around
3878 for tfile in self.tempfiles:
3881 for tfile in self.tempfiles:
3879 try:
3882 try:
3880 tfile.unlink()
3883 tfile.unlink()
3881 self.tempfiles.remove(tfile)
3884 self.tempfiles.remove(tfile)
3882 except FileNotFoundError:
3885 except FileNotFoundError:
3883 pass
3886 pass
3884 del self.tempfiles
3887 del self.tempfiles
3885 for tdir in self.tempdirs:
3888 for tdir in self.tempdirs:
3886 try:
3889 try:
3887 tdir.rmdir()
3890 tdir.rmdir()
3888 self.tempdirs.remove(tdir)
3891 self.tempdirs.remove(tdir)
3889 except FileNotFoundError:
3892 except FileNotFoundError:
3890 pass
3893 pass
3891 del self.tempdirs
3894 del self.tempdirs
3892
3895
3893 # Restore user's cursor
3896 # Restore user's cursor
3894 if hasattr(self, "editing_mode") and self.editing_mode == "vi":
3897 if hasattr(self, "editing_mode") and self.editing_mode == "vi":
3895 sys.stdout.write("\x1b[0 q")
3898 sys.stdout.write("\x1b[0 q")
3896 sys.stdout.flush()
3899 sys.stdout.flush()
3897
3900
3898 def cleanup(self):
3901 def cleanup(self):
3899 self.restore_sys_module_state()
3902 self.restore_sys_module_state()
3900
3903
3901
3904
3902 # Overridden in terminal subclass to change prompts
3905 # Overridden in terminal subclass to change prompts
3903 def switch_doctest_mode(self, mode):
3906 def switch_doctest_mode(self, mode):
3904 pass
3907 pass
3905
3908
3906
3909
3907 class InteractiveShellABC(metaclass=abc.ABCMeta):
3910 class InteractiveShellABC(metaclass=abc.ABCMeta):
3908 """An abstract base class for InteractiveShell."""
3911 """An abstract base class for InteractiveShell."""
3909
3912
3910 InteractiveShellABC.register(InteractiveShell)
3913 InteractiveShellABC.register(InteractiveShell)
@@ -1,1522 +1,1614 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Implementation of execution-related magic functions."""
2 """Implementation of execution-related magic functions."""
3
3
4 # Copyright (c) IPython Development Team.
4 # Copyright (c) IPython Development Team.
5 # Distributed under the terms of the Modified BSD License.
5 # Distributed under the terms of the Modified BSD License.
6
6
7
7
8 import ast
8 import ast
9 import bdb
9 import bdb
10 import builtins as builtin_mod
10 import builtins as builtin_mod
11 import copy
11 import cProfile as profile
12 import cProfile as profile
12 import gc
13 import gc
13 import itertools
14 import itertools
14 import math
15 import math
15 import os
16 import os
16 import pstats
17 import pstats
17 import re
18 import re
18 import shlex
19 import shlex
19 import sys
20 import sys
20 import time
21 import time
21 import timeit
22 import timeit
22 from ast import Module
23 from typing import Dict, Any
24 from ast import (
25 Assign,
26 Call,
27 Expr,
28 Load,
29 Module,
30 Name,
31 NodeTransformer,
32 Store,
33 parse,
34 unparse,
35 )
23 from io import StringIO
36 from io import StringIO
24 from logging import error
37 from logging import error
25 from pathlib import Path
38 from pathlib import Path
26 from pdb import Restart
39 from pdb import Restart
40 from textwrap import dedent, indent
27 from warnings import warn
41 from warnings import warn
28
42
29 from IPython.core import magic_arguments, oinspect, page
43 from IPython.core import magic_arguments, oinspect, page
44 from IPython.core.displayhook import DisplayHook
30 from IPython.core.error import UsageError
45 from IPython.core.error import UsageError
31 from IPython.core.macro import Macro
46 from IPython.core.macro import Macro
32 from IPython.core.magic import (
47 from IPython.core.magic import (
33 Magics,
48 Magics,
34 cell_magic,
49 cell_magic,
35 line_cell_magic,
50 line_cell_magic,
36 line_magic,
51 line_magic,
37 magics_class,
52 magics_class,
38 needs_local_scope,
53 needs_local_scope,
39 no_var_expand,
54 no_var_expand,
40 output_can_be_silenced,
41 on_off,
55 on_off,
56 output_can_be_silenced,
42 )
57 )
43 from IPython.testing.skipdoctest import skip_doctest
58 from IPython.testing.skipdoctest import skip_doctest
44 from IPython.utils.capture import capture_output
59 from IPython.utils.capture import capture_output
45 from IPython.utils.contexts import preserve_keys
60 from IPython.utils.contexts import preserve_keys
46 from IPython.utils.ipstruct import Struct
61 from IPython.utils.ipstruct import Struct
47 from IPython.utils.module_paths import find_mod
62 from IPython.utils.module_paths import find_mod
48 from IPython.utils.path import get_py_filename, shellglob
63 from IPython.utils.path import get_py_filename, shellglob
49 from IPython.utils.timing import clock, clock2
64 from IPython.utils.timing import clock, clock2
50 from IPython.core.displayhook import DisplayHook
65 from IPython.core.magics.ast_mod import ReplaceCodeTransformer
51
66
52 #-----------------------------------------------------------------------------
67 #-----------------------------------------------------------------------------
53 # Magic implementation classes
68 # Magic implementation classes
54 #-----------------------------------------------------------------------------
69 #-----------------------------------------------------------------------------
55
70
56
71
57 class TimeitResult(object):
72 class TimeitResult(object):
58 """
73 """
59 Object returned by the timeit magic with info about the run.
74 Object returned by the timeit magic with info about the run.
60
75
61 Contains the following attributes :
76 Contains the following attributes :
62
77
63 loops: (int) number of loops done per measurement
78 loops: (int) number of loops done per measurement
64 repeat: (int) number of times the measurement has been repeated
79 repeat: (int) number of times the measurement has been repeated
65 best: (float) best execution time / number
80 best: (float) best execution time / number
66 all_runs: (list of float) execution time of each run (in s)
81 all_runs: (list of float) execution time of each run (in s)
67 compile_time: (float) time of statement compilation (s)
82 compile_time: (float) time of statement compilation (s)
68
83
69 """
84 """
70 def __init__(self, loops, repeat, best, worst, all_runs, compile_time, precision):
85 def __init__(self, loops, repeat, best, worst, all_runs, compile_time, precision):
71 self.loops = loops
86 self.loops = loops
72 self.repeat = repeat
87 self.repeat = repeat
73 self.best = best
88 self.best = best
74 self.worst = worst
89 self.worst = worst
75 self.all_runs = all_runs
90 self.all_runs = all_runs
76 self.compile_time = compile_time
91 self.compile_time = compile_time
77 self._precision = precision
92 self._precision = precision
78 self.timings = [ dt / self.loops for dt in all_runs]
93 self.timings = [ dt / self.loops for dt in all_runs]
79
94
80 @property
95 @property
81 def average(self):
96 def average(self):
82 return math.fsum(self.timings) / len(self.timings)
97 return math.fsum(self.timings) / len(self.timings)
83
98
84 @property
99 @property
85 def stdev(self):
100 def stdev(self):
86 mean = self.average
101 mean = self.average
87 return (math.fsum([(x - mean) ** 2 for x in self.timings]) / len(self.timings)) ** 0.5
102 return (math.fsum([(x - mean) ** 2 for x in self.timings]) / len(self.timings)) ** 0.5
88
103
89 def __str__(self):
104 def __str__(self):
90 pm = '+-'
105 pm = '+-'
91 if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding:
106 if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding:
92 try:
107 try:
93 u'\xb1'.encode(sys.stdout.encoding)
108 u'\xb1'.encode(sys.stdout.encoding)
94 pm = u'\xb1'
109 pm = u'\xb1'
95 except:
110 except:
96 pass
111 pass
97 return "{mean} {pm} {std} per loop (mean {pm} std. dev. of {runs} run{run_plural}, {loops:,} loop{loop_plural} each)".format(
112 return "{mean} {pm} {std} per loop (mean {pm} std. dev. of {runs} run{run_plural}, {loops:,} loop{loop_plural} each)".format(
98 pm=pm,
113 pm=pm,
99 runs=self.repeat,
114 runs=self.repeat,
100 loops=self.loops,
115 loops=self.loops,
101 loop_plural="" if self.loops == 1 else "s",
116 loop_plural="" if self.loops == 1 else "s",
102 run_plural="" if self.repeat == 1 else "s",
117 run_plural="" if self.repeat == 1 else "s",
103 mean=_format_time(self.average, self._precision),
118 mean=_format_time(self.average, self._precision),
104 std=_format_time(self.stdev, self._precision),
119 std=_format_time(self.stdev, self._precision),
105 )
120 )
106
121
107 def _repr_pretty_(self, p , cycle):
122 def _repr_pretty_(self, p , cycle):
108 unic = self.__str__()
123 unic = self.__str__()
109 p.text(u'<TimeitResult : '+unic+u'>')
124 p.text(u'<TimeitResult : '+unic+u'>')
110
125
111
126
112 class TimeitTemplateFiller(ast.NodeTransformer):
127 class TimeitTemplateFiller(ast.NodeTransformer):
113 """Fill in the AST template for timing execution.
128 """Fill in the AST template for timing execution.
114
129
115 This is quite closely tied to the template definition, which is in
130 This is quite closely tied to the template definition, which is in
116 :meth:`ExecutionMagics.timeit`.
131 :meth:`ExecutionMagics.timeit`.
117 """
132 """
118 def __init__(self, ast_setup, ast_stmt):
133 def __init__(self, ast_setup, ast_stmt):
119 self.ast_setup = ast_setup
134 self.ast_setup = ast_setup
120 self.ast_stmt = ast_stmt
135 self.ast_stmt = ast_stmt
121
136
122 def visit_FunctionDef(self, node):
137 def visit_FunctionDef(self, node):
123 "Fill in the setup statement"
138 "Fill in the setup statement"
124 self.generic_visit(node)
139 self.generic_visit(node)
125 if node.name == "inner":
140 if node.name == "inner":
126 node.body[:1] = self.ast_setup.body
141 node.body[:1] = self.ast_setup.body
127
142
128 return node
143 return node
129
144
130 def visit_For(self, node):
145 def visit_For(self, node):
131 "Fill in the statement to be timed"
146 "Fill in the statement to be timed"
132 if getattr(getattr(node.body[0], 'value', None), 'id', None) == 'stmt':
147 if getattr(getattr(node.body[0], 'value', None), 'id', None) == 'stmt':
133 node.body = self.ast_stmt.body
148 node.body = self.ast_stmt.body
134 return node
149 return node
135
150
136
151
137 class Timer(timeit.Timer):
152 class Timer(timeit.Timer):
138 """Timer class that explicitly uses self.inner
153 """Timer class that explicitly uses self.inner
139
154
140 which is an undocumented implementation detail of CPython,
155 which is an undocumented implementation detail of CPython,
141 not shared by PyPy.
156 not shared by PyPy.
142 """
157 """
143 # Timer.timeit copied from CPython 3.4.2
158 # Timer.timeit copied from CPython 3.4.2
144 def timeit(self, number=timeit.default_number):
159 def timeit(self, number=timeit.default_number):
145 """Time 'number' executions of the main statement.
160 """Time 'number' executions of the main statement.
146
161
147 To be precise, this executes the setup statement once, and
162 To be precise, this executes the setup statement once, and
148 then returns the time it takes to execute the main statement
163 then returns the time it takes to execute the main statement
149 a number of times, as a float measured in seconds. The
164 a number of times, as a float measured in seconds. The
150 argument is the number of times through the loop, defaulting
165 argument is the number of times through the loop, defaulting
151 to one million. The main statement, the setup statement and
166 to one million. The main statement, the setup statement and
152 the timer function to be used are passed to the constructor.
167 the timer function to be used are passed to the constructor.
153 """
168 """
154 it = itertools.repeat(None, number)
169 it = itertools.repeat(None, number)
155 gcold = gc.isenabled()
170 gcold = gc.isenabled()
156 gc.disable()
171 gc.disable()
157 try:
172 try:
158 timing = self.inner(it, self.timer)
173 timing = self.inner(it, self.timer)
159 finally:
174 finally:
160 if gcold:
175 if gcold:
161 gc.enable()
176 gc.enable()
162 return timing
177 return timing
163
178
164
179
165 @magics_class
180 @magics_class
166 class ExecutionMagics(Magics):
181 class ExecutionMagics(Magics):
167 """Magics related to code execution, debugging, profiling, etc.
182 """Magics related to code execution, debugging, profiling, etc."""
168
183
169 """
184 _transformers: Dict[str, Any] = {}
170
185
171 def __init__(self, shell):
186 def __init__(self, shell):
172 super(ExecutionMagics, self).__init__(shell)
187 super(ExecutionMagics, self).__init__(shell)
173 # Default execution function used to actually run user code.
188 # Default execution function used to actually run user code.
174 self.default_runner = None
189 self.default_runner = None
175
190
176 @skip_doctest
191 @skip_doctest
177 @no_var_expand
192 @no_var_expand
178 @line_cell_magic
193 @line_cell_magic
179 def prun(self, parameter_s='', cell=None):
194 def prun(self, parameter_s='', cell=None):
180
195
181 """Run a statement through the python code profiler.
196 """Run a statement through the python code profiler.
182
197
183 Usage, in line mode:
198 Usage, in line mode:
184 %prun [options] statement
199 %prun [options] statement
185
200
186 Usage, in cell mode:
201 Usage, in cell mode:
187 %%prun [options] [statement]
202 %%prun [options] [statement]
188 code...
203 code...
189 code...
204 code...
190
205
191 In cell mode, the additional code lines are appended to the (possibly
206 In cell mode, the additional code lines are appended to the (possibly
192 empty) statement in the first line. Cell mode allows you to easily
207 empty) statement in the first line. Cell mode allows you to easily
193 profile multiline blocks without having to put them in a separate
208 profile multiline blocks without having to put them in a separate
194 function.
209 function.
195
210
196 The given statement (which doesn't require quote marks) is run via the
211 The given statement (which doesn't require quote marks) is run via the
197 python profiler in a manner similar to the profile.run() function.
212 python profiler in a manner similar to the profile.run() function.
198 Namespaces are internally managed to work correctly; profile.run
213 Namespaces are internally managed to work correctly; profile.run
199 cannot be used in IPython because it makes certain assumptions about
214 cannot be used in IPython because it makes certain assumptions about
200 namespaces which do not hold under IPython.
215 namespaces which do not hold under IPython.
201
216
202 Options:
217 Options:
203
218
204 -l <limit>
219 -l <limit>
205 you can place restrictions on what or how much of the
220 you can place restrictions on what or how much of the
206 profile gets printed. The limit value can be:
221 profile gets printed. The limit value can be:
207
222
208 * A string: only information for function names containing this string
223 * A string: only information for function names containing this string
209 is printed.
224 is printed.
210
225
211 * An integer: only these many lines are printed.
226 * An integer: only these many lines are printed.
212
227
213 * A float (between 0 and 1): this fraction of the report is printed
228 * A float (between 0 and 1): this fraction of the report is printed
214 (for example, use a limit of 0.4 to see the topmost 40% only).
229 (for example, use a limit of 0.4 to see the topmost 40% only).
215
230
216 You can combine several limits with repeated use of the option. For
231 You can combine several limits with repeated use of the option. For
217 example, ``-l __init__ -l 5`` will print only the topmost 5 lines of
232 example, ``-l __init__ -l 5`` will print only the topmost 5 lines of
218 information about class constructors.
233 information about class constructors.
219
234
220 -r
235 -r
221 return the pstats.Stats object generated by the profiling. This
236 return the pstats.Stats object generated by the profiling. This
222 object has all the information about the profile in it, and you can
237 object has all the information about the profile in it, and you can
223 later use it for further analysis or in other functions.
238 later use it for further analysis or in other functions.
224
239
225 -s <key>
240 -s <key>
226 sort profile by given key. You can provide more than one key
241 sort profile by given key. You can provide more than one key
227 by using the option several times: '-s key1 -s key2 -s key3...'. The
242 by using the option several times: '-s key1 -s key2 -s key3...'. The
228 default sorting key is 'time'.
243 default sorting key is 'time'.
229
244
230 The following is copied verbatim from the profile documentation
245 The following is copied verbatim from the profile documentation
231 referenced below:
246 referenced below:
232
247
233 When more than one key is provided, additional keys are used as
248 When more than one key is provided, additional keys are used as
234 secondary criteria when the there is equality in all keys selected
249 secondary criteria when the there is equality in all keys selected
235 before them.
250 before them.
236
251
237 Abbreviations can be used for any key names, as long as the
252 Abbreviations can be used for any key names, as long as the
238 abbreviation is unambiguous. The following are the keys currently
253 abbreviation is unambiguous. The following are the keys currently
239 defined:
254 defined:
240
255
241 ============ =====================
256 ============ =====================
242 Valid Arg Meaning
257 Valid Arg Meaning
243 ============ =====================
258 ============ =====================
244 "calls" call count
259 "calls" call count
245 "cumulative" cumulative time
260 "cumulative" cumulative time
246 "file" file name
261 "file" file name
247 "module" file name
262 "module" file name
248 "pcalls" primitive call count
263 "pcalls" primitive call count
249 "line" line number
264 "line" line number
250 "name" function name
265 "name" function name
251 "nfl" name/file/line
266 "nfl" name/file/line
252 "stdname" standard name
267 "stdname" standard name
253 "time" internal time
268 "time" internal time
254 ============ =====================
269 ============ =====================
255
270
256 Note that all sorts on statistics are in descending order (placing
271 Note that all sorts on statistics are in descending order (placing
257 most time consuming items first), where as name, file, and line number
272 most time consuming items first), where as name, file, and line number
258 searches are in ascending order (i.e., alphabetical). The subtle
273 searches are in ascending order (i.e., alphabetical). The subtle
259 distinction between "nfl" and "stdname" is that the standard name is a
274 distinction between "nfl" and "stdname" is that the standard name is a
260 sort of the name as printed, which means that the embedded line
275 sort of the name as printed, which means that the embedded line
261 numbers get compared in an odd way. For example, lines 3, 20, and 40
276 numbers get compared in an odd way. For example, lines 3, 20, and 40
262 would (if the file names were the same) appear in the string order
277 would (if the file names were the same) appear in the string order
263 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
278 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
264 line numbers. In fact, sort_stats("nfl") is the same as
279 line numbers. In fact, sort_stats("nfl") is the same as
265 sort_stats("name", "file", "line").
280 sort_stats("name", "file", "line").
266
281
267 -T <filename>
282 -T <filename>
268 save profile results as shown on screen to a text
283 save profile results as shown on screen to a text
269 file. The profile is still shown on screen.
284 file. The profile is still shown on screen.
270
285
271 -D <filename>
286 -D <filename>
272 save (via dump_stats) profile statistics to given
287 save (via dump_stats) profile statistics to given
273 filename. This data is in a format understood by the pstats module, and
288 filename. This data is in a format understood by the pstats module, and
274 is generated by a call to the dump_stats() method of profile
289 is generated by a call to the dump_stats() method of profile
275 objects. The profile is still shown on screen.
290 objects. The profile is still shown on screen.
276
291
277 -q
292 -q
278 suppress output to the pager. Best used with -T and/or -D above.
293 suppress output to the pager. Best used with -T and/or -D above.
279
294
280 If you want to run complete programs under the profiler's control, use
295 If you want to run complete programs under the profiler's control, use
281 ``%run -p [prof_opts] filename.py [args to program]`` where prof_opts
296 ``%run -p [prof_opts] filename.py [args to program]`` where prof_opts
282 contains profiler specific options as described here.
297 contains profiler specific options as described here.
283
298
284 You can read the complete documentation for the profile module with::
299 You can read the complete documentation for the profile module with::
285
300
286 In [1]: import profile; profile.help()
301 In [1]: import profile; profile.help()
287
302
288 .. versionchanged:: 7.3
303 .. versionchanged:: 7.3
289 User variables are no longer expanded,
304 User variables are no longer expanded,
290 the magic line is always left unmodified.
305 the magic line is always left unmodified.
291
306
292 """
307 """
293 opts, arg_str = self.parse_options(parameter_s, 'D:l:rs:T:q',
308 opts, arg_str = self.parse_options(parameter_s, 'D:l:rs:T:q',
294 list_all=True, posix=False)
309 list_all=True, posix=False)
295 if cell is not None:
310 if cell is not None:
296 arg_str += '\n' + cell
311 arg_str += '\n' + cell
297 arg_str = self.shell.transform_cell(arg_str)
312 arg_str = self.shell.transform_cell(arg_str)
298 return self._run_with_profiler(arg_str, opts, self.shell.user_ns)
313 return self._run_with_profiler(arg_str, opts, self.shell.user_ns)
299
314
300 def _run_with_profiler(self, code, opts, namespace):
315 def _run_with_profiler(self, code, opts, namespace):
301 """
316 """
302 Run `code` with profiler. Used by ``%prun`` and ``%run -p``.
317 Run `code` with profiler. Used by ``%prun`` and ``%run -p``.
303
318
304 Parameters
319 Parameters
305 ----------
320 ----------
306 code : str
321 code : str
307 Code to be executed.
322 Code to be executed.
308 opts : Struct
323 opts : Struct
309 Options parsed by `self.parse_options`.
324 Options parsed by `self.parse_options`.
310 namespace : dict
325 namespace : dict
311 A dictionary for Python namespace (e.g., `self.shell.user_ns`).
326 A dictionary for Python namespace (e.g., `self.shell.user_ns`).
312
327
313 """
328 """
314
329
315 # Fill default values for unspecified options:
330 # Fill default values for unspecified options:
316 opts.merge(Struct(D=[''], l=[], s=['time'], T=['']))
331 opts.merge(Struct(D=[''], l=[], s=['time'], T=['']))
317
332
318 prof = profile.Profile()
333 prof = profile.Profile()
319 try:
334 try:
320 prof = prof.runctx(code, namespace, namespace)
335 prof = prof.runctx(code, namespace, namespace)
321 sys_exit = ''
336 sys_exit = ''
322 except SystemExit:
337 except SystemExit:
323 sys_exit = """*** SystemExit exception caught in code being profiled."""
338 sys_exit = """*** SystemExit exception caught in code being profiled."""
324
339
325 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
340 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
326
341
327 lims = opts.l
342 lims = opts.l
328 if lims:
343 if lims:
329 lims = [] # rebuild lims with ints/floats/strings
344 lims = [] # rebuild lims with ints/floats/strings
330 for lim in opts.l:
345 for lim in opts.l:
331 try:
346 try:
332 lims.append(int(lim))
347 lims.append(int(lim))
333 except ValueError:
348 except ValueError:
334 try:
349 try:
335 lims.append(float(lim))
350 lims.append(float(lim))
336 except ValueError:
351 except ValueError:
337 lims.append(lim)
352 lims.append(lim)
338
353
339 # Trap output.
354 # Trap output.
340 stdout_trap = StringIO()
355 stdout_trap = StringIO()
341 stats_stream = stats.stream
356 stats_stream = stats.stream
342 try:
357 try:
343 stats.stream = stdout_trap
358 stats.stream = stdout_trap
344 stats.print_stats(*lims)
359 stats.print_stats(*lims)
345 finally:
360 finally:
346 stats.stream = stats_stream
361 stats.stream = stats_stream
347
362
348 output = stdout_trap.getvalue()
363 output = stdout_trap.getvalue()
349 output = output.rstrip()
364 output = output.rstrip()
350
365
351 if 'q' not in opts:
366 if 'q' not in opts:
352 page.page(output)
367 page.page(output)
353 print(sys_exit, end=' ')
368 print(sys_exit, end=' ')
354
369
355 dump_file = opts.D[0]
370 dump_file = opts.D[0]
356 text_file = opts.T[0]
371 text_file = opts.T[0]
357 if dump_file:
372 if dump_file:
358 prof.dump_stats(dump_file)
373 prof.dump_stats(dump_file)
359 print(
374 print(
360 f"\n*** Profile stats marshalled to file {repr(dump_file)}.{sys_exit}"
375 f"\n*** Profile stats marshalled to file {repr(dump_file)}.{sys_exit}"
361 )
376 )
362 if text_file:
377 if text_file:
363 pfile = Path(text_file)
378 pfile = Path(text_file)
364 pfile.touch(exist_ok=True)
379 pfile.touch(exist_ok=True)
365 pfile.write_text(output, encoding="utf-8")
380 pfile.write_text(output, encoding="utf-8")
366
381
367 print(
382 print(
368 f"\n*** Profile printout saved to text file {repr(text_file)}.{sys_exit}"
383 f"\n*** Profile printout saved to text file {repr(text_file)}.{sys_exit}"
369 )
384 )
370
385
371 if 'r' in opts:
386 if 'r' in opts:
372 return stats
387 return stats
373
388
374 return None
389 return None
375
390
376 @line_magic
391 @line_magic
377 def pdb(self, parameter_s=''):
392 def pdb(self, parameter_s=''):
378 """Control the automatic calling of the pdb interactive debugger.
393 """Control the automatic calling of the pdb interactive debugger.
379
394
380 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
395 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
381 argument it works as a toggle.
396 argument it works as a toggle.
382
397
383 When an exception is triggered, IPython can optionally call the
398 When an exception is triggered, IPython can optionally call the
384 interactive pdb debugger after the traceback printout. %pdb toggles
399 interactive pdb debugger after the traceback printout. %pdb toggles
385 this feature on and off.
400 this feature on and off.
386
401
387 The initial state of this feature is set in your configuration
402 The initial state of this feature is set in your configuration
388 file (the option is ``InteractiveShell.pdb``).
403 file (the option is ``InteractiveShell.pdb``).
389
404
390 If you want to just activate the debugger AFTER an exception has fired,
405 If you want to just activate the debugger AFTER an exception has fired,
391 without having to type '%pdb on' and rerunning your code, you can use
406 without having to type '%pdb on' and rerunning your code, you can use
392 the %debug magic."""
407 the %debug magic."""
393
408
394 par = parameter_s.strip().lower()
409 par = parameter_s.strip().lower()
395
410
396 if par:
411 if par:
397 try:
412 try:
398 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
413 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
399 except KeyError:
414 except KeyError:
400 print ('Incorrect argument. Use on/1, off/0, '
415 print ('Incorrect argument. Use on/1, off/0, '
401 'or nothing for a toggle.')
416 'or nothing for a toggle.')
402 return
417 return
403 else:
418 else:
404 # toggle
419 # toggle
405 new_pdb = not self.shell.call_pdb
420 new_pdb = not self.shell.call_pdb
406
421
407 # set on the shell
422 # set on the shell
408 self.shell.call_pdb = new_pdb
423 self.shell.call_pdb = new_pdb
409 print('Automatic pdb calling has been turned',on_off(new_pdb))
424 print('Automatic pdb calling has been turned',on_off(new_pdb))
410
425
411 @magic_arguments.magic_arguments()
426 @magic_arguments.magic_arguments()
412 @magic_arguments.argument('--breakpoint', '-b', metavar='FILE:LINE',
427 @magic_arguments.argument('--breakpoint', '-b', metavar='FILE:LINE',
413 help="""
428 help="""
414 Set break point at LINE in FILE.
429 Set break point at LINE in FILE.
415 """
430 """
416 )
431 )
417 @magic_arguments.argument('statement', nargs='*',
432 @magic_arguments.argument('statement', nargs='*',
418 help="""
433 help="""
419 Code to run in debugger.
434 Code to run in debugger.
420 You can omit this in cell magic mode.
435 You can omit this in cell magic mode.
421 """
436 """
422 )
437 )
423 @no_var_expand
438 @no_var_expand
424 @line_cell_magic
439 @line_cell_magic
425 @needs_local_scope
440 @needs_local_scope
426 def debug(self, line="", cell=None, local_ns=None):
441 def debug(self, line="", cell=None, local_ns=None):
427 """Activate the interactive debugger.
442 """Activate the interactive debugger.
428
443
429 This magic command support two ways of activating debugger.
444 This magic command support two ways of activating debugger.
430 One is to activate debugger before executing code. This way, you
445 One is to activate debugger before executing code. This way, you
431 can set a break point, to step through the code from the point.
446 can set a break point, to step through the code from the point.
432 You can use this mode by giving statements to execute and optionally
447 You can use this mode by giving statements to execute and optionally
433 a breakpoint.
448 a breakpoint.
434
449
435 The other one is to activate debugger in post-mortem mode. You can
450 The other one is to activate debugger in post-mortem mode. You can
436 activate this mode simply running %debug without any argument.
451 activate this mode simply running %debug without any argument.
437 If an exception has just occurred, this lets you inspect its stack
452 If an exception has just occurred, this lets you inspect its stack
438 frames interactively. Note that this will always work only on the last
453 frames interactively. Note that this will always work only on the last
439 traceback that occurred, so you must call this quickly after an
454 traceback that occurred, so you must call this quickly after an
440 exception that you wish to inspect has fired, because if another one
455 exception that you wish to inspect has fired, because if another one
441 occurs, it clobbers the previous one.
456 occurs, it clobbers the previous one.
442
457
443 If you want IPython to automatically do this on every exception, see
458 If you want IPython to automatically do this on every exception, see
444 the %pdb magic for more details.
459 the %pdb magic for more details.
445
460
446 .. versionchanged:: 7.3
461 .. versionchanged:: 7.3
447 When running code, user variables are no longer expanded,
462 When running code, user variables are no longer expanded,
448 the magic line is always left unmodified.
463 the magic line is always left unmodified.
449
464
450 """
465 """
451 args = magic_arguments.parse_argstring(self.debug, line)
466 args = magic_arguments.parse_argstring(self.debug, line)
452
467
453 if not (args.breakpoint or args.statement or cell):
468 if not (args.breakpoint or args.statement or cell):
454 self._debug_post_mortem()
469 self._debug_post_mortem()
455 elif not (args.breakpoint or cell):
470 elif not (args.breakpoint or cell):
456 # If there is no breakpoints, the line is just code to execute
471 # If there is no breakpoints, the line is just code to execute
457 self._debug_exec(line, None, local_ns)
472 self._debug_exec(line, None, local_ns)
458 else:
473 else:
459 # Here we try to reconstruct the code from the output of
474 # Here we try to reconstruct the code from the output of
460 # parse_argstring. This might not work if the code has spaces
475 # parse_argstring. This might not work if the code has spaces
461 # For example this fails for `print("a b")`
476 # For example this fails for `print("a b")`
462 code = "\n".join(args.statement)
477 code = "\n".join(args.statement)
463 if cell:
478 if cell:
464 code += "\n" + cell
479 code += "\n" + cell
465 self._debug_exec(code, args.breakpoint, local_ns)
480 self._debug_exec(code, args.breakpoint, local_ns)
466
481
467 def _debug_post_mortem(self):
482 def _debug_post_mortem(self):
468 self.shell.debugger(force=True)
483 self.shell.debugger(force=True)
469
484
470 def _debug_exec(self, code, breakpoint, local_ns=None):
485 def _debug_exec(self, code, breakpoint, local_ns=None):
471 if breakpoint:
486 if breakpoint:
472 (filename, bp_line) = breakpoint.rsplit(':', 1)
487 (filename, bp_line) = breakpoint.rsplit(':', 1)
473 bp_line = int(bp_line)
488 bp_line = int(bp_line)
474 else:
489 else:
475 (filename, bp_line) = (None, None)
490 (filename, bp_line) = (None, None)
476 self._run_with_debugger(
491 self._run_with_debugger(
477 code, self.shell.user_ns, filename, bp_line, local_ns=local_ns
492 code, self.shell.user_ns, filename, bp_line, local_ns=local_ns
478 )
493 )
479
494
480 @line_magic
495 @line_magic
481 def tb(self, s):
496 def tb(self, s):
482 """Print the last traceback.
497 """Print the last traceback.
483
498
484 Optionally, specify an exception reporting mode, tuning the
499 Optionally, specify an exception reporting mode, tuning the
485 verbosity of the traceback. By default the currently-active exception
500 verbosity of the traceback. By default the currently-active exception
486 mode is used. See %xmode for changing exception reporting modes.
501 mode is used. See %xmode for changing exception reporting modes.
487
502
488 Valid modes: Plain, Context, Verbose, and Minimal.
503 Valid modes: Plain, Context, Verbose, and Minimal.
489 """
504 """
490 interactive_tb = self.shell.InteractiveTB
505 interactive_tb = self.shell.InteractiveTB
491 if s:
506 if s:
492 # Switch exception reporting mode for this one call.
507 # Switch exception reporting mode for this one call.
493 # Ensure it is switched back.
508 # Ensure it is switched back.
494 def xmode_switch_err(name):
509 def xmode_switch_err(name):
495 warn('Error changing %s exception modes.\n%s' %
510 warn('Error changing %s exception modes.\n%s' %
496 (name,sys.exc_info()[1]))
511 (name,sys.exc_info()[1]))
497
512
498 new_mode = s.strip().capitalize()
513 new_mode = s.strip().capitalize()
499 original_mode = interactive_tb.mode
514 original_mode = interactive_tb.mode
500 try:
515 try:
501 try:
516 try:
502 interactive_tb.set_mode(mode=new_mode)
517 interactive_tb.set_mode(mode=new_mode)
503 except Exception:
518 except Exception:
504 xmode_switch_err('user')
519 xmode_switch_err('user')
505 else:
520 else:
506 self.shell.showtraceback()
521 self.shell.showtraceback()
507 finally:
522 finally:
508 interactive_tb.set_mode(mode=original_mode)
523 interactive_tb.set_mode(mode=original_mode)
509 else:
524 else:
510 self.shell.showtraceback()
525 self.shell.showtraceback()
511
526
512 @skip_doctest
527 @skip_doctest
513 @line_magic
528 @line_magic
514 def run(self, parameter_s='', runner=None,
529 def run(self, parameter_s='', runner=None,
515 file_finder=get_py_filename):
530 file_finder=get_py_filename):
516 """Run the named file inside IPython as a program.
531 """Run the named file inside IPython as a program.
517
532
518 Usage::
533 Usage::
519
534
520 %run [-n -i -e -G]
535 %run [-n -i -e -G]
521 [( -t [-N<N>] | -d [-b<N>] | -p [profile options] )]
536 [( -t [-N<N>] | -d [-b<N>] | -p [profile options] )]
522 ( -m mod | filename ) [args]
537 ( -m mod | filename ) [args]
523
538
524 The filename argument should be either a pure Python script (with
539 The filename argument should be either a pure Python script (with
525 extension ``.py``), or a file with custom IPython syntax (such as
540 extension ``.py``), or a file with custom IPython syntax (such as
526 magics). If the latter, the file can be either a script with ``.ipy``
541 magics). If the latter, the file can be either a script with ``.ipy``
527 extension, or a Jupyter notebook with ``.ipynb`` extension. When running
542 extension, or a Jupyter notebook with ``.ipynb`` extension. When running
528 a Jupyter notebook, the output from print statements and other
543 a Jupyter notebook, the output from print statements and other
529 displayed objects will appear in the terminal (even matplotlib figures
544 displayed objects will appear in the terminal (even matplotlib figures
530 will open, if a terminal-compliant backend is being used). Note that,
545 will open, if a terminal-compliant backend is being used). Note that,
531 at the system command line, the ``jupyter run`` command offers similar
546 at the system command line, the ``jupyter run`` command offers similar
532 functionality for executing notebooks (albeit currently with some
547 functionality for executing notebooks (albeit currently with some
533 differences in supported options).
548 differences in supported options).
534
549
535 Parameters after the filename are passed as command-line arguments to
550 Parameters after the filename are passed as command-line arguments to
536 the program (put in sys.argv). Then, control returns to IPython's
551 the program (put in sys.argv). Then, control returns to IPython's
537 prompt.
552 prompt.
538
553
539 This is similar to running at a system prompt ``python file args``,
554 This is similar to running at a system prompt ``python file args``,
540 but with the advantage of giving you IPython's tracebacks, and of
555 but with the advantage of giving you IPython's tracebacks, and of
541 loading all variables into your interactive namespace for further use
556 loading all variables into your interactive namespace for further use
542 (unless -p is used, see below).
557 (unless -p is used, see below).
543
558
544 The file is executed in a namespace initially consisting only of
559 The file is executed in a namespace initially consisting only of
545 ``__name__=='__main__'`` and sys.argv constructed as indicated. It thus
560 ``__name__=='__main__'`` and sys.argv constructed as indicated. It thus
546 sees its environment as if it were being run as a stand-alone program
561 sees its environment as if it were being run as a stand-alone program
547 (except for sharing global objects such as previously imported
562 (except for sharing global objects such as previously imported
548 modules). But after execution, the IPython interactive namespace gets
563 modules). But after execution, the IPython interactive namespace gets
549 updated with all variables defined in the program (except for __name__
564 updated with all variables defined in the program (except for __name__
550 and sys.argv). This allows for very convenient loading of code for
565 and sys.argv). This allows for very convenient loading of code for
551 interactive work, while giving each program a 'clean sheet' to run in.
566 interactive work, while giving each program a 'clean sheet' to run in.
552
567
553 Arguments are expanded using shell-like glob match. Patterns
568 Arguments are expanded using shell-like glob match. Patterns
554 '*', '?', '[seq]' and '[!seq]' can be used. Additionally,
569 '*', '?', '[seq]' and '[!seq]' can be used. Additionally,
555 tilde '~' will be expanded into user's home directory. Unlike
570 tilde '~' will be expanded into user's home directory. Unlike
556 real shells, quotation does not suppress expansions. Use
571 real shells, quotation does not suppress expansions. Use
557 *two* back slashes (e.g. ``\\\\*``) to suppress expansions.
572 *two* back slashes (e.g. ``\\\\*``) to suppress expansions.
558 To completely disable these expansions, you can use -G flag.
573 To completely disable these expansions, you can use -G flag.
559
574
560 On Windows systems, the use of single quotes `'` when specifying
575 On Windows systems, the use of single quotes `'` when specifying
561 a file is not supported. Use double quotes `"`.
576 a file is not supported. Use double quotes `"`.
562
577
563 Options:
578 Options:
564
579
565 -n
580 -n
566 __name__ is NOT set to '__main__', but to the running file's name
581 __name__ is NOT set to '__main__', but to the running file's name
567 without extension (as python does under import). This allows running
582 without extension (as python does under import). This allows running
568 scripts and reloading the definitions in them without calling code
583 scripts and reloading the definitions in them without calling code
569 protected by an ``if __name__ == "__main__"`` clause.
584 protected by an ``if __name__ == "__main__"`` clause.
570
585
571 -i
586 -i
572 run the file in IPython's namespace instead of an empty one. This
587 run the file in IPython's namespace instead of an empty one. This
573 is useful if you are experimenting with code written in a text editor
588 is useful if you are experimenting with code written in a text editor
574 which depends on variables defined interactively.
589 which depends on variables defined interactively.
575
590
576 -e
591 -e
577 ignore sys.exit() calls or SystemExit exceptions in the script
592 ignore sys.exit() calls or SystemExit exceptions in the script
578 being run. This is particularly useful if IPython is being used to
593 being run. This is particularly useful if IPython is being used to
579 run unittests, which always exit with a sys.exit() call. In such
594 run unittests, which always exit with a sys.exit() call. In such
580 cases you are interested in the output of the test results, not in
595 cases you are interested in the output of the test results, not in
581 seeing a traceback of the unittest module.
596 seeing a traceback of the unittest module.
582
597
583 -t
598 -t
584 print timing information at the end of the run. IPython will give
599 print timing information at the end of the run. IPython will give
585 you an estimated CPU time consumption for your script, which under
600 you an estimated CPU time consumption for your script, which under
586 Unix uses the resource module to avoid the wraparound problems of
601 Unix uses the resource module to avoid the wraparound problems of
587 time.clock(). Under Unix, an estimate of time spent on system tasks
602 time.clock(). Under Unix, an estimate of time spent on system tasks
588 is also given (for Windows platforms this is reported as 0.0).
603 is also given (for Windows platforms this is reported as 0.0).
589
604
590 If -t is given, an additional ``-N<N>`` option can be given, where <N>
605 If -t is given, an additional ``-N<N>`` option can be given, where <N>
591 must be an integer indicating how many times you want the script to
606 must be an integer indicating how many times you want the script to
592 run. The final timing report will include total and per run results.
607 run. The final timing report will include total and per run results.
593
608
594 For example (testing the script uniq_stable.py)::
609 For example (testing the script uniq_stable.py)::
595
610
596 In [1]: run -t uniq_stable
611 In [1]: run -t uniq_stable
597
612
598 IPython CPU timings (estimated):
613 IPython CPU timings (estimated):
599 User : 0.19597 s.
614 User : 0.19597 s.
600 System: 0.0 s.
615 System: 0.0 s.
601
616
602 In [2]: run -t -N5 uniq_stable
617 In [2]: run -t -N5 uniq_stable
603
618
604 IPython CPU timings (estimated):
619 IPython CPU timings (estimated):
605 Total runs performed: 5
620 Total runs performed: 5
606 Times : Total Per run
621 Times : Total Per run
607 User : 0.910862 s, 0.1821724 s.
622 User : 0.910862 s, 0.1821724 s.
608 System: 0.0 s, 0.0 s.
623 System: 0.0 s, 0.0 s.
609
624
610 -d
625 -d
611 run your program under the control of pdb, the Python debugger.
626 run your program under the control of pdb, the Python debugger.
612 This allows you to execute your program step by step, watch variables,
627 This allows you to execute your program step by step, watch variables,
613 etc. Internally, what IPython does is similar to calling::
628 etc. Internally, what IPython does is similar to calling::
614
629
615 pdb.run('execfile("YOURFILENAME")')
630 pdb.run('execfile("YOURFILENAME")')
616
631
617 with a breakpoint set on line 1 of your file. You can change the line
632 with a breakpoint set on line 1 of your file. You can change the line
618 number for this automatic breakpoint to be <N> by using the -bN option
633 number for this automatic breakpoint to be <N> by using the -bN option
619 (where N must be an integer). For example::
634 (where N must be an integer). For example::
620
635
621 %run -d -b40 myscript
636 %run -d -b40 myscript
622
637
623 will set the first breakpoint at line 40 in myscript.py. Note that
638 will set the first breakpoint at line 40 in myscript.py. Note that
624 the first breakpoint must be set on a line which actually does
639 the first breakpoint must be set on a line which actually does
625 something (not a comment or docstring) for it to stop execution.
640 something (not a comment or docstring) for it to stop execution.
626
641
627 Or you can specify a breakpoint in a different file::
642 Or you can specify a breakpoint in a different file::
628
643
629 %run -d -b myotherfile.py:20 myscript
644 %run -d -b myotherfile.py:20 myscript
630
645
631 When the pdb debugger starts, you will see a (Pdb) prompt. You must
646 When the pdb debugger starts, you will see a (Pdb) prompt. You must
632 first enter 'c' (without quotes) to start execution up to the first
647 first enter 'c' (without quotes) to start execution up to the first
633 breakpoint.
648 breakpoint.
634
649
635 Entering 'help' gives information about the use of the debugger. You
650 Entering 'help' gives information about the use of the debugger. You
636 can easily see pdb's full documentation with "import pdb;pdb.help()"
651 can easily see pdb's full documentation with "import pdb;pdb.help()"
637 at a prompt.
652 at a prompt.
638
653
639 -p
654 -p
640 run program under the control of the Python profiler module (which
655 run program under the control of the Python profiler module (which
641 prints a detailed report of execution times, function calls, etc).
656 prints a detailed report of execution times, function calls, etc).
642
657
643 You can pass other options after -p which affect the behavior of the
658 You can pass other options after -p which affect the behavior of the
644 profiler itself. See the docs for %prun for details.
659 profiler itself. See the docs for %prun for details.
645
660
646 In this mode, the program's variables do NOT propagate back to the
661 In this mode, the program's variables do NOT propagate back to the
647 IPython interactive namespace (because they remain in the namespace
662 IPython interactive namespace (because they remain in the namespace
648 where the profiler executes them).
663 where the profiler executes them).
649
664
650 Internally this triggers a call to %prun, see its documentation for
665 Internally this triggers a call to %prun, see its documentation for
651 details on the options available specifically for profiling.
666 details on the options available specifically for profiling.
652
667
653 There is one special usage for which the text above doesn't apply:
668 There is one special usage for which the text above doesn't apply:
654 if the filename ends with .ipy[nb], the file is run as ipython script,
669 if the filename ends with .ipy[nb], the file is run as ipython script,
655 just as if the commands were written on IPython prompt.
670 just as if the commands were written on IPython prompt.
656
671
657 -m
672 -m
658 specify module name to load instead of script path. Similar to
673 specify module name to load instead of script path. Similar to
659 the -m option for the python interpreter. Use this option last if you
674 the -m option for the python interpreter. Use this option last if you
660 want to combine with other %run options. Unlike the python interpreter
675 want to combine with other %run options. Unlike the python interpreter
661 only source modules are allowed no .pyc or .pyo files.
676 only source modules are allowed no .pyc or .pyo files.
662 For example::
677 For example::
663
678
664 %run -m example
679 %run -m example
665
680
666 will run the example module.
681 will run the example module.
667
682
668 -G
683 -G
669 disable shell-like glob expansion of arguments.
684 disable shell-like glob expansion of arguments.
670
685
671 """
686 """
672
687
673 # Logic to handle issue #3664
688 # Logic to handle issue #3664
674 # Add '--' after '-m <module_name>' to ignore additional args passed to a module.
689 # Add '--' after '-m <module_name>' to ignore additional args passed to a module.
675 if '-m' in parameter_s and '--' not in parameter_s:
690 if '-m' in parameter_s and '--' not in parameter_s:
676 argv = shlex.split(parameter_s, posix=(os.name == 'posix'))
691 argv = shlex.split(parameter_s, posix=(os.name == 'posix'))
677 for idx, arg in enumerate(argv):
692 for idx, arg in enumerate(argv):
678 if arg and arg.startswith('-') and arg != '-':
693 if arg and arg.startswith('-') and arg != '-':
679 if arg == '-m':
694 if arg == '-m':
680 argv.insert(idx + 2, '--')
695 argv.insert(idx + 2, '--')
681 break
696 break
682 else:
697 else:
683 # Positional arg, break
698 # Positional arg, break
684 break
699 break
685 parameter_s = ' '.join(shlex.quote(arg) for arg in argv)
700 parameter_s = ' '.join(shlex.quote(arg) for arg in argv)
686
701
687 # get arguments and set sys.argv for program to be run.
702 # get arguments and set sys.argv for program to be run.
688 opts, arg_lst = self.parse_options(parameter_s,
703 opts, arg_lst = self.parse_options(parameter_s,
689 'nidtN:b:pD:l:rs:T:em:G',
704 'nidtN:b:pD:l:rs:T:em:G',
690 mode='list', list_all=1)
705 mode='list', list_all=1)
691 if "m" in opts:
706 if "m" in opts:
692 modulename = opts["m"][0]
707 modulename = opts["m"][0]
693 modpath = find_mod(modulename)
708 modpath = find_mod(modulename)
694 if modpath is None:
709 if modpath is None:
695 msg = '%r is not a valid modulename on sys.path'%modulename
710 msg = '%r is not a valid modulename on sys.path'%modulename
696 raise Exception(msg)
711 raise Exception(msg)
697 arg_lst = [modpath] + arg_lst
712 arg_lst = [modpath] + arg_lst
698 try:
713 try:
699 fpath = None # initialize to make sure fpath is in scope later
714 fpath = None # initialize to make sure fpath is in scope later
700 fpath = arg_lst[0]
715 fpath = arg_lst[0]
701 filename = file_finder(fpath)
716 filename = file_finder(fpath)
702 except IndexError as e:
717 except IndexError as e:
703 msg = 'you must provide at least a filename.'
718 msg = 'you must provide at least a filename.'
704 raise Exception(msg) from e
719 raise Exception(msg) from e
705 except IOError as e:
720 except IOError as e:
706 try:
721 try:
707 msg = str(e)
722 msg = str(e)
708 except UnicodeError:
723 except UnicodeError:
709 msg = e.message
724 msg = e.message
710 if os.name == 'nt' and re.match(r"^'.*'$",fpath):
725 if os.name == 'nt' and re.match(r"^'.*'$",fpath):
711 warn('For Windows, use double quotes to wrap a filename: %run "mypath\\myfile.py"')
726 warn('For Windows, use double quotes to wrap a filename: %run "mypath\\myfile.py"')
712 raise Exception(msg) from e
727 raise Exception(msg) from e
713 except TypeError:
728 except TypeError:
714 if fpath in sys.meta_path:
729 if fpath in sys.meta_path:
715 filename = ""
730 filename = ""
716 else:
731 else:
717 raise
732 raise
718
733
719 if filename.lower().endswith(('.ipy', '.ipynb')):
734 if filename.lower().endswith(('.ipy', '.ipynb')):
720 with preserve_keys(self.shell.user_ns, '__file__'):
735 with preserve_keys(self.shell.user_ns, '__file__'):
721 self.shell.user_ns['__file__'] = filename
736 self.shell.user_ns['__file__'] = filename
722 self.shell.safe_execfile_ipy(filename, raise_exceptions=True)
737 self.shell.safe_execfile_ipy(filename, raise_exceptions=True)
723 return
738 return
724
739
725 # Control the response to exit() calls made by the script being run
740 # Control the response to exit() calls made by the script being run
726 exit_ignore = 'e' in opts
741 exit_ignore = 'e' in opts
727
742
728 # Make sure that the running script gets a proper sys.argv as if it
743 # Make sure that the running script gets a proper sys.argv as if it
729 # were run from a system shell.
744 # were run from a system shell.
730 save_argv = sys.argv # save it for later restoring
745 save_argv = sys.argv # save it for later restoring
731
746
732 if 'G' in opts:
747 if 'G' in opts:
733 args = arg_lst[1:]
748 args = arg_lst[1:]
734 else:
749 else:
735 # tilde and glob expansion
750 # tilde and glob expansion
736 args = shellglob(map(os.path.expanduser, arg_lst[1:]))
751 args = shellglob(map(os.path.expanduser, arg_lst[1:]))
737
752
738 sys.argv = [filename] + args # put in the proper filename
753 sys.argv = [filename] + args # put in the proper filename
739
754
740 if 'n' in opts:
755 if 'n' in opts:
741 name = Path(filename).stem
756 name = Path(filename).stem
742 else:
757 else:
743 name = '__main__'
758 name = '__main__'
744
759
745 if 'i' in opts:
760 if 'i' in opts:
746 # Run in user's interactive namespace
761 # Run in user's interactive namespace
747 prog_ns = self.shell.user_ns
762 prog_ns = self.shell.user_ns
748 __name__save = self.shell.user_ns['__name__']
763 __name__save = self.shell.user_ns['__name__']
749 prog_ns['__name__'] = name
764 prog_ns['__name__'] = name
750 main_mod = self.shell.user_module
765 main_mod = self.shell.user_module
751
766
752 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
767 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
753 # set the __file__ global in the script's namespace
768 # set the __file__ global in the script's namespace
754 # TK: Is this necessary in interactive mode?
769 # TK: Is this necessary in interactive mode?
755 prog_ns['__file__'] = filename
770 prog_ns['__file__'] = filename
756 else:
771 else:
757 # Run in a fresh, empty namespace
772 # Run in a fresh, empty namespace
758
773
759 # The shell MUST hold a reference to prog_ns so after %run
774 # The shell MUST hold a reference to prog_ns so after %run
760 # exits, the python deletion mechanism doesn't zero it out
775 # exits, the python deletion mechanism doesn't zero it out
761 # (leaving dangling references). See interactiveshell for details
776 # (leaving dangling references). See interactiveshell for details
762 main_mod = self.shell.new_main_mod(filename, name)
777 main_mod = self.shell.new_main_mod(filename, name)
763 prog_ns = main_mod.__dict__
778 prog_ns = main_mod.__dict__
764
779
765 # pickle fix. See interactiveshell for an explanation. But we need to
780 # pickle fix. See interactiveshell for an explanation. But we need to
766 # make sure that, if we overwrite __main__, we replace it at the end
781 # make sure that, if we overwrite __main__, we replace it at the end
767 main_mod_name = prog_ns['__name__']
782 main_mod_name = prog_ns['__name__']
768
783
769 if main_mod_name == '__main__':
784 if main_mod_name == '__main__':
770 restore_main = sys.modules['__main__']
785 restore_main = sys.modules['__main__']
771 else:
786 else:
772 restore_main = False
787 restore_main = False
773
788
774 # This needs to be undone at the end to prevent holding references to
789 # This needs to be undone at the end to prevent holding references to
775 # every single object ever created.
790 # every single object ever created.
776 sys.modules[main_mod_name] = main_mod
791 sys.modules[main_mod_name] = main_mod
777
792
778 if 'p' in opts or 'd' in opts:
793 if 'p' in opts or 'd' in opts:
779 if 'm' in opts:
794 if 'm' in opts:
780 code = 'run_module(modulename, prog_ns)'
795 code = 'run_module(modulename, prog_ns)'
781 code_ns = {
796 code_ns = {
782 'run_module': self.shell.safe_run_module,
797 'run_module': self.shell.safe_run_module,
783 'prog_ns': prog_ns,
798 'prog_ns': prog_ns,
784 'modulename': modulename,
799 'modulename': modulename,
785 }
800 }
786 else:
801 else:
787 if 'd' in opts:
802 if 'd' in opts:
788 # allow exceptions to raise in debug mode
803 # allow exceptions to raise in debug mode
789 code = 'execfile(filename, prog_ns, raise_exceptions=True)'
804 code = 'execfile(filename, prog_ns, raise_exceptions=True)'
790 else:
805 else:
791 code = 'execfile(filename, prog_ns)'
806 code = 'execfile(filename, prog_ns)'
792 code_ns = {
807 code_ns = {
793 'execfile': self.shell.safe_execfile,
808 'execfile': self.shell.safe_execfile,
794 'prog_ns': prog_ns,
809 'prog_ns': prog_ns,
795 'filename': get_py_filename(filename),
810 'filename': get_py_filename(filename),
796 }
811 }
797
812
798 try:
813 try:
799 stats = None
814 stats = None
800 if 'p' in opts:
815 if 'p' in opts:
801 stats = self._run_with_profiler(code, opts, code_ns)
816 stats = self._run_with_profiler(code, opts, code_ns)
802 else:
817 else:
803 if 'd' in opts:
818 if 'd' in opts:
804 bp_file, bp_line = parse_breakpoint(
819 bp_file, bp_line = parse_breakpoint(
805 opts.get('b', ['1'])[0], filename)
820 opts.get('b', ['1'])[0], filename)
806 self._run_with_debugger(
821 self._run_with_debugger(
807 code, code_ns, filename, bp_line, bp_file)
822 code, code_ns, filename, bp_line, bp_file)
808 else:
823 else:
809 if 'm' in opts:
824 if 'm' in opts:
810 def run():
825 def run():
811 self.shell.safe_run_module(modulename, prog_ns)
826 self.shell.safe_run_module(modulename, prog_ns)
812 else:
827 else:
813 if runner is None:
828 if runner is None:
814 runner = self.default_runner
829 runner = self.default_runner
815 if runner is None:
830 if runner is None:
816 runner = self.shell.safe_execfile
831 runner = self.shell.safe_execfile
817
832
818 def run():
833 def run():
819 runner(filename, prog_ns, prog_ns,
834 runner(filename, prog_ns, prog_ns,
820 exit_ignore=exit_ignore)
835 exit_ignore=exit_ignore)
821
836
822 if 't' in opts:
837 if 't' in opts:
823 # timed execution
838 # timed execution
824 try:
839 try:
825 nruns = int(opts['N'][0])
840 nruns = int(opts['N'][0])
826 if nruns < 1:
841 if nruns < 1:
827 error('Number of runs must be >=1')
842 error('Number of runs must be >=1')
828 return
843 return
829 except (KeyError):
844 except (KeyError):
830 nruns = 1
845 nruns = 1
831 self._run_with_timing(run, nruns)
846 self._run_with_timing(run, nruns)
832 else:
847 else:
833 # regular execution
848 # regular execution
834 run()
849 run()
835
850
836 if 'i' in opts:
851 if 'i' in opts:
837 self.shell.user_ns['__name__'] = __name__save
852 self.shell.user_ns['__name__'] = __name__save
838 else:
853 else:
839 # update IPython interactive namespace
854 # update IPython interactive namespace
840
855
841 # Some forms of read errors on the file may mean the
856 # Some forms of read errors on the file may mean the
842 # __name__ key was never set; using pop we don't have to
857 # __name__ key was never set; using pop we don't have to
843 # worry about a possible KeyError.
858 # worry about a possible KeyError.
844 prog_ns.pop('__name__', None)
859 prog_ns.pop('__name__', None)
845
860
846 with preserve_keys(self.shell.user_ns, '__file__'):
861 with preserve_keys(self.shell.user_ns, '__file__'):
847 self.shell.user_ns.update(prog_ns)
862 self.shell.user_ns.update(prog_ns)
848 finally:
863 finally:
849 # It's a bit of a mystery why, but __builtins__ can change from
864 # It's a bit of a mystery why, but __builtins__ can change from
850 # being a module to becoming a dict missing some key data after
865 # being a module to becoming a dict missing some key data after
851 # %run. As best I can see, this is NOT something IPython is doing
866 # %run. As best I can see, this is NOT something IPython is doing
852 # at all, and similar problems have been reported before:
867 # at all, and similar problems have been reported before:
853 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
868 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
854 # Since this seems to be done by the interpreter itself, the best
869 # Since this seems to be done by the interpreter itself, the best
855 # we can do is to at least restore __builtins__ for the user on
870 # we can do is to at least restore __builtins__ for the user on
856 # exit.
871 # exit.
857 self.shell.user_ns['__builtins__'] = builtin_mod
872 self.shell.user_ns['__builtins__'] = builtin_mod
858
873
859 # Ensure key global structures are restored
874 # Ensure key global structures are restored
860 sys.argv = save_argv
875 sys.argv = save_argv
861 if restore_main:
876 if restore_main:
862 sys.modules['__main__'] = restore_main
877 sys.modules['__main__'] = restore_main
863 if '__mp_main__' in sys.modules:
878 if '__mp_main__' in sys.modules:
864 sys.modules['__mp_main__'] = restore_main
879 sys.modules['__mp_main__'] = restore_main
865 else:
880 else:
866 # Remove from sys.modules the reference to main_mod we'd
881 # Remove from sys.modules the reference to main_mod we'd
867 # added. Otherwise it will trap references to objects
882 # added. Otherwise it will trap references to objects
868 # contained therein.
883 # contained therein.
869 del sys.modules[main_mod_name]
884 del sys.modules[main_mod_name]
870
885
871 return stats
886 return stats
872
887
873 def _run_with_debugger(
888 def _run_with_debugger(
874 self, code, code_ns, filename=None, bp_line=None, bp_file=None, local_ns=None
889 self, code, code_ns, filename=None, bp_line=None, bp_file=None, local_ns=None
875 ):
890 ):
876 """
891 """
877 Run `code` in debugger with a break point.
892 Run `code` in debugger with a break point.
878
893
879 Parameters
894 Parameters
880 ----------
895 ----------
881 code : str
896 code : str
882 Code to execute.
897 Code to execute.
883 code_ns : dict
898 code_ns : dict
884 A namespace in which `code` is executed.
899 A namespace in which `code` is executed.
885 filename : str
900 filename : str
886 `code` is ran as if it is in `filename`.
901 `code` is ran as if it is in `filename`.
887 bp_line : int, optional
902 bp_line : int, optional
888 Line number of the break point.
903 Line number of the break point.
889 bp_file : str, optional
904 bp_file : str, optional
890 Path to the file in which break point is specified.
905 Path to the file in which break point is specified.
891 `filename` is used if not given.
906 `filename` is used if not given.
892 local_ns : dict, optional
907 local_ns : dict, optional
893 A local namespace in which `code` is executed.
908 A local namespace in which `code` is executed.
894
909
895 Raises
910 Raises
896 ------
911 ------
897 UsageError
912 UsageError
898 If the break point given by `bp_line` is not valid.
913 If the break point given by `bp_line` is not valid.
899
914
900 """
915 """
901 deb = self.shell.InteractiveTB.pdb
916 deb = self.shell.InteractiveTB.pdb
902 if not deb:
917 if not deb:
903 self.shell.InteractiveTB.pdb = self.shell.InteractiveTB.debugger_cls()
918 self.shell.InteractiveTB.pdb = self.shell.InteractiveTB.debugger_cls()
904 deb = self.shell.InteractiveTB.pdb
919 deb = self.shell.InteractiveTB.pdb
905
920
906 # deb.checkline() fails if deb.curframe exists but is None; it can
921 # deb.checkline() fails if deb.curframe exists but is None; it can
907 # handle it not existing. https://github.com/ipython/ipython/issues/10028
922 # handle it not existing. https://github.com/ipython/ipython/issues/10028
908 if hasattr(deb, 'curframe'):
923 if hasattr(deb, 'curframe'):
909 del deb.curframe
924 del deb.curframe
910
925
911 # reset Breakpoint state, which is moronically kept
926 # reset Breakpoint state, which is moronically kept
912 # in a class
927 # in a class
913 bdb.Breakpoint.next = 1
928 bdb.Breakpoint.next = 1
914 bdb.Breakpoint.bplist = {}
929 bdb.Breakpoint.bplist = {}
915 bdb.Breakpoint.bpbynumber = [None]
930 bdb.Breakpoint.bpbynumber = [None]
916 deb.clear_all_breaks()
931 deb.clear_all_breaks()
917 if bp_line is not None:
932 if bp_line is not None:
918 # Set an initial breakpoint to stop execution
933 # Set an initial breakpoint to stop execution
919 maxtries = 10
934 maxtries = 10
920 bp_file = bp_file or filename
935 bp_file = bp_file or filename
921 checkline = deb.checkline(bp_file, bp_line)
936 checkline = deb.checkline(bp_file, bp_line)
922 if not checkline:
937 if not checkline:
923 for bp in range(bp_line + 1, bp_line + maxtries + 1):
938 for bp in range(bp_line + 1, bp_line + maxtries + 1):
924 if deb.checkline(bp_file, bp):
939 if deb.checkline(bp_file, bp):
925 break
940 break
926 else:
941 else:
927 msg = ("\nI failed to find a valid line to set "
942 msg = ("\nI failed to find a valid line to set "
928 "a breakpoint\n"
943 "a breakpoint\n"
929 "after trying up to line: %s.\n"
944 "after trying up to line: %s.\n"
930 "Please set a valid breakpoint manually "
945 "Please set a valid breakpoint manually "
931 "with the -b option." % bp)
946 "with the -b option." % bp)
932 raise UsageError(msg)
947 raise UsageError(msg)
933 # if we find a good linenumber, set the breakpoint
948 # if we find a good linenumber, set the breakpoint
934 deb.do_break('%s:%s' % (bp_file, bp_line))
949 deb.do_break('%s:%s' % (bp_file, bp_line))
935
950
936 if filename:
951 if filename:
937 # Mimic Pdb._runscript(...)
952 # Mimic Pdb._runscript(...)
938 deb._wait_for_mainpyfile = True
953 deb._wait_for_mainpyfile = True
939 deb.mainpyfile = deb.canonic(filename)
954 deb.mainpyfile = deb.canonic(filename)
940
955
941 # Start file run
956 # Start file run
942 print("NOTE: Enter 'c' at the %s prompt to continue execution." % deb.prompt)
957 print("NOTE: Enter 'c' at the %s prompt to continue execution." % deb.prompt)
943 try:
958 try:
944 if filename:
959 if filename:
945 # save filename so it can be used by methods on the deb object
960 # save filename so it can be used by methods on the deb object
946 deb._exec_filename = filename
961 deb._exec_filename = filename
947 while True:
962 while True:
948 try:
963 try:
949 trace = sys.gettrace()
964 trace = sys.gettrace()
950 deb.run(code, code_ns, local_ns)
965 deb.run(code, code_ns, local_ns)
951 except Restart:
966 except Restart:
952 print("Restarting")
967 print("Restarting")
953 if filename:
968 if filename:
954 deb._wait_for_mainpyfile = True
969 deb._wait_for_mainpyfile = True
955 deb.mainpyfile = deb.canonic(filename)
970 deb.mainpyfile = deb.canonic(filename)
956 continue
971 continue
957 else:
972 else:
958 break
973 break
959 finally:
974 finally:
960 sys.settrace(trace)
975 sys.settrace(trace)
961
976
962
977
963 except:
978 except:
964 etype, value, tb = sys.exc_info()
979 etype, value, tb = sys.exc_info()
965 # Skip three frames in the traceback: the %run one,
980 # Skip three frames in the traceback: the %run one,
966 # one inside bdb.py, and the command-line typed by the
981 # one inside bdb.py, and the command-line typed by the
967 # user (run by exec in pdb itself).
982 # user (run by exec in pdb itself).
968 self.shell.InteractiveTB(etype, value, tb, tb_offset=3)
983 self.shell.InteractiveTB(etype, value, tb, tb_offset=3)
969
984
970 @staticmethod
985 @staticmethod
971 def _run_with_timing(run, nruns):
986 def _run_with_timing(run, nruns):
972 """
987 """
973 Run function `run` and print timing information.
988 Run function `run` and print timing information.
974
989
975 Parameters
990 Parameters
976 ----------
991 ----------
977 run : callable
992 run : callable
978 Any callable object which takes no argument.
993 Any callable object which takes no argument.
979 nruns : int
994 nruns : int
980 Number of times to execute `run`.
995 Number of times to execute `run`.
981
996
982 """
997 """
983 twall0 = time.perf_counter()
998 twall0 = time.perf_counter()
984 if nruns == 1:
999 if nruns == 1:
985 t0 = clock2()
1000 t0 = clock2()
986 run()
1001 run()
987 t1 = clock2()
1002 t1 = clock2()
988 t_usr = t1[0] - t0[0]
1003 t_usr = t1[0] - t0[0]
989 t_sys = t1[1] - t0[1]
1004 t_sys = t1[1] - t0[1]
990 print("\nIPython CPU timings (estimated):")
1005 print("\nIPython CPU timings (estimated):")
991 print(" User : %10.2f s." % t_usr)
1006 print(" User : %10.2f s." % t_usr)
992 print(" System : %10.2f s." % t_sys)
1007 print(" System : %10.2f s." % t_sys)
993 else:
1008 else:
994 runs = range(nruns)
1009 runs = range(nruns)
995 t0 = clock2()
1010 t0 = clock2()
996 for nr in runs:
1011 for nr in runs:
997 run()
1012 run()
998 t1 = clock2()
1013 t1 = clock2()
999 t_usr = t1[0] - t0[0]
1014 t_usr = t1[0] - t0[0]
1000 t_sys = t1[1] - t0[1]
1015 t_sys = t1[1] - t0[1]
1001 print("\nIPython CPU timings (estimated):")
1016 print("\nIPython CPU timings (estimated):")
1002 print("Total runs performed:", nruns)
1017 print("Total runs performed:", nruns)
1003 print(" Times : %10s %10s" % ('Total', 'Per run'))
1018 print(" Times : %10s %10s" % ('Total', 'Per run'))
1004 print(" User : %10.2f s, %10.2f s." % (t_usr, t_usr / nruns))
1019 print(" User : %10.2f s, %10.2f s." % (t_usr, t_usr / nruns))
1005 print(" System : %10.2f s, %10.2f s." % (t_sys, t_sys / nruns))
1020 print(" System : %10.2f s, %10.2f s." % (t_sys, t_sys / nruns))
1006 twall1 = time.perf_counter()
1021 twall1 = time.perf_counter()
1007 print("Wall time: %10.2f s." % (twall1 - twall0))
1022 print("Wall time: %10.2f s." % (twall1 - twall0))
1008
1023
1009 @skip_doctest
1024 @skip_doctest
1010 @no_var_expand
1025 @no_var_expand
1011 @line_cell_magic
1026 @line_cell_magic
1012 @needs_local_scope
1027 @needs_local_scope
1013 def timeit(self, line='', cell=None, local_ns=None):
1028 def timeit(self, line='', cell=None, local_ns=None):
1014 """Time execution of a Python statement or expression
1029 """Time execution of a Python statement or expression
1015
1030
1016 Usage, in line mode:
1031 Usage, in line mode:
1017 %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement
1032 %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement
1018 or in cell mode:
1033 or in cell mode:
1019 %%timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] setup_code
1034 %%timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] setup_code
1020 code
1035 code
1021 code...
1036 code...
1022
1037
1023 Time execution of a Python statement or expression using the timeit
1038 Time execution of a Python statement or expression using the timeit
1024 module. This function can be used both as a line and cell magic:
1039 module. This function can be used both as a line and cell magic:
1025
1040
1026 - In line mode you can time a single-line statement (though multiple
1041 - In line mode you can time a single-line statement (though multiple
1027 ones can be chained with using semicolons).
1042 ones can be chained with using semicolons).
1028
1043
1029 - In cell mode, the statement in the first line is used as setup code
1044 - In cell mode, the statement in the first line is used as setup code
1030 (executed but not timed) and the body of the cell is timed. The cell
1045 (executed but not timed) and the body of the cell is timed. The cell
1031 body has access to any variables created in the setup code.
1046 body has access to any variables created in the setup code.
1032
1047
1033 Options:
1048 Options:
1034 -n<N>: execute the given statement <N> times in a loop. If <N> is not
1049 -n<N>: execute the given statement <N> times in a loop. If <N> is not
1035 provided, <N> is determined so as to get sufficient accuracy.
1050 provided, <N> is determined so as to get sufficient accuracy.
1036
1051
1037 -r<R>: number of repeats <R>, each consisting of <N> loops, and take the
1052 -r<R>: number of repeats <R>, each consisting of <N> loops, and take the
1038 best result.
1053 best result.
1039 Default: 7
1054 Default: 7
1040
1055
1041 -t: use time.time to measure the time, which is the default on Unix.
1056 -t: use time.time to measure the time, which is the default on Unix.
1042 This function measures wall time.
1057 This function measures wall time.
1043
1058
1044 -c: use time.clock to measure the time, which is the default on
1059 -c: use time.clock to measure the time, which is the default on
1045 Windows and measures wall time. On Unix, resource.getrusage is used
1060 Windows and measures wall time. On Unix, resource.getrusage is used
1046 instead and returns the CPU user time.
1061 instead and returns the CPU user time.
1047
1062
1048 -p<P>: use a precision of <P> digits to display the timing result.
1063 -p<P>: use a precision of <P> digits to display the timing result.
1049 Default: 3
1064 Default: 3
1050
1065
1051 -q: Quiet, do not print result.
1066 -q: Quiet, do not print result.
1052
1067
1053 -o: return a TimeitResult that can be stored in a variable to inspect
1068 -o: return a TimeitResult that can be stored in a variable to inspect
1054 the result in more details.
1069 the result in more details.
1055
1070
1056 .. versionchanged:: 7.3
1071 .. versionchanged:: 7.3
1057 User variables are no longer expanded,
1072 User variables are no longer expanded,
1058 the magic line is always left unmodified.
1073 the magic line is always left unmodified.
1059
1074
1060 Examples
1075 Examples
1061 --------
1076 --------
1062 ::
1077 ::
1063
1078
1064 In [1]: %timeit pass
1079 In [1]: %timeit pass
1065 8.26 ns Β± 0.12 ns per loop (mean Β± std. dev. of 7 runs, 100000000 loops each)
1080 8.26 ns Β± 0.12 ns per loop (mean Β± std. dev. of 7 runs, 100000000 loops each)
1066
1081
1067 In [2]: u = None
1082 In [2]: u = None
1068
1083
1069 In [3]: %timeit u is None
1084 In [3]: %timeit u is None
1070 29.9 ns Β± 0.643 ns per loop (mean Β± std. dev. of 7 runs, 10000000 loops each)
1085 29.9 ns Β± 0.643 ns per loop (mean Β± std. dev. of 7 runs, 10000000 loops each)
1071
1086
1072 In [4]: %timeit -r 4 u == None
1087 In [4]: %timeit -r 4 u == None
1073
1088
1074 In [5]: import time
1089 In [5]: import time
1075
1090
1076 In [6]: %timeit -n1 time.sleep(2)
1091 In [6]: %timeit -n1 time.sleep(2)
1077
1092
1078 The times reported by %timeit will be slightly higher than those
1093 The times reported by %timeit will be slightly higher than those
1079 reported by the timeit.py script when variables are accessed. This is
1094 reported by the timeit.py script when variables are accessed. This is
1080 due to the fact that %timeit executes the statement in the namespace
1095 due to the fact that %timeit executes the statement in the namespace
1081 of the shell, compared with timeit.py, which uses a single setup
1096 of the shell, compared with timeit.py, which uses a single setup
1082 statement to import function or create variables. Generally, the bias
1097 statement to import function or create variables. Generally, the bias
1083 does not matter as long as results from timeit.py are not mixed with
1098 does not matter as long as results from timeit.py are not mixed with
1084 those from %timeit."""
1099 those from %timeit."""
1085
1100
1086 opts, stmt = self.parse_options(
1101 opts, stmt = self.parse_options(
1087 line, "n:r:tcp:qo", posix=False, strict=False, preserve_non_opts=True
1102 line, "n:r:tcp:qo", posix=False, strict=False, preserve_non_opts=True
1088 )
1103 )
1089 if stmt == "" and cell is None:
1104 if stmt == "" and cell is None:
1090 return
1105 return
1091
1106
1092 timefunc = timeit.default_timer
1107 timefunc = timeit.default_timer
1093 number = int(getattr(opts, "n", 0))
1108 number = int(getattr(opts, "n", 0))
1094 default_repeat = 7 if timeit.default_repeat < 7 else timeit.default_repeat
1109 default_repeat = 7 if timeit.default_repeat < 7 else timeit.default_repeat
1095 repeat = int(getattr(opts, "r", default_repeat))
1110 repeat = int(getattr(opts, "r", default_repeat))
1096 precision = int(getattr(opts, "p", 3))
1111 precision = int(getattr(opts, "p", 3))
1097 quiet = 'q' in opts
1112 quiet = 'q' in opts
1098 return_result = 'o' in opts
1113 return_result = 'o' in opts
1099 if hasattr(opts, "t"):
1114 if hasattr(opts, "t"):
1100 timefunc = time.time
1115 timefunc = time.time
1101 if hasattr(opts, "c"):
1116 if hasattr(opts, "c"):
1102 timefunc = clock
1117 timefunc = clock
1103
1118
1104 timer = Timer(timer=timefunc)
1119 timer = Timer(timer=timefunc)
1105 # this code has tight coupling to the inner workings of timeit.Timer,
1120 # this code has tight coupling to the inner workings of timeit.Timer,
1106 # but is there a better way to achieve that the code stmt has access
1121 # but is there a better way to achieve that the code stmt has access
1107 # to the shell namespace?
1122 # to the shell namespace?
1108 transform = self.shell.transform_cell
1123 transform = self.shell.transform_cell
1109
1124
1110 if cell is None:
1125 if cell is None:
1111 # called as line magic
1126 # called as line magic
1112 ast_setup = self.shell.compile.ast_parse("pass")
1127 ast_setup = self.shell.compile.ast_parse("pass")
1113 ast_stmt = self.shell.compile.ast_parse(transform(stmt))
1128 ast_stmt = self.shell.compile.ast_parse(transform(stmt))
1114 else:
1129 else:
1115 ast_setup = self.shell.compile.ast_parse(transform(stmt))
1130 ast_setup = self.shell.compile.ast_parse(transform(stmt))
1116 ast_stmt = self.shell.compile.ast_parse(transform(cell))
1131 ast_stmt = self.shell.compile.ast_parse(transform(cell))
1117
1132
1118 ast_setup = self.shell.transform_ast(ast_setup)
1133 ast_setup = self.shell.transform_ast(ast_setup)
1119 ast_stmt = self.shell.transform_ast(ast_stmt)
1134 ast_stmt = self.shell.transform_ast(ast_stmt)
1120
1135
1121 # Check that these compile to valid Python code *outside* the timer func
1136 # Check that these compile to valid Python code *outside* the timer func
1122 # Invalid code may become valid when put inside the function & loop,
1137 # Invalid code may become valid when put inside the function & loop,
1123 # which messes up error messages.
1138 # which messes up error messages.
1124 # https://github.com/ipython/ipython/issues/10636
1139 # https://github.com/ipython/ipython/issues/10636
1125 self.shell.compile(ast_setup, "<magic-timeit-setup>", "exec")
1140 self.shell.compile(ast_setup, "<magic-timeit-setup>", "exec")
1126 self.shell.compile(ast_stmt, "<magic-timeit-stmt>", "exec")
1141 self.shell.compile(ast_stmt, "<magic-timeit-stmt>", "exec")
1127
1142
1128 # This codestring is taken from timeit.template - we fill it in as an
1143 # This codestring is taken from timeit.template - we fill it in as an
1129 # AST, so that we can apply our AST transformations to the user code
1144 # AST, so that we can apply our AST transformations to the user code
1130 # without affecting the timing code.
1145 # without affecting the timing code.
1131 timeit_ast_template = ast.parse('def inner(_it, _timer):\n'
1146 timeit_ast_template = ast.parse('def inner(_it, _timer):\n'
1132 ' setup\n'
1147 ' setup\n'
1133 ' _t0 = _timer()\n'
1148 ' _t0 = _timer()\n'
1134 ' for _i in _it:\n'
1149 ' for _i in _it:\n'
1135 ' stmt\n'
1150 ' stmt\n'
1136 ' _t1 = _timer()\n'
1151 ' _t1 = _timer()\n'
1137 ' return _t1 - _t0\n')
1152 ' return _t1 - _t0\n')
1138
1153
1139 timeit_ast = TimeitTemplateFiller(ast_setup, ast_stmt).visit(timeit_ast_template)
1154 timeit_ast = TimeitTemplateFiller(ast_setup, ast_stmt).visit(timeit_ast_template)
1140 timeit_ast = ast.fix_missing_locations(timeit_ast)
1155 timeit_ast = ast.fix_missing_locations(timeit_ast)
1141
1156
1142 # Track compilation time so it can be reported if too long
1157 # Track compilation time so it can be reported if too long
1143 # Minimum time above which compilation time will be reported
1158 # Minimum time above which compilation time will be reported
1144 tc_min = 0.1
1159 tc_min = 0.1
1145
1160
1146 t0 = clock()
1161 t0 = clock()
1147 code = self.shell.compile(timeit_ast, "<magic-timeit>", "exec")
1162 code = self.shell.compile(timeit_ast, "<magic-timeit>", "exec")
1148 tc = clock()-t0
1163 tc = clock()-t0
1149
1164
1150 ns = {}
1165 ns = {}
1151 glob = self.shell.user_ns
1166 glob = self.shell.user_ns
1152 # handles global vars with same name as local vars. We store them in conflict_globs.
1167 # handles global vars with same name as local vars. We store them in conflict_globs.
1153 conflict_globs = {}
1168 conflict_globs = {}
1154 if local_ns and cell is None:
1169 if local_ns and cell is None:
1155 for var_name, var_val in glob.items():
1170 for var_name, var_val in glob.items():
1156 if var_name in local_ns:
1171 if var_name in local_ns:
1157 conflict_globs[var_name] = var_val
1172 conflict_globs[var_name] = var_val
1158 glob.update(local_ns)
1173 glob.update(local_ns)
1159
1174
1160 exec(code, glob, ns)
1175 exec(code, glob, ns)
1161 timer.inner = ns["inner"]
1176 timer.inner = ns["inner"]
1162
1177
1163 # This is used to check if there is a huge difference between the
1178 # This is used to check if there is a huge difference between the
1164 # best and worst timings.
1179 # best and worst timings.
1165 # Issue: https://github.com/ipython/ipython/issues/6471
1180 # Issue: https://github.com/ipython/ipython/issues/6471
1166 if number == 0:
1181 if number == 0:
1167 # determine number so that 0.2 <= total time < 2.0
1182 # determine number so that 0.2 <= total time < 2.0
1168 for index in range(0, 10):
1183 for index in range(0, 10):
1169 number = 10 ** index
1184 number = 10 ** index
1170 time_number = timer.timeit(number)
1185 time_number = timer.timeit(number)
1171 if time_number >= 0.2:
1186 if time_number >= 0.2:
1172 break
1187 break
1173
1188
1174 all_runs = timer.repeat(repeat, number)
1189 all_runs = timer.repeat(repeat, number)
1175 best = min(all_runs) / number
1190 best = min(all_runs) / number
1176 worst = max(all_runs) / number
1191 worst = max(all_runs) / number
1177 timeit_result = TimeitResult(number, repeat, best, worst, all_runs, tc, precision)
1192 timeit_result = TimeitResult(number, repeat, best, worst, all_runs, tc, precision)
1178
1193
1179 # Restore global vars from conflict_globs
1194 # Restore global vars from conflict_globs
1180 if conflict_globs:
1195 if conflict_globs:
1181 glob.update(conflict_globs)
1196 glob.update(conflict_globs)
1182
1197
1183 if not quiet :
1198 if not quiet :
1184 # Check best timing is greater than zero to avoid a
1199 # Check best timing is greater than zero to avoid a
1185 # ZeroDivisionError.
1200 # ZeroDivisionError.
1186 # In cases where the slowest timing is lesser than a microsecond
1201 # In cases where the slowest timing is lesser than a microsecond
1187 # we assume that it does not really matter if the fastest
1202 # we assume that it does not really matter if the fastest
1188 # timing is 4 times faster than the slowest timing or not.
1203 # timing is 4 times faster than the slowest timing or not.
1189 if worst > 4 * best and best > 0 and worst > 1e-6:
1204 if worst > 4 * best and best > 0 and worst > 1e-6:
1190 print("The slowest run took %0.2f times longer than the "
1205 print("The slowest run took %0.2f times longer than the "
1191 "fastest. This could mean that an intermediate result "
1206 "fastest. This could mean that an intermediate result "
1192 "is being cached." % (worst / best))
1207 "is being cached." % (worst / best))
1193
1208
1194 print( timeit_result )
1209 print( timeit_result )
1195
1210
1196 if tc > tc_min:
1211 if tc > tc_min:
1197 print("Compiler time: %.2f s" % tc)
1212 print("Compiler time: %.2f s" % tc)
1198 if return_result:
1213 if return_result:
1199 return timeit_result
1214 return timeit_result
1200
1215
1201 @skip_doctest
1216 @skip_doctest
1202 @no_var_expand
1217 @no_var_expand
1203 @needs_local_scope
1218 @needs_local_scope
1204 @line_cell_magic
1219 @line_cell_magic
1205 @output_can_be_silenced
1220 @output_can_be_silenced
1206 def time(self,line='', cell=None, local_ns=None):
1221 def time(self,line='', cell=None, local_ns=None):
1207 """Time execution of a Python statement or expression.
1222 """Time execution of a Python statement or expression.
1208
1223
1209 The CPU and wall clock times are printed, and the value of the
1224 The CPU and wall clock times are printed, and the value of the
1210 expression (if any) is returned. Note that under Win32, system time
1225 expression (if any) is returned. Note that under Win32, system time
1211 is always reported as 0, since it can not be measured.
1226 is always reported as 0, since it can not be measured.
1212
1227
1213 This function can be used both as a line and cell magic:
1228 This function can be used both as a line and cell magic:
1214
1229
1215 - In line mode you can time a single-line statement (though multiple
1230 - In line mode you can time a single-line statement (though multiple
1216 ones can be chained with using semicolons).
1231 ones can be chained with using semicolons).
1217
1232
1218 - In cell mode, you can time the cell body (a directly
1233 - In cell mode, you can time the cell body (a directly
1219 following statement raises an error).
1234 following statement raises an error).
1220
1235
1221 This function provides very basic timing functionality. Use the timeit
1236 This function provides very basic timing functionality. Use the timeit
1222 magic for more control over the measurement.
1237 magic for more control over the measurement.
1223
1238
1224 .. versionchanged:: 7.3
1239 .. versionchanged:: 7.3
1225 User variables are no longer expanded,
1240 User variables are no longer expanded,
1226 the magic line is always left unmodified.
1241 the magic line is always left unmodified.
1227
1242
1228 Examples
1243 Examples
1229 --------
1244 --------
1230 ::
1245 ::
1231
1246
1232 In [1]: %time 2**128
1247 In [1]: %time 2**128
1233 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1248 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1234 Wall time: 0.00
1249 Wall time: 0.00
1235 Out[1]: 340282366920938463463374607431768211456L
1250 Out[1]: 340282366920938463463374607431768211456L
1236
1251
1237 In [2]: n = 1000000
1252 In [2]: n = 1000000
1238
1253
1239 In [3]: %time sum(range(n))
1254 In [3]: %time sum(range(n))
1240 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1255 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1241 Wall time: 1.37
1256 Wall time: 1.37
1242 Out[3]: 499999500000L
1257 Out[3]: 499999500000L
1243
1258
1244 In [4]: %time print 'hello world'
1259 In [4]: %time print 'hello world'
1245 hello world
1260 hello world
1246 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1261 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1247 Wall time: 0.00
1262 Wall time: 0.00
1248
1263
1249 .. note::
1264 .. note::
1250 The time needed by Python to compile the given expression will be
1265 The time needed by Python to compile the given expression will be
1251 reported if it is more than 0.1s.
1266 reported if it is more than 0.1s.
1252
1267
1253 In the example below, the actual exponentiation is done by Python
1268 In the example below, the actual exponentiation is done by Python
1254 at compilation time, so while the expression can take a noticeable
1269 at compilation time, so while the expression can take a noticeable
1255 amount of time to compute, that time is purely due to the
1270 amount of time to compute, that time is purely due to the
1256 compilation::
1271 compilation::
1257
1272
1258 In [5]: %time 3**9999;
1273 In [5]: %time 3**9999;
1259 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1274 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1260 Wall time: 0.00 s
1275 Wall time: 0.00 s
1261
1276
1262 In [6]: %time 3**999999;
1277 In [6]: %time 3**999999;
1263 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1278 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1264 Wall time: 0.00 s
1279 Wall time: 0.00 s
1265 Compiler : 0.78 s
1280 Compiler : 0.78 s
1266 """
1281 """
1267 # fail immediately if the given expression can't be compiled
1282 # fail immediately if the given expression can't be compiled
1268
1283
1269 if line and cell:
1284 if line and cell:
1270 raise UsageError("Can't use statement directly after '%%time'!")
1285 raise UsageError("Can't use statement directly after '%%time'!")
1271
1286
1272 if cell:
1287 if cell:
1273 expr = self.shell.transform_cell(cell)
1288 expr = self.shell.transform_cell(cell)
1274 else:
1289 else:
1275 expr = self.shell.transform_cell(line)
1290 expr = self.shell.transform_cell(line)
1276
1291
1277 # Minimum time above which parse time will be reported
1292 # Minimum time above which parse time will be reported
1278 tp_min = 0.1
1293 tp_min = 0.1
1279
1294
1280 t0 = clock()
1295 t0 = clock()
1281 expr_ast = self.shell.compile.ast_parse(expr)
1296 expr_ast = self.shell.compile.ast_parse(expr)
1282 tp = clock()-t0
1297 tp = clock()-t0
1283
1298
1284 # Apply AST transformations
1299 # Apply AST transformations
1285 expr_ast = self.shell.transform_ast(expr_ast)
1300 expr_ast = self.shell.transform_ast(expr_ast)
1286
1301
1287 # Minimum time above which compilation time will be reported
1302 # Minimum time above which compilation time will be reported
1288 tc_min = 0.1
1303 tc_min = 0.1
1289
1304
1290 expr_val=None
1305 expr_val=None
1291 if len(expr_ast.body)==1 and isinstance(expr_ast.body[0], ast.Expr):
1306 if len(expr_ast.body)==1 and isinstance(expr_ast.body[0], ast.Expr):
1292 mode = 'eval'
1307 mode = 'eval'
1293 source = '<timed eval>'
1308 source = '<timed eval>'
1294 expr_ast = ast.Expression(expr_ast.body[0].value)
1309 expr_ast = ast.Expression(expr_ast.body[0].value)
1295 else:
1310 else:
1296 mode = 'exec'
1311 mode = 'exec'
1297 source = '<timed exec>'
1312 source = '<timed exec>'
1298 # multi-line %%time case
1313 # multi-line %%time case
1299 if len(expr_ast.body) > 1 and isinstance(expr_ast.body[-1], ast.Expr):
1314 if len(expr_ast.body) > 1 and isinstance(expr_ast.body[-1], ast.Expr):
1300 expr_val= expr_ast.body[-1]
1315 expr_val= expr_ast.body[-1]
1301 expr_ast = expr_ast.body[:-1]
1316 expr_ast = expr_ast.body[:-1]
1302 expr_ast = Module(expr_ast, [])
1317 expr_ast = Module(expr_ast, [])
1303 expr_val = ast.Expression(expr_val.value)
1318 expr_val = ast.Expression(expr_val.value)
1304
1319
1305 t0 = clock()
1320 t0 = clock()
1306 code = self.shell.compile(expr_ast, source, mode)
1321 code = self.shell.compile(expr_ast, source, mode)
1307 tc = clock()-t0
1322 tc = clock()-t0
1308
1323
1309 # skew measurement as little as possible
1324 # skew measurement as little as possible
1310 glob = self.shell.user_ns
1325 glob = self.shell.user_ns
1311 wtime = time.time
1326 wtime = time.time
1312 # time execution
1327 # time execution
1313 wall_st = wtime()
1328 wall_st = wtime()
1314 if mode=='eval':
1329 if mode=='eval':
1315 st = clock2()
1330 st = clock2()
1316 try:
1331 try:
1317 out = eval(code, glob, local_ns)
1332 out = eval(code, glob, local_ns)
1318 except:
1333 except:
1319 self.shell.showtraceback()
1334 self.shell.showtraceback()
1320 return
1335 return
1321 end = clock2()
1336 end = clock2()
1322 else:
1337 else:
1323 st = clock2()
1338 st = clock2()
1324 try:
1339 try:
1325 exec(code, glob, local_ns)
1340 exec(code, glob, local_ns)
1326 out=None
1341 out=None
1327 # multi-line %%time case
1342 # multi-line %%time case
1328 if expr_val is not None:
1343 if expr_val is not None:
1329 code_2 = self.shell.compile(expr_val, source, 'eval')
1344 code_2 = self.shell.compile(expr_val, source, 'eval')
1330 out = eval(code_2, glob, local_ns)
1345 out = eval(code_2, glob, local_ns)
1331 except:
1346 except:
1332 self.shell.showtraceback()
1347 self.shell.showtraceback()
1333 return
1348 return
1334 end = clock2()
1349 end = clock2()
1335
1350
1336 wall_end = wtime()
1351 wall_end = wtime()
1337 # Compute actual times and report
1352 # Compute actual times and report
1338 wall_time = wall_end - wall_st
1353 wall_time = wall_end - wall_st
1339 cpu_user = end[0] - st[0]
1354 cpu_user = end[0] - st[0]
1340 cpu_sys = end[1] - st[1]
1355 cpu_sys = end[1] - st[1]
1341 cpu_tot = cpu_user + cpu_sys
1356 cpu_tot = cpu_user + cpu_sys
1342 # On windows cpu_sys is always zero, so only total is displayed
1357 # On windows cpu_sys is always zero, so only total is displayed
1343 if sys.platform != "win32":
1358 if sys.platform != "win32":
1344 print(
1359 print(
1345 f"CPU times: user {_format_time(cpu_user)}, sys: {_format_time(cpu_sys)}, total: {_format_time(cpu_tot)}"
1360 f"CPU times: user {_format_time(cpu_user)}, sys: {_format_time(cpu_sys)}, total: {_format_time(cpu_tot)}"
1346 )
1361 )
1347 else:
1362 else:
1348 print(f"CPU times: total: {_format_time(cpu_tot)}")
1363 print(f"CPU times: total: {_format_time(cpu_tot)}")
1349 print(f"Wall time: {_format_time(wall_time)}")
1364 print(f"Wall time: {_format_time(wall_time)}")
1350 if tc > tc_min:
1365 if tc > tc_min:
1351 print(f"Compiler : {_format_time(tc)}")
1366 print(f"Compiler : {_format_time(tc)}")
1352 if tp > tp_min:
1367 if tp > tp_min:
1353 print(f"Parser : {_format_time(tp)}")
1368 print(f"Parser : {_format_time(tp)}")
1354 return out
1369 return out
1355
1370
1356 @skip_doctest
1371 @skip_doctest
1357 @line_magic
1372 @line_magic
1358 def macro(self, parameter_s=''):
1373 def macro(self, parameter_s=''):
1359 """Define a macro for future re-execution. It accepts ranges of history,
1374 """Define a macro for future re-execution. It accepts ranges of history,
1360 filenames or string objects.
1375 filenames or string objects.
1361
1376
1362 Usage:\\
1377 Usage:\\
1363 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1378 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1364
1379
1365 Options:
1380 Options:
1366
1381
1367 -r: use 'raw' input. By default, the 'processed' history is used,
1382 -r: use 'raw' input. By default, the 'processed' history is used,
1368 so that magics are loaded in their transformed version to valid
1383 so that magics are loaded in their transformed version to valid
1369 Python. If this option is given, the raw input as typed at the
1384 Python. If this option is given, the raw input as typed at the
1370 command line is used instead.
1385 command line is used instead.
1371
1386
1372 -q: quiet macro definition. By default, a tag line is printed
1387 -q: quiet macro definition. By default, a tag line is printed
1373 to indicate the macro has been created, and then the contents of
1388 to indicate the macro has been created, and then the contents of
1374 the macro are printed. If this option is given, then no printout
1389 the macro are printed. If this option is given, then no printout
1375 is produced once the macro is created.
1390 is produced once the macro is created.
1376
1391
1377 This will define a global variable called `name` which is a string
1392 This will define a global variable called `name` which is a string
1378 made of joining the slices and lines you specify (n1,n2,... numbers
1393 made of joining the slices and lines you specify (n1,n2,... numbers
1379 above) from your input history into a single string. This variable
1394 above) from your input history into a single string. This variable
1380 acts like an automatic function which re-executes those lines as if
1395 acts like an automatic function which re-executes those lines as if
1381 you had typed them. You just type 'name' at the prompt and the code
1396 you had typed them. You just type 'name' at the prompt and the code
1382 executes.
1397 executes.
1383
1398
1384 The syntax for indicating input ranges is described in %history.
1399 The syntax for indicating input ranges is described in %history.
1385
1400
1386 Note: as a 'hidden' feature, you can also use traditional python slice
1401 Note: as a 'hidden' feature, you can also use traditional python slice
1387 notation, where N:M means numbers N through M-1.
1402 notation, where N:M means numbers N through M-1.
1388
1403
1389 For example, if your history contains (print using %hist -n )::
1404 For example, if your history contains (print using %hist -n )::
1390
1405
1391 44: x=1
1406 44: x=1
1392 45: y=3
1407 45: y=3
1393 46: z=x+y
1408 46: z=x+y
1394 47: print x
1409 47: print x
1395 48: a=5
1410 48: a=5
1396 49: print 'x',x,'y',y
1411 49: print 'x',x,'y',y
1397
1412
1398 you can create a macro with lines 44 through 47 (included) and line 49
1413 you can create a macro with lines 44 through 47 (included) and line 49
1399 called my_macro with::
1414 called my_macro with::
1400
1415
1401 In [55]: %macro my_macro 44-47 49
1416 In [55]: %macro my_macro 44-47 49
1402
1417
1403 Now, typing `my_macro` (without quotes) will re-execute all this code
1418 Now, typing `my_macro` (without quotes) will re-execute all this code
1404 in one pass.
1419 in one pass.
1405
1420
1406 You don't need to give the line-numbers in order, and any given line
1421 You don't need to give the line-numbers in order, and any given line
1407 number can appear multiple times. You can assemble macros with any
1422 number can appear multiple times. You can assemble macros with any
1408 lines from your input history in any order.
1423 lines from your input history in any order.
1409
1424
1410 The macro is a simple object which holds its value in an attribute,
1425 The macro is a simple object which holds its value in an attribute,
1411 but IPython's display system checks for macros and executes them as
1426 but IPython's display system checks for macros and executes them as
1412 code instead of printing them when you type their name.
1427 code instead of printing them when you type their name.
1413
1428
1414 You can view a macro's contents by explicitly printing it with::
1429 You can view a macro's contents by explicitly printing it with::
1415
1430
1416 print macro_name
1431 print macro_name
1417
1432
1418 """
1433 """
1419 opts,args = self.parse_options(parameter_s,'rq',mode='list')
1434 opts,args = self.parse_options(parameter_s,'rq',mode='list')
1420 if not args: # List existing macros
1435 if not args: # List existing macros
1421 return sorted(k for k,v in self.shell.user_ns.items() if isinstance(v, Macro))
1436 return sorted(k for k,v in self.shell.user_ns.items() if isinstance(v, Macro))
1422 if len(args) == 1:
1437 if len(args) == 1:
1423 raise UsageError(
1438 raise UsageError(
1424 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
1439 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
1425 name, codefrom = args[0], " ".join(args[1:])
1440 name, codefrom = args[0], " ".join(args[1:])
1426
1441
1427 #print 'rng',ranges # dbg
1442 #print 'rng',ranges # dbg
1428 try:
1443 try:
1429 lines = self.shell.find_user_code(codefrom, 'r' in opts)
1444 lines = self.shell.find_user_code(codefrom, 'r' in opts)
1430 except (ValueError, TypeError) as e:
1445 except (ValueError, TypeError) as e:
1431 print(e.args[0])
1446 print(e.args[0])
1432 return
1447 return
1433 macro = Macro(lines)
1448 macro = Macro(lines)
1434 self.shell.define_macro(name, macro)
1449 self.shell.define_macro(name, macro)
1435 if not ( 'q' in opts) :
1450 if not ( 'q' in opts) :
1436 print('Macro `%s` created. To execute, type its name (without quotes).' % name)
1451 print('Macro `%s` created. To execute, type its name (without quotes).' % name)
1437 print('=== Macro contents: ===')
1452 print('=== Macro contents: ===')
1438 print(macro, end=' ')
1453 print(macro, end=' ')
1439
1454
1440 @magic_arguments.magic_arguments()
1455 @magic_arguments.magic_arguments()
1441 @magic_arguments.argument('output', type=str, default='', nargs='?',
1456 @magic_arguments.argument('output', type=str, default='', nargs='?',
1442 help="""The name of the variable in which to store output.
1457 help="""The name of the variable in which to store output.
1443 This is a utils.io.CapturedIO object with stdout/err attributes
1458 This is a utils.io.CapturedIO object with stdout/err attributes
1444 for the text of the captured output.
1459 for the text of the captured output.
1445
1460
1446 CapturedOutput also has a show() method for displaying the output,
1461 CapturedOutput also has a show() method for displaying the output,
1447 and __call__ as well, so you can use that to quickly display the
1462 and __call__ as well, so you can use that to quickly display the
1448 output.
1463 output.
1449
1464
1450 If unspecified, captured output is discarded.
1465 If unspecified, captured output is discarded.
1451 """
1466 """
1452 )
1467 )
1453 @magic_arguments.argument('--no-stderr', action="store_true",
1468 @magic_arguments.argument('--no-stderr', action="store_true",
1454 help="""Don't capture stderr."""
1469 help="""Don't capture stderr."""
1455 )
1470 )
1456 @magic_arguments.argument('--no-stdout', action="store_true",
1471 @magic_arguments.argument('--no-stdout', action="store_true",
1457 help="""Don't capture stdout."""
1472 help="""Don't capture stdout."""
1458 )
1473 )
1459 @magic_arguments.argument('--no-display', action="store_true",
1474 @magic_arguments.argument('--no-display', action="store_true",
1460 help="""Don't capture IPython's rich display."""
1475 help="""Don't capture IPython's rich display."""
1461 )
1476 )
1462 @cell_magic
1477 @cell_magic
1463 def capture(self, line, cell):
1478 def capture(self, line, cell):
1464 """run the cell, capturing stdout, stderr, and IPython's rich display() calls."""
1479 """run the cell, capturing stdout, stderr, and IPython's rich display() calls."""
1465 args = magic_arguments.parse_argstring(self.capture, line)
1480 args = magic_arguments.parse_argstring(self.capture, line)
1466 out = not args.no_stdout
1481 out = not args.no_stdout
1467 err = not args.no_stderr
1482 err = not args.no_stderr
1468 disp = not args.no_display
1483 disp = not args.no_display
1469 with capture_output(out, err, disp) as io:
1484 with capture_output(out, err, disp) as io:
1470 self.shell.run_cell(cell)
1485 self.shell.run_cell(cell)
1471 if DisplayHook.semicolon_at_end_of_expression(cell):
1486 if DisplayHook.semicolon_at_end_of_expression(cell):
1472 if args.output in self.shell.user_ns:
1487 if args.output in self.shell.user_ns:
1473 del self.shell.user_ns[args.output]
1488 del self.shell.user_ns[args.output]
1474 elif args.output:
1489 elif args.output:
1475 self.shell.user_ns[args.output] = io
1490 self.shell.user_ns[args.output] = io
1476
1491
1492 @skip_doctest
1493 @magic_arguments.magic_arguments()
1494 @magic_arguments.argument("name", type=str, default="default", nargs="?")
1495 @magic_arguments.argument(
1496 "--remove", action="store_true", help="remove the current transformer"
1497 )
1498 @magic_arguments.argument(
1499 "--list", action="store_true", help="list existing transformers name"
1500 )
1501 @magic_arguments.argument(
1502 "--list-all",
1503 action="store_true",
1504 help="list existing transformers name and code template",
1505 )
1506 @line_cell_magic
1507 def code_wrap(self, line, cell=None):
1508 """
1509 Simple magic to quickly define a code transformer for all IPython's future imput.
1510
1511 ``__code__`` and ``__ret__`` are special variable that represent the code to run
1512 and the value of the last expression of ``__code__`` respectively.
1513
1514 Examples
1515 --------
1516
1517 .. ipython::
1518
1519 In [1]: %%code_wrap before_after
1520 ...: print('before')
1521 ...: __code__
1522 ...: print('after')
1523 ...: __ret__
1524
1525
1526 In [2]: 1
1527 before
1528 after
1529 Out[2]: 1
1530
1531 In [3]: %code_wrap --list
1532 before_after
1533
1534 In [4]: %code_wrap --list-all
1535 before_after :
1536 print('before')
1537 __code__
1538 print('after')
1539 __ret__
1540
1541 In [5]: %code_wrap --remove before_after
1542
1543 """
1544 args = magic_arguments.parse_argstring(self.code_wrap, line)
1545
1546 if args.list:
1547 for name in self._transformers.keys():
1548 print(name)
1549 return
1550 if args.list_all:
1551 for name, _t in self._transformers.items():
1552 print(name, ":")
1553 print(indent(ast.unparse(_t.template), " "))
1554 print()
1555 return
1556
1557 to_remove = self._transformers.pop(args.name, None)
1558 if to_remove in self.shell.ast_transformers:
1559 self.shell.ast_transformers.remove(to_remove)
1560 if cell is None or args.remove:
1561 return
1562
1563 _trs = ReplaceCodeTransformer(ast.parse(cell))
1564
1565 self._transformers[args.name] = _trs
1566 self.shell.ast_transformers.append(_trs)
1567
1568
1477 def parse_breakpoint(text, current_file):
1569 def parse_breakpoint(text, current_file):
1478 '''Returns (file, line) for file:line and (current_file, line) for line'''
1570 '''Returns (file, line) for file:line and (current_file, line) for line'''
1479 colon = text.find(':')
1571 colon = text.find(':')
1480 if colon == -1:
1572 if colon == -1:
1481 return current_file, int(text)
1573 return current_file, int(text)
1482 else:
1574 else:
1483 return text[:colon], int(text[colon+1:])
1575 return text[:colon], int(text[colon+1:])
1484
1576
1485 def _format_time(timespan, precision=3):
1577 def _format_time(timespan, precision=3):
1486 """Formats the timespan in a human readable form"""
1578 """Formats the timespan in a human readable form"""
1487
1579
1488 if timespan >= 60.0:
1580 if timespan >= 60.0:
1489 # we have more than a minute, format that in a human readable form
1581 # we have more than a minute, format that in a human readable form
1490 # Idea from http://snipplr.com/view/5713/
1582 # Idea from http://snipplr.com/view/5713/
1491 parts = [("d", 60*60*24),("h", 60*60),("min", 60), ("s", 1)]
1583 parts = [("d", 60*60*24),("h", 60*60),("min", 60), ("s", 1)]
1492 time = []
1584 time = []
1493 leftover = timespan
1585 leftover = timespan
1494 for suffix, length in parts:
1586 for suffix, length in parts:
1495 value = int(leftover / length)
1587 value = int(leftover / length)
1496 if value > 0:
1588 if value > 0:
1497 leftover = leftover % length
1589 leftover = leftover % length
1498 time.append(u'%s%s' % (str(value), suffix))
1590 time.append(u'%s%s' % (str(value), suffix))
1499 if leftover < 1:
1591 if leftover < 1:
1500 break
1592 break
1501 return " ".join(time)
1593 return " ".join(time)
1502
1594
1503
1595
1504 # Unfortunately the unicode 'micro' symbol can cause problems in
1596 # Unfortunately the unicode 'micro' symbol can cause problems in
1505 # certain terminals.
1597 # certain terminals.
1506 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1598 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1507 # Try to prevent crashes by being more secure than it needs to
1599 # Try to prevent crashes by being more secure than it needs to
1508 # E.g. eclipse is able to print a Β΅, but has no sys.stdout.encoding set.
1600 # E.g. eclipse is able to print a Β΅, but has no sys.stdout.encoding set.
1509 units = [u"s", u"ms",u'us',"ns"] # the save value
1601 units = [u"s", u"ms",u'us',"ns"] # the save value
1510 if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding:
1602 if hasattr(sys.stdout, 'encoding') and sys.stdout.encoding:
1511 try:
1603 try:
1512 u'\xb5'.encode(sys.stdout.encoding)
1604 u'\xb5'.encode(sys.stdout.encoding)
1513 units = [u"s", u"ms",u'\xb5s',"ns"]
1605 units = [u"s", u"ms",u'\xb5s',"ns"]
1514 except:
1606 except:
1515 pass
1607 pass
1516 scaling = [1, 1e3, 1e6, 1e9]
1608 scaling = [1, 1e3, 1e6, 1e9]
1517
1609
1518 if timespan > 0.0:
1610 if timespan > 0.0:
1519 order = min(-int(math.floor(math.log10(timespan)) // 3), 3)
1611 order = min(-int(math.floor(math.log10(timespan)) // 3), 3)
1520 else:
1612 else:
1521 order = 3
1613 order = 3
1522 return u"%.*g %s" % (precision, timespan * scaling[order], units[order])
1614 return "%.*g %s" % (precision, timespan * scaling[order], units[order])
@@ -1,83 +1,81 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 """Script to auto-generate our API docs.
2 """Script to auto-generate our API docs.
3 """
3 """
4
4
5 import os
5 import os
6 import sys
6 import sys
7
7
8 pjoin = os.path.join
8 pjoin = os.path.join
9
9
10 here = os.path.abspath(os.path.dirname(__file__))
10 here = os.path.abspath(os.path.dirname(__file__))
11 sys.path.append(pjoin(os.path.abspath(here), 'sphinxext'))
11 sys.path.append(pjoin(os.path.abspath(here), 'sphinxext'))
12
12
13 from apigen import ApiDocWriter
13 from apigen import ApiDocWriter
14
14
15 source = pjoin(here, 'source')
15 source = pjoin(here, 'source')
16
16
17 #*****************************************************************************
17 #*****************************************************************************
18 if __name__ == '__main__':
18 if __name__ == '__main__':
19 package = 'IPython'
19 package = 'IPython'
20 outdir = pjoin(source, 'api', 'generated')
20 outdir = pjoin(source, 'api', 'generated')
21 docwriter = ApiDocWriter(package,rst_extension='.rst')
21 docwriter = ApiDocWriter(package,rst_extension='.rst')
22 # You have to escape the . here because . is a special char for regexps.
22 # You have to escape the . here because . is a special char for regexps.
23 # You must do make clean if you change this!
23 # You must do make clean if you change this!
24 docwriter.package_skip_patterns += [r'\.external$',
24 docwriter.package_skip_patterns += [r'\.external$',
25 # Extensions are documented elsewhere.
25 # Extensions are documented elsewhere.
26 r'\.extensions',
26 r'\.extensions',
27 # Magics are documented separately
28 r'\.core\.magics',
29 # This isn't API
27 # This isn't API
30 r'\.sphinxext',
28 r'\.sphinxext',
31 # Shims
29 # Shims
32 r'\.kernel',
30 r'\.kernel',
33 r'\.terminal\.pt_inputhooks',
31 r'\.terminal\.pt_inputhooks',
34 ]
32 ]
35
33
36 # The inputhook* modules often cause problems on import, such as trying to
34 # The inputhook* modules often cause problems on import, such as trying to
37 # load incompatible Qt bindings. It's easiest to leave them all out. The
35 # load incompatible Qt bindings. It's easiest to leave them all out. The
38 docwriter.module_skip_patterns += [
36 docwriter.module_skip_patterns += [
39 r"\.lib\.inputhook.+",
37 r"\.lib\.inputhook.+",
40 r"\.ipdoctest",
38 r"\.ipdoctest",
41 r"\.testing\.plugin",
39 r"\.testing\.plugin",
42 # Backwards compat import for lib.lexers
40 # Backwards compat import for lib.lexers
43 r"\.nbconvert\.utils\.lexers",
41 r"\.nbconvert\.utils\.lexers",
44 # We document this manually.
42 # We document this manually.
45 r"\.utils\.py3compat",
43 r"\.utils\.py3compat",
46 # These are exposed in display
44 # These are exposed in display
47 r"\.core\.display",
45 r"\.core\.display",
48 r"\.lib\.display",
46 r"\.lib\.display",
49 # Shims
47 # Shims
50 r"\.config",
48 r"\.config",
51 r"\.consoleapp",
49 r"\.consoleapp",
52 r"\.frontend$",
50 r"\.frontend$",
53 r"\.html",
51 r"\.html",
54 r"\.nbconvert",
52 r"\.nbconvert",
55 r"\.nbformat",
53 r"\.nbformat",
56 r"\.parallel",
54 r"\.parallel",
57 r"\.qt",
55 r"\.qt",
58 # this is deprecated.
56 # this is deprecated.
59 r"\.utils\.version",
57 r"\.utils\.version",
60 # Private APIs (there should be a lot more here)
58 # Private APIs (there should be a lot more here)
61 r"\.terminal\.ptutils",
59 r"\.terminal\.ptutils",
62 ]
60 ]
63 # main API is in the inputhook module, which is documented.
61 # main API is in the inputhook module, which is documented.
64
62
65 # These modules import functions and classes from other places to expose
63 # These modules import functions and classes from other places to expose
66 # them as part of the public API. They must have __all__ defined. The
64 # them as part of the public API. They must have __all__ defined. The
67 # non-API modules they import from should be excluded by the skip patterns
65 # non-API modules they import from should be excluded by the skip patterns
68 # above.
66 # above.
69 docwriter.names_from__all__.update(
67 docwriter.names_from__all__.update(
70 {
68 {
71 "IPython",
69 "IPython",
72 "IPython.display",
70 "IPython.display",
73 }
71 }
74 )
72 )
75
73
76 # Now, generate the outputs
74 # Now, generate the outputs
77 docwriter.write_api_docs(outdir)
75 docwriter.write_api_docs(outdir)
78 # Write index with .txt extension - we can include it, but Sphinx won't try
76 # Write index with .txt extension - we can include it, but Sphinx won't try
79 # to compile it
77 # to compile it
80 docwriter.write_index(outdir, 'gen.txt',
78 docwriter.write_index(outdir, 'gen.txt',
81 relative_to = pjoin(source, 'api')
79 relative_to = pjoin(source, 'api')
82 )
80 )
83 print ('%d files written' % len(docwriter.written_modules))
81 print ('%d files written' % len(docwriter.written_modules))
General Comments 0
You need to be logged in to leave comments. Login now