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