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