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