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