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