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