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