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