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