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