Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/IPython/core/interactiveshell.py: 22%

1539 statements  

« prev     ^ index     » next       coverage.py v7.4.4, created at 2024-04-20 06:09 +0000

1# -*- coding: utf-8 -*- 

2"""Main IPython class.""" 

3 

4#----------------------------------------------------------------------------- 

5# Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> 

6# Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu> 

7# Copyright (C) 2008-2011 The IPython Development Team 

8# 

9# Distributed under the terms of the BSD License. The full license is in 

10# the file COPYING, distributed as part of this software. 

11#----------------------------------------------------------------------------- 

12 

13 

14import abc 

15import ast 

16import atexit 

17import bdb 

18import builtins as builtin_mod 

19import functools 

20import inspect 

21import os 

22import re 

23import runpy 

24import subprocess 

25import sys 

26import tempfile 

27import traceback 

28import types 

29import warnings 

30from ast import stmt 

31from io import open as io_open 

32from logging import error 

33from pathlib import Path 

34from typing import Callable 

35from typing import List as ListType, Dict as DictType, Any as AnyType 

36from typing import Optional, Sequence, Tuple 

37from warnings import warn 

38 

39from pickleshare import PickleShareDB 

40from tempfile import TemporaryDirectory 

41from traitlets import ( 

42 Any, 

43 Bool, 

44 CaselessStrEnum, 

45 Dict, 

46 Enum, 

47 Instance, 

48 Integer, 

49 List, 

50 Type, 

51 Unicode, 

52 default, 

53 observe, 

54 validate, 

55) 

56from traitlets.config.configurable import SingletonConfigurable 

57from traitlets.utils.importstring import import_item 

58 

59import IPython.core.hooks 

60from IPython.core import magic, oinspect, page, prefilter, ultratb 

61from IPython.core.alias import Alias, AliasManager 

62from IPython.core.autocall import ExitAutocall 

63from IPython.core.builtin_trap import BuiltinTrap 

64from IPython.core.compilerop import CachingCompiler 

65from IPython.core.debugger import InterruptiblePdb 

66from IPython.core.display_trap import DisplayTrap 

67from IPython.core.displayhook import DisplayHook 

68from IPython.core.displaypub import DisplayPublisher 

69from IPython.core.error import InputRejected, UsageError 

70from IPython.core.events import EventManager, available_events 

71from IPython.core.extensions import ExtensionManager 

72from IPython.core.formatters import DisplayFormatter 

73from IPython.core.history import HistoryManager 

74from IPython.core.inputtransformer2 import ESC_MAGIC, ESC_MAGIC2 

75from IPython.core.logger import Logger 

76from IPython.core.macro import Macro 

77from IPython.core.payload import PayloadManager 

78from IPython.core.prefilter import PrefilterManager 

79from IPython.core.profiledir import ProfileDir 

80from IPython.core.usage import default_banner 

81from IPython.display import display 

82from IPython.paths import get_ipython_dir 

83from IPython.testing.skipdoctest import skip_doctest 

84from IPython.utils import PyColorize, io, openpy, py3compat 

85from IPython.utils.decorators import undoc 

86from IPython.utils.io import ask_yes_no 

87from IPython.utils.ipstruct import Struct 

88from IPython.utils.path import ensure_dir_exists, get_home_dir, get_py_filename 

89from IPython.utils.process import getoutput, system 

90from IPython.utils.strdispatch import StrDispatch 

91from IPython.utils.syspathcontext import prepended_to_syspath 

92from IPython.utils.text import DollarFormatter, LSString, SList, format_screen 

93from IPython.core.oinspect import OInfo 

94 

95 

96sphinxify: Optional[Callable] 

97 

98try: 

99 import docrepr.sphinxify as sphx 

100 

101 def sphinxify(oinfo): 

102 wrapped_docstring = sphx.wrap_main_docstring(oinfo) 

103 

104 def sphinxify_docstring(docstring): 

105 with TemporaryDirectory() as dirname: 

106 return { 

107 "text/html": sphx.sphinxify(wrapped_docstring, dirname), 

108 "text/plain": docstring, 

109 } 

110 

111 return sphinxify_docstring 

112except ImportError: 

113 sphinxify = None 

114 

115 

116class ProvisionalWarning(DeprecationWarning): 

117 """ 

118 Warning class for unstable features 

119 """ 

120 pass 

121 

122from ast import Module 

123 

124_assign_nodes = (ast.AugAssign, ast.AnnAssign, ast.Assign) 

125_single_targets_nodes = (ast.AugAssign, ast.AnnAssign) 

126 

127#----------------------------------------------------------------------------- 

128# Await Helpers 

129#----------------------------------------------------------------------------- 

130 

131# we still need to run things using the asyncio eventloop, but there is no 

132# async integration 

133from .async_helpers import ( 

134 _asyncio_runner, 

135 _curio_runner, 

136 _pseudo_sync_runner, 

137 _should_be_async, 

138 _trio_runner, 

139) 

140 

141#----------------------------------------------------------------------------- 

142# Globals 

143#----------------------------------------------------------------------------- 

144 

145# compiled regexps for autoindent management 

146dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass') 

147 

148#----------------------------------------------------------------------------- 

149# Utilities 

150#----------------------------------------------------------------------------- 

151 

152 

153def is_integer_string(s: str): 

154 """ 

155 Variant of "str.isnumeric()" that allow negative values and other ints. 

156 """ 

157 try: 

158 int(s) 

159 return True 

160 except ValueError: 

161 return False 

162 raise ValueError("Unexpected error") 

163 

164 

165@undoc 

166def softspace(file, newvalue): 

167 """Copied from code.py, to remove the dependency""" 

168 

169 oldvalue = 0 

170 try: 

171 oldvalue = file.softspace 

172 except AttributeError: 

173 pass 

174 try: 

175 file.softspace = newvalue 

176 except (AttributeError, TypeError): 

177 # "attribute-less object" or "read-only attributes" 

178 pass 

179 return oldvalue 

180 

181@undoc 

182def no_op(*a, **kw): 

183 pass 

184 

185 

186class SpaceInInput(Exception): pass 

187 

188 

189class SeparateUnicode(Unicode): 

190 r"""A Unicode subclass to validate separate_in, separate_out, etc. 

191 

192 This is a Unicode based trait that converts '0'->'' and ``'\\n'->'\n'``. 

193 """ 

194 

195 def validate(self, obj, value): 

196 if value == '0': value = '' 

197 value = value.replace('\\n','\n') 

198 return super(SeparateUnicode, self).validate(obj, value) 

199 

200 

201@undoc 

202class DummyMod(object): 

203 """A dummy module used for IPython's interactive module when 

204 a namespace must be assigned to the module's __dict__.""" 

205 __spec__ = None 

206 

207 

208class ExecutionInfo(object): 

209 """The arguments used for a call to :meth:`InteractiveShell.run_cell` 

210 

211 Stores information about what is going to happen. 

212 """ 

213 raw_cell = None 

214 store_history = False 

215 silent = False 

216 shell_futures = True 

217 cell_id = None 

218 

219 def __init__(self, raw_cell, store_history, silent, shell_futures, cell_id): 

220 self.raw_cell = raw_cell 

221 self.store_history = store_history 

222 self.silent = silent 

223 self.shell_futures = shell_futures 

224 self.cell_id = cell_id 

225 

226 def __repr__(self): 

227 name = self.__class__.__qualname__ 

228 raw_cell = ( 

229 (self.raw_cell[:50] + "..") if len(self.raw_cell) > 50 else self.raw_cell 

230 ) 

231 return ( 

232 '<%s object at %x, raw_cell="%s" store_history=%s silent=%s shell_futures=%s cell_id=%s>' 

233 % ( 

234 name, 

235 id(self), 

236 raw_cell, 

237 self.store_history, 

238 self.silent, 

239 self.shell_futures, 

240 self.cell_id, 

241 ) 

242 ) 

243 

244 

245class ExecutionResult(object): 

246 """The result of a call to :meth:`InteractiveShell.run_cell` 

247 

248 Stores information about what took place. 

249 """ 

250 execution_count = None 

251 error_before_exec = None 

252 error_in_exec: Optional[BaseException] = None 

253 info = None 

254 result = None 

255 

256 def __init__(self, info): 

257 self.info = info 

258 

259 @property 

260 def success(self): 

261 return (self.error_before_exec is None) and (self.error_in_exec is None) 

262 

263 def raise_error(self): 

264 """Reraises error if `success` is `False`, otherwise does nothing""" 

265 if self.error_before_exec is not None: 

266 raise self.error_before_exec 

267 if self.error_in_exec is not None: 

268 raise self.error_in_exec 

269 

270 def __repr__(self): 

271 name = self.__class__.__qualname__ 

272 return '<%s object at %x, execution_count=%s error_before_exec=%s error_in_exec=%s info=%s result=%s>' %\ 

273 (name, id(self), self.execution_count, self.error_before_exec, self.error_in_exec, repr(self.info), repr(self.result)) 

274 

275@functools.wraps(io_open) 

276def _modified_open(file, *args, **kwargs): 

277 if file in {0, 1, 2}: 

278 raise ValueError( 

279 f"IPython won't let you open fd={file} by default " 

280 "as it is likely to crash IPython. If you know what you are doing, " 

281 "you can use builtins' open." 

282 ) 

283 

284 return io_open(file, *args, **kwargs) 

285 

286class InteractiveShell(SingletonConfigurable): 

287 """An enhanced, interactive shell for Python.""" 

288 

289 _instance = None 

290 

291 ast_transformers = List([], help= 

292 """ 

293 A list of ast.NodeTransformer subclass instances, which will be applied 

294 to user input before code is run. 

295 """ 

296 ).tag(config=True) 

297 

298 autocall = Enum((0,1,2), default_value=0, help= 

299 """ 

300 Make IPython automatically call any callable object even if you didn't 

301 type explicit parentheses. For example, 'str 43' becomes 'str(43)' 

302 automatically. The value can be '0' to disable the feature, '1' for 

303 'smart' autocall, where it is not applied if there are no more 

304 arguments on the line, and '2' for 'full' autocall, where all callable 

305 objects are automatically called (even if no arguments are present). 

306 """ 

307 ).tag(config=True) 

308 

309 autoindent = Bool(True, help= 

310 """ 

311 Autoindent IPython code entered interactively. 

312 """ 

313 ).tag(config=True) 

314 

315 autoawait = Bool(True, help= 

316 """ 

317 Automatically run await statement in the top level repl. 

318 """ 

319 ).tag(config=True) 

320 

321 loop_runner_map ={ 

322 'asyncio':(_asyncio_runner, True), 

323 'curio':(_curio_runner, True), 

324 'trio':(_trio_runner, True), 

325 'sync': (_pseudo_sync_runner, False) 

326 } 

327 

328 loop_runner = Any(default_value="IPython.core.interactiveshell._asyncio_runner", 

329 allow_none=True, 

330 help="""Select the loop runner that will be used to execute top-level asynchronous code""" 

331 ).tag(config=True) 

332 

333 @default('loop_runner') 

334 def _default_loop_runner(self): 

335 return import_item("IPython.core.interactiveshell._asyncio_runner") 

336 

337 @validate('loop_runner') 

338 def _import_runner(self, proposal): 

339 if isinstance(proposal.value, str): 

340 if proposal.value in self.loop_runner_map: 

341 runner, autoawait = self.loop_runner_map[proposal.value] 

342 self.autoawait = autoawait 

343 return runner 

344 runner = import_item(proposal.value) 

345 if not callable(runner): 

346 raise ValueError('loop_runner must be callable') 

347 return runner 

348 if not callable(proposal.value): 

349 raise ValueError('loop_runner must be callable') 

350 return proposal.value 

351 

352 automagic = Bool(True, help= 

353 """ 

354 Enable magic commands to be called without the leading %. 

355 """ 

356 ).tag(config=True) 

357 

358 banner1 = Unicode(default_banner, 

359 help="""The part of the banner to be printed before the profile""" 

360 ).tag(config=True) 

361 banner2 = Unicode('', 

362 help="""The part of the banner to be printed after the profile""" 

363 ).tag(config=True) 

364 

365 cache_size = Integer(1000, help= 

366 """ 

367 Set the size of the output cache. The default is 1000, you can 

368 change it permanently in your config file. Setting it to 0 completely 

369 disables the caching system, and the minimum value accepted is 3 (if 

370 you provide a value less than 3, it is reset to 0 and a warning is 

371 issued). This limit is defined because otherwise you'll spend more 

372 time re-flushing a too small cache than working 

373 """ 

374 ).tag(config=True) 

375 color_info = Bool(True, help= 

376 """ 

377 Use colors for displaying information about objects. Because this 

378 information is passed through a pager (like 'less'), and some pagers 

379 get confused with color codes, this capability can be turned off. 

380 """ 

381 ).tag(config=True) 

382 colors = CaselessStrEnum(('Neutral', 'NoColor','LightBG','Linux'), 

383 default_value='Neutral', 

384 help="Set the color scheme (NoColor, Neutral, Linux, or LightBG)." 

385 ).tag(config=True) 

386 debug = Bool(False).tag(config=True) 

387 disable_failing_post_execute = Bool(False, 

388 help="Don't call post-execute functions that have failed in the past." 

389 ).tag(config=True) 

390 display_formatter = Instance(DisplayFormatter, allow_none=True) 

391 displayhook_class = Type(DisplayHook) 

392 display_pub_class = Type(DisplayPublisher) 

393 compiler_class = Type(CachingCompiler) 

394 inspector_class = Type( 

395 oinspect.Inspector, help="Class to use to instantiate the shell inspector" 

396 ).tag(config=True) 

397 

398 sphinxify_docstring = Bool(False, help= 

399 """ 

400 Enables rich html representation of docstrings. (This requires the 

401 docrepr module). 

402 """).tag(config=True) 

403 

404 @observe("sphinxify_docstring") 

405 def _sphinxify_docstring_changed(self, change): 

406 if change['new']: 

407 warn("`sphinxify_docstring` is provisional since IPython 5.0 and might change in future versions." , ProvisionalWarning) 

408 

409 enable_html_pager = Bool(False, help= 

410 """ 

411 (Provisional API) enables html representation in mime bundles sent 

412 to pagers. 

413 """).tag(config=True) 

414 

415 @observe("enable_html_pager") 

416 def _enable_html_pager_changed(self, change): 

417 if change['new']: 

418 warn("`enable_html_pager` is provisional since IPython 5.0 and might change in future versions.", ProvisionalWarning) 

419 

420 data_pub_class = None 

421 

422 exit_now = Bool(False) 

423 exiter = Instance(ExitAutocall) 

424 @default('exiter') 

425 def _exiter_default(self): 

426 return ExitAutocall(self) 

427 # Monotonically increasing execution counter 

428 execution_count = Integer(1) 

429 filename = Unicode("<ipython console>") 

430 ipython_dir= Unicode('').tag(config=True) # Set to get_ipython_dir() in __init__ 

431 

432 # Used to transform cells before running them, and check whether code is complete 

433 input_transformer_manager = Instance('IPython.core.inputtransformer2.TransformerManager', 

434 ()) 

435 

436 @property 

437 def input_transformers_cleanup(self): 

438 return self.input_transformer_manager.cleanup_transforms 

439 

440 input_transformers_post = List([], 

441 help="A list of string input transformers, to be applied after IPython's " 

442 "own input transformations." 

443 ) 

444 

445 @property 

446 def input_splitter(self): 

447 """Make this available for backward compatibility (pre-7.0 release) with existing code. 

448 

449 For example, ipykernel ipykernel currently uses 

450 `shell.input_splitter.check_complete` 

451 """ 

452 from warnings import warn 

453 warn("`input_splitter` is deprecated since IPython 7.0, prefer `input_transformer_manager`.", 

454 DeprecationWarning, stacklevel=2 

455 ) 

456 return self.input_transformer_manager 

457 

458 logstart = Bool(False, help= 

459 """ 

460 Start logging to the default log file in overwrite mode. 

461 Use `logappend` to specify a log file to **append** logs to. 

462 """ 

463 ).tag(config=True) 

464 logfile = Unicode('', help= 

465 """ 

466 The name of the logfile to use. 

467 """ 

468 ).tag(config=True) 

469 logappend = Unicode('', help= 

470 """ 

471 Start logging to the given file in append mode. 

472 Use `logfile` to specify a log file to **overwrite** logs to. 

473 """ 

474 ).tag(config=True) 

475 object_info_string_level = Enum((0,1,2), default_value=0, 

476 ).tag(config=True) 

477 pdb = Bool(False, help= 

478 """ 

479 Automatically call the pdb debugger after every exception. 

480 """ 

481 ).tag(config=True) 

482 display_page = Bool(False, 

483 help="""If True, anything that would be passed to the pager 

484 will be displayed as regular output instead.""" 

485 ).tag(config=True) 

486 

487 

488 show_rewritten_input = Bool(True, 

489 help="Show rewritten input, e.g. for autocall." 

490 ).tag(config=True) 

491 

492 quiet = Bool(False).tag(config=True) 

493 

494 history_length = Integer(10000, 

495 help='Total length of command history' 

496 ).tag(config=True) 

497 

498 history_load_length = Integer(1000, help= 

499 """ 

500 The number of saved history entries to be loaded 

501 into the history buffer at startup. 

502 """ 

503 ).tag(config=True) 

504 

505 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none', 'last_expr_or_assign'], 

506 default_value='last_expr', 

507 help=""" 

508 'all', 'last', 'last_expr' or 'none', 'last_expr_or_assign' specifying 

509 which nodes should be run interactively (displaying output from expressions). 

510 """ 

511 ).tag(config=True) 

512 

513 warn_venv = Bool( 

514 True, 

515 help="Warn if running in a virtual environment with no IPython installed (so IPython from the global environment is used).", 

516 ).tag(config=True) 

517 

518 # TODO: this part of prompt management should be moved to the frontends. 

519 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n' 

520 separate_in = SeparateUnicode('\n').tag(config=True) 

521 separate_out = SeparateUnicode('').tag(config=True) 

522 separate_out2 = SeparateUnicode('').tag(config=True) 

523 wildcards_case_sensitive = Bool(True).tag(config=True) 

524 xmode = CaselessStrEnum(('Context', 'Plain', 'Verbose', 'Minimal'), 

525 default_value='Context', 

526 help="Switch modes for the IPython exception handlers." 

527 ).tag(config=True) 

528 

529 # Subcomponents of InteractiveShell 

530 alias_manager = Instance('IPython.core.alias.AliasManager', allow_none=True) 

531 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager', allow_none=True) 

532 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap', allow_none=True) 

533 display_trap = Instance('IPython.core.display_trap.DisplayTrap', allow_none=True) 

534 extension_manager = Instance('IPython.core.extensions.ExtensionManager', allow_none=True) 

535 payload_manager = Instance('IPython.core.payload.PayloadManager', allow_none=True) 

536 history_manager = Instance('IPython.core.history.HistoryAccessorBase', allow_none=True) 

537 magics_manager = Instance('IPython.core.magic.MagicsManager', allow_none=True) 

538 

539 profile_dir = Instance('IPython.core.application.ProfileDir', allow_none=True) 

540 @property 

541 def profile(self): 

542 if self.profile_dir is not None: 

543 name = os.path.basename(self.profile_dir.location) 

544 return name.replace('profile_','') 

545 

546 

547 # Private interface 

548 _post_execute = Dict() 

549 

550 # Tracks any GUI loop loaded for pylab 

551 pylab_gui_select = None 

552 

553 last_execution_succeeded = Bool(True, help='Did last executed command succeeded') 

554 

555 last_execution_result = Instance('IPython.core.interactiveshell.ExecutionResult', help='Result of executing the last command', allow_none=True) 

556 

557 def __init__(self, ipython_dir=None, profile_dir=None, 

558 user_module=None, user_ns=None, 

559 custom_exceptions=((), None), **kwargs): 

560 # This is where traits with a config_key argument are updated 

561 # from the values on config. 

562 super(InteractiveShell, self).__init__(**kwargs) 

563 if 'PromptManager' in self.config: 

564 warn('As of IPython 5.0 `PromptManager` config will have no effect' 

565 ' and has been replaced by TerminalInteractiveShell.prompts_class') 

566 self.configurables = [self] 

567 

568 # These are relatively independent and stateless 

569 self.init_ipython_dir(ipython_dir) 

570 self.init_profile_dir(profile_dir) 

571 self.init_instance_attrs() 

572 self.init_environment() 

573 

574 # Check if we're in a virtualenv, and set up sys.path. 

575 self.init_virtualenv() 

576 

577 # Create namespaces (user_ns, user_global_ns, etc.) 

578 self.init_create_namespaces(user_module, user_ns) 

579 # This has to be done after init_create_namespaces because it uses 

580 # something in self.user_ns, but before init_sys_modules, which 

581 # is the first thing to modify sys. 

582 # TODO: When we override sys.stdout and sys.stderr before this class 

583 # is created, we are saving the overridden ones here. Not sure if this 

584 # is what we want to do. 

585 self.save_sys_module_state() 

586 self.init_sys_modules() 

587 

588 # While we're trying to have each part of the code directly access what 

589 # it needs without keeping redundant references to objects, we have too 

590 # much legacy code that expects ip.db to exist. 

591 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db')) 

592 

593 self.init_history() 

594 self.init_encoding() 

595 self.init_prefilter() 

596 

597 self.init_syntax_highlighting() 

598 self.init_hooks() 

599 self.init_events() 

600 self.init_pushd_popd_magic() 

601 self.init_user_ns() 

602 self.init_logger() 

603 self.init_builtins() 

604 

605 # The following was in post_config_initialization 

606 self.init_inspector() 

607 self.raw_input_original = input 

608 self.init_completer() 

609 # TODO: init_io() needs to happen before init_traceback handlers 

610 # because the traceback handlers hardcode the stdout/stderr streams. 

611 # This logic in in debugger.Pdb and should eventually be changed. 

612 self.init_io() 

613 self.init_traceback_handlers(custom_exceptions) 

614 self.init_prompts() 

615 self.init_display_formatter() 

616 self.init_display_pub() 

617 self.init_data_pub() 

618 self.init_displayhook() 

619 self.init_magics() 

620 self.init_alias() 

621 self.init_logstart() 

622 self.init_pdb() 

623 self.init_extension_manager() 

624 self.init_payload() 

625 self.events.trigger('shell_initialized', self) 

626 atexit.register(self.atexit_operations) 

627 

628 # The trio runner is used for running Trio in the foreground thread. It 

629 # is different from `_trio_runner(async_fn)` in `async_helpers.py` 

630 # which calls `trio.run()` for every cell. This runner runs all cells 

631 # inside a single Trio event loop. If used, it is set from 

632 # `ipykernel.kernelapp`. 

633 self.trio_runner = None 

634 

635 def get_ipython(self): 

636 """Return the currently running IPython instance.""" 

637 return self 

638 

639 #------------------------------------------------------------------------- 

640 # Trait changed handlers 

641 #------------------------------------------------------------------------- 

642 @observe('ipython_dir') 

643 def _ipython_dir_changed(self, change): 

644 ensure_dir_exists(change['new']) 

645 

646 def set_autoindent(self,value=None): 

647 """Set the autoindent flag. 

648 

649 If called with no arguments, it acts as a toggle.""" 

650 if value is None: 

651 self.autoindent = not self.autoindent 

652 else: 

653 self.autoindent = value 

654 

655 def set_trio_runner(self, tr): 

656 self.trio_runner = tr 

657 

658 #------------------------------------------------------------------------- 

659 # init_* methods called by __init__ 

660 #------------------------------------------------------------------------- 

661 

662 def init_ipython_dir(self, ipython_dir): 

663 if ipython_dir is not None: 

664 self.ipython_dir = ipython_dir 

665 return 

666 

667 self.ipython_dir = get_ipython_dir() 

668 

669 def init_profile_dir(self, profile_dir): 

670 if profile_dir is not None: 

671 self.profile_dir = profile_dir 

672 return 

673 self.profile_dir = ProfileDir.create_profile_dir_by_name( 

674 self.ipython_dir, "default" 

675 ) 

676 

677 def init_instance_attrs(self): 

678 self.more = False 

679 

680 # command compiler 

681 self.compile = self.compiler_class() 

682 

683 # Make an empty namespace, which extension writers can rely on both 

684 # existing and NEVER being used by ipython itself. This gives them a 

685 # convenient location for storing additional information and state 

686 # their extensions may require, without fear of collisions with other 

687 # ipython names that may develop later. 

688 self.meta = Struct() 

689 

690 # Temporary files used for various purposes. Deleted at exit. 

691 # The files here are stored with Path from Pathlib 

692 self.tempfiles = [] 

693 self.tempdirs = [] 

694 

695 # keep track of where we started running (mainly for crash post-mortem) 

696 # This is not being used anywhere currently. 

697 self.starting_dir = os.getcwd() 

698 

699 # Indentation management 

700 self.indent_current_nsp = 0 

701 

702 # Dict to track post-execution functions that have been registered 

703 self._post_execute = {} 

704 

705 def init_environment(self): 

706 """Any changes we need to make to the user's environment.""" 

707 pass 

708 

709 def init_encoding(self): 

710 # Get system encoding at startup time. Certain terminals (like Emacs 

711 # under Win32 have it set to None, and we need to have a known valid 

712 # encoding to use in the raw_input() method 

713 try: 

714 self.stdin_encoding = sys.stdin.encoding or 'ascii' 

715 except AttributeError: 

716 self.stdin_encoding = 'ascii' 

717 

718 

719 @observe('colors') 

720 def init_syntax_highlighting(self, changes=None): 

721 # Python source parser/formatter for syntax highlighting 

722 pyformat = PyColorize.Parser(style=self.colors, parent=self).format 

723 self.pycolorize = lambda src: pyformat(src,'str') 

724 

725 def refresh_style(self): 

726 # No-op here, used in subclass 

727 pass 

728 

729 def init_pushd_popd_magic(self): 

730 # for pushd/popd management 

731 self.home_dir = get_home_dir() 

732 

733 self.dir_stack = [] 

734 

735 def init_logger(self): 

736 self.logger = Logger(self.home_dir, logfname='ipython_log.py', 

737 logmode='rotate') 

738 

739 def init_logstart(self): 

740 """Initialize logging in case it was requested at the command line. 

741 """ 

742 if self.logappend: 

743 self.magic('logstart %s append' % self.logappend) 

744 elif self.logfile: 

745 self.magic('logstart %s' % self.logfile) 

746 elif self.logstart: 

747 self.magic('logstart') 

748 

749 

750 def init_builtins(self): 

751 # A single, static flag that we set to True. Its presence indicates 

752 # that an IPython shell has been created, and we make no attempts at 

753 # removing on exit or representing the existence of more than one 

754 # IPython at a time. 

755 builtin_mod.__dict__['__IPYTHON__'] = True 

756 builtin_mod.__dict__['display'] = display 

757 

758 self.builtin_trap = BuiltinTrap(shell=self) 

759 

760 @observe('colors') 

761 def init_inspector(self, changes=None): 

762 # Object inspector 

763 self.inspector = self.inspector_class( 

764 oinspect.InspectColors, 

765 PyColorize.ANSICodeColors, 

766 self.colors, 

767 self.object_info_string_level, 

768 ) 

769 

770 def init_io(self): 

771 # implemented in subclasses, TerminalInteractiveShell does call 

772 # colorama.init(). 

773 pass 

774 

775 def init_prompts(self): 

776 # Set system prompts, so that scripts can decide if they are running 

777 # interactively. 

778 sys.ps1 = 'In : ' 

779 sys.ps2 = '...: ' 

780 sys.ps3 = 'Out: ' 

781 

782 def init_display_formatter(self): 

783 self.display_formatter = DisplayFormatter(parent=self) 

784 self.configurables.append(self.display_formatter) 

785 

786 def init_display_pub(self): 

787 self.display_pub = self.display_pub_class(parent=self, shell=self) 

788 self.configurables.append(self.display_pub) 

789 

790 def init_data_pub(self): 

791 if not self.data_pub_class: 

792 self.data_pub = None 

793 return 

794 self.data_pub = self.data_pub_class(parent=self) 

795 self.configurables.append(self.data_pub) 

796 

797 def init_displayhook(self): 

798 # Initialize displayhook, set in/out prompts and printing system 

799 self.displayhook = self.displayhook_class( 

800 parent=self, 

801 shell=self, 

802 cache_size=self.cache_size, 

803 ) 

804 self.configurables.append(self.displayhook) 

805 # This is a context manager that installs/revmoes the displayhook at 

806 # the appropriate time. 

807 self.display_trap = DisplayTrap(hook=self.displayhook) 

808 

809 @staticmethod 

810 def get_path_links(p: Path): 

811 """Gets path links including all symlinks 

812 

813 Examples 

814 -------- 

815 In [1]: from IPython.core.interactiveshell import InteractiveShell 

816 

817 In [2]: import sys, pathlib 

818 

819 In [3]: paths = InteractiveShell.get_path_links(pathlib.Path(sys.executable)) 

820 

821 In [4]: len(paths) == len(set(paths)) 

822 Out[4]: True 

823 

824 In [5]: bool(paths) 

825 Out[5]: True 

826 """ 

827 paths = [p] 

828 while p.is_symlink(): 

829 new_path = Path(os.readlink(p)) 

830 if not new_path.is_absolute(): 

831 new_path = p.parent / new_path 

832 p = new_path 

833 paths.append(p) 

834 return paths 

835 

836 def init_virtualenv(self): 

837 """Add the current virtualenv to sys.path so the user can import modules from it. 

838 This isn't perfect: it doesn't use the Python interpreter with which the 

839 virtualenv was built, and it ignores the --no-site-packages option. A 

840 warning will appear suggesting the user installs IPython in the 

841 virtualenv, but for many cases, it probably works well enough. 

842 

843 Adapted from code snippets online. 

844 

845 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv 

846 """ 

847 if 'VIRTUAL_ENV' not in os.environ: 

848 # Not in a virtualenv 

849 return 

850 elif os.environ["VIRTUAL_ENV"] == "": 

851 warn("Virtual env path set to '', please check if this is intended.") 

852 return 

853 

854 p = Path(sys.executable) 

855 p_venv = Path(os.environ["VIRTUAL_ENV"]) 

856 

857 # fallback venv detection: 

858 # stdlib venv may symlink sys.executable, so we can't use realpath. 

859 # but others can symlink *to* the venv Python, so we can't just use sys.executable. 

860 # So we just check every item in the symlink tree (generally <= 3) 

861 paths = self.get_path_links(p) 

862 

863 # In Cygwin paths like "c:\..." and '\cygdrive\c\...' are possible 

864 if p_venv.parts[1] == "cygdrive": 

865 drive_name = p_venv.parts[2] 

866 p_venv = (drive_name + ":/") / Path(*p_venv.parts[3:]) 

867 

868 if any(p_venv == p.parents[1] for p in paths): 

869 # Our exe is inside or has access to the virtualenv, don't need to do anything. 

870 return 

871 

872 if sys.platform == "win32": 

873 virtual_env = str(Path(os.environ["VIRTUAL_ENV"], "Lib", "site-packages")) 

874 else: 

875 virtual_env_path = Path( 

876 os.environ["VIRTUAL_ENV"], "lib", "python{}.{}", "site-packages" 

877 ) 

878 p_ver = sys.version_info[:2] 

879 

880 # Predict version from py[thon]-x.x in the $VIRTUAL_ENV 

881 re_m = re.search(r"\bpy(?:thon)?([23])\.(\d+)\b", os.environ["VIRTUAL_ENV"]) 

882 if re_m: 

883 predicted_path = Path(str(virtual_env_path).format(*re_m.groups())) 

884 if predicted_path.exists(): 

885 p_ver = re_m.groups() 

886 

887 virtual_env = str(virtual_env_path).format(*p_ver) 

888 if self.warn_venv: 

889 warn( 

890 "Attempting to work in a virtualenv. If you encounter problems, " 

891 "please install IPython inside the virtualenv." 

892 ) 

893 import site 

894 sys.path.insert(0, virtual_env) 

895 site.addsitedir(virtual_env) 

896 

897 #------------------------------------------------------------------------- 

898 # Things related to injections into the sys module 

899 #------------------------------------------------------------------------- 

900 

901 def save_sys_module_state(self): 

902 """Save the state of hooks in the sys module. 

903 

904 This has to be called after self.user_module is created. 

905 """ 

906 self._orig_sys_module_state = {'stdin': sys.stdin, 

907 'stdout': sys.stdout, 

908 'stderr': sys.stderr, 

909 'excepthook': sys.excepthook} 

910 self._orig_sys_modules_main_name = self.user_module.__name__ 

911 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__) 

912 

913 def restore_sys_module_state(self): 

914 """Restore the state of the sys module.""" 

915 try: 

916 for k, v in self._orig_sys_module_state.items(): 

917 setattr(sys, k, v) 

918 except AttributeError: 

919 pass 

920 # Reset what what done in self.init_sys_modules 

921 if self._orig_sys_modules_main_mod is not None: 

922 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod 

923 

924 #------------------------------------------------------------------------- 

925 # Things related to the banner 

926 #------------------------------------------------------------------------- 

927 

928 @property 

929 def banner(self): 

930 banner = self.banner1 

931 if self.profile and self.profile != 'default': 

932 banner += '\nIPython profile: %s\n' % self.profile 

933 if self.banner2: 

934 banner += '\n' + self.banner2 

935 return banner 

936 

937 def show_banner(self, banner=None): 

938 if banner is None: 

939 banner = self.banner 

940 sys.stdout.write(banner) 

941 

942 #------------------------------------------------------------------------- 

943 # Things related to hooks 

944 #------------------------------------------------------------------------- 

945 

946 def init_hooks(self): 

947 # hooks holds pointers used for user-side customizations 

948 self.hooks = Struct() 

949 

950 self.strdispatchers = {} 

951 

952 # Set all default hooks, defined in the IPython.hooks module. 

953 hooks = IPython.core.hooks 

954 for hook_name in hooks.__all__: 

955 # default hooks have priority 100, i.e. low; user hooks should have 

956 # 0-100 priority 

957 self.set_hook(hook_name, getattr(hooks, hook_name), 100) 

958 

959 if self.display_page: 

960 self.set_hook('show_in_pager', page.as_hook(page.display_page), 90) 

961 

962 def set_hook(self, name, hook, priority=50, str_key=None, re_key=None): 

963 """set_hook(name,hook) -> sets an internal IPython hook. 

964 

965 IPython exposes some of its internal API as user-modifiable hooks. By 

966 adding your function to one of these hooks, you can modify IPython's 

967 behavior to call at runtime your own routines.""" 

968 

969 # At some point in the future, this should validate the hook before it 

970 # accepts it. Probably at least check that the hook takes the number 

971 # of args it's supposed to. 

972 

973 f = types.MethodType(hook,self) 

974 

975 # check if the hook is for strdispatcher first 

976 if str_key is not None: 

977 sdp = self.strdispatchers.get(name, StrDispatch()) 

978 sdp.add_s(str_key, f, priority ) 

979 self.strdispatchers[name] = sdp 

980 return 

981 if re_key is not None: 

982 sdp = self.strdispatchers.get(name, StrDispatch()) 

983 sdp.add_re(re.compile(re_key), f, priority ) 

984 self.strdispatchers[name] = sdp 

985 return 

986 

987 dp = getattr(self.hooks, name, None) 

988 if name not in IPython.core.hooks.__all__: 

989 print("Warning! Hook '%s' is not one of %s" % \ 

990 (name, IPython.core.hooks.__all__ )) 

991 

992 if name in IPython.core.hooks.deprecated: 

993 alternative = IPython.core.hooks.deprecated[name] 

994 raise ValueError( 

995 "Hook {} has been deprecated since IPython 5.0. Use {} instead.".format( 

996 name, alternative 

997 ) 

998 ) 

999 

1000 if not dp: 

1001 dp = IPython.core.hooks.CommandChainDispatcher() 

1002 

1003 try: 

1004 dp.add(f,priority) 

1005 except AttributeError: 

1006 # it was not commandchain, plain old func - replace 

1007 dp = f 

1008 

1009 setattr(self.hooks,name, dp) 

1010 

1011 #------------------------------------------------------------------------- 

1012 # Things related to events 

1013 #------------------------------------------------------------------------- 

1014 

1015 def init_events(self): 

1016 self.events = EventManager(self, available_events) 

1017 

1018 self.events.register("pre_execute", self._clear_warning_registry) 

1019 

1020 def register_post_execute(self, func): 

1021 """DEPRECATED: Use ip.events.register('post_run_cell', func) 

1022 

1023 Register a function for calling after code execution. 

1024 """ 

1025 raise ValueError( 

1026 "ip.register_post_execute is deprecated since IPython 1.0, use " 

1027 "ip.events.register('post_run_cell', func) instead." 

1028 ) 

1029 

1030 def _clear_warning_registry(self): 

1031 # clear the warning registry, so that different code blocks with 

1032 # overlapping line number ranges don't cause spurious suppression of 

1033 # warnings (see gh-6611 for details) 

1034 if "__warningregistry__" in self.user_global_ns: 

1035 del self.user_global_ns["__warningregistry__"] 

1036 

1037 #------------------------------------------------------------------------- 

1038 # Things related to the "main" module 

1039 #------------------------------------------------------------------------- 

1040 

1041 def new_main_mod(self, filename, modname): 

1042 """Return a new 'main' module object for user code execution. 

1043 

1044 ``filename`` should be the path of the script which will be run in the 

1045 module. Requests with the same filename will get the same module, with 

1046 its namespace cleared. 

1047 

1048 ``modname`` should be the module name - normally either '__main__' or 

1049 the basename of the file without the extension. 

1050 

1051 When scripts are executed via %run, we must keep a reference to their 

1052 __main__ module around so that Python doesn't 

1053 clear it, rendering references to module globals useless. 

1054 

1055 This method keeps said reference in a private dict, keyed by the 

1056 absolute path of the script. This way, for multiple executions of the 

1057 same script we only keep one copy of the namespace (the last one), 

1058 thus preventing memory leaks from old references while allowing the 

1059 objects from the last execution to be accessible. 

1060 """ 

1061 filename = os.path.abspath(filename) 

1062 try: 

1063 main_mod = self._main_mod_cache[filename] 

1064 except KeyError: 

1065 main_mod = self._main_mod_cache[filename] = types.ModuleType( 

1066 modname, 

1067 doc="Module created for script run in IPython") 

1068 else: 

1069 main_mod.__dict__.clear() 

1070 main_mod.__name__ = modname 

1071 

1072 main_mod.__file__ = filename 

1073 # It seems pydoc (and perhaps others) needs any module instance to 

1074 # implement a __nonzero__ method 

1075 main_mod.__nonzero__ = lambda : True 

1076 

1077 return main_mod 

1078 

1079 def clear_main_mod_cache(self): 

1080 """Clear the cache of main modules. 

1081 

1082 Mainly for use by utilities like %reset. 

1083 

1084 Examples 

1085 -------- 

1086 In [15]: import IPython 

1087 

1088 In [16]: m = _ip.new_main_mod(IPython.__file__, 'IPython') 

1089 

1090 In [17]: len(_ip._main_mod_cache) > 0 

1091 Out[17]: True 

1092 

1093 In [18]: _ip.clear_main_mod_cache() 

1094 

1095 In [19]: len(_ip._main_mod_cache) == 0 

1096 Out[19]: True 

1097 """ 

1098 self._main_mod_cache.clear() 

1099 

1100 #------------------------------------------------------------------------- 

1101 # Things related to debugging 

1102 #------------------------------------------------------------------------- 

1103 

1104 def init_pdb(self): 

1105 # Set calling of pdb on exceptions 

1106 # self.call_pdb is a property 

1107 self.call_pdb = self.pdb 

1108 

1109 def _get_call_pdb(self): 

1110 return self._call_pdb 

1111 

1112 def _set_call_pdb(self,val): 

1113 

1114 if val not in (0,1,False,True): 

1115 raise ValueError('new call_pdb value must be boolean') 

1116 

1117 # store value in instance 

1118 self._call_pdb = val 

1119 

1120 # notify the actual exception handlers 

1121 self.InteractiveTB.call_pdb = val 

1122 

1123 call_pdb = property(_get_call_pdb,_set_call_pdb,None, 

1124 'Control auto-activation of pdb at exceptions') 

1125 

1126 def debugger(self,force=False): 

1127 """Call the pdb debugger. 

1128 

1129 Keywords: 

1130 

1131 - force(False): by default, this routine checks the instance call_pdb 

1132 flag and does not actually invoke the debugger if the flag is false. 

1133 The 'force' option forces the debugger to activate even if the flag 

1134 is false. 

1135 """ 

1136 

1137 if not (force or self.call_pdb): 

1138 return 

1139 

1140 if not hasattr(sys,'last_traceback'): 

1141 error('No traceback has been produced, nothing to debug.') 

1142 return 

1143 

1144 self.InteractiveTB.debugger(force=True) 

1145 

1146 #------------------------------------------------------------------------- 

1147 # Things related to IPython's various namespaces 

1148 #------------------------------------------------------------------------- 

1149 default_user_namespaces = True 

1150 

1151 def init_create_namespaces(self, user_module=None, user_ns=None): 

1152 # Create the namespace where the user will operate. user_ns is 

1153 # normally the only one used, and it is passed to the exec calls as 

1154 # the locals argument. But we do carry a user_global_ns namespace 

1155 # given as the exec 'globals' argument, This is useful in embedding 

1156 # situations where the ipython shell opens in a context where the 

1157 # distinction between locals and globals is meaningful. For 

1158 # non-embedded contexts, it is just the same object as the user_ns dict. 

1159 

1160 # FIXME. For some strange reason, __builtins__ is showing up at user 

1161 # level as a dict instead of a module. This is a manual fix, but I 

1162 # should really track down where the problem is coming from. Alex 

1163 # Schmolck reported this problem first. 

1164 

1165 # A useful post by Alex Martelli on this topic: 

1166 # Re: inconsistent value from __builtins__ 

1167 # Von: Alex Martelli <aleaxit@yahoo.com> 

1168 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends 

1169 # Gruppen: comp.lang.python 

1170 

1171 # Michael Hohn <hohn@hooknose.lbl.gov> wrote: 

1172 # > >>> print type(builtin_check.get_global_binding('__builtins__')) 

1173 # > <type 'dict'> 

1174 # > >>> print type(__builtins__) 

1175 # > <type 'module'> 

1176 # > Is this difference in return value intentional? 

1177 

1178 # Well, it's documented that '__builtins__' can be either a dictionary 

1179 # or a module, and it's been that way for a long time. Whether it's 

1180 # intentional (or sensible), I don't know. In any case, the idea is 

1181 # that if you need to access the built-in namespace directly, you 

1182 # should start with "import __builtin__" (note, no 's') which will 

1183 # definitely give you a module. Yeah, it's somewhat confusing:-(. 

1184 

1185 # These routines return a properly built module and dict as needed by 

1186 # the rest of the code, and can also be used by extension writers to 

1187 # generate properly initialized namespaces. 

1188 if (user_ns is not None) or (user_module is not None): 

1189 self.default_user_namespaces = False 

1190 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns) 

1191 

1192 # A record of hidden variables we have added to the user namespace, so 

1193 # we can list later only variables defined in actual interactive use. 

1194 self.user_ns_hidden = {} 

1195 

1196 # Now that FakeModule produces a real module, we've run into a nasty 

1197 # problem: after script execution (via %run), the module where the user 

1198 # code ran is deleted. Now that this object is a true module (needed 

1199 # so doctest and other tools work correctly), the Python module 

1200 # teardown mechanism runs over it, and sets to None every variable 

1201 # present in that module. Top-level references to objects from the 

1202 # script survive, because the user_ns is updated with them. However, 

1203 # calling functions defined in the script that use other things from 

1204 # the script will fail, because the function's closure had references 

1205 # to the original objects, which are now all None. So we must protect 

1206 # these modules from deletion by keeping a cache. 

1207 # 

1208 # To avoid keeping stale modules around (we only need the one from the 

1209 # last run), we use a dict keyed with the full path to the script, so 

1210 # only the last version of the module is held in the cache. Note, 

1211 # however, that we must cache the module *namespace contents* (their 

1212 # __dict__). Because if we try to cache the actual modules, old ones 

1213 # (uncached) could be destroyed while still holding references (such as 

1214 # those held by GUI objects that tend to be long-lived)> 

1215 # 

1216 # The %reset command will flush this cache. See the cache_main_mod() 

1217 # and clear_main_mod_cache() methods for details on use. 

1218 

1219 # This is the cache used for 'main' namespaces 

1220 self._main_mod_cache = {} 

1221 

1222 # A table holding all the namespaces IPython deals with, so that 

1223 # introspection facilities can search easily. 

1224 self.ns_table = {'user_global':self.user_module.__dict__, 

1225 'user_local':self.user_ns, 

1226 'builtin':builtin_mod.__dict__ 

1227 } 

1228 

1229 @property 

1230 def user_global_ns(self): 

1231 return self.user_module.__dict__ 

1232 

1233 def prepare_user_module(self, user_module=None, user_ns=None): 

1234 """Prepare the module and namespace in which user code will be run. 

1235 

1236 When IPython is started normally, both parameters are None: a new module 

1237 is created automatically, and its __dict__ used as the namespace. 

1238 

1239 If only user_module is provided, its __dict__ is used as the namespace. 

1240 If only user_ns is provided, a dummy module is created, and user_ns 

1241 becomes the global namespace. If both are provided (as they may be 

1242 when embedding), user_ns is the local namespace, and user_module 

1243 provides the global namespace. 

1244 

1245 Parameters 

1246 ---------- 

1247 user_module : module, optional 

1248 The current user module in which IPython is being run. If None, 

1249 a clean module will be created. 

1250 user_ns : dict, optional 

1251 A namespace in which to run interactive commands. 

1252 

1253 Returns 

1254 ------- 

1255 A tuple of user_module and user_ns, each properly initialised. 

1256 """ 

1257 if user_module is None and user_ns is not None: 

1258 user_ns.setdefault("__name__", "__main__") 

1259 user_module = DummyMod() 

1260 user_module.__dict__ = user_ns 

1261 

1262 if user_module is None: 

1263 user_module = types.ModuleType("__main__", 

1264 doc="Automatically created module for IPython interactive environment") 

1265 

1266 # We must ensure that __builtin__ (without the final 's') is always 

1267 # available and pointing to the __builtin__ *module*. For more details: 

1268 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html 

1269 user_module.__dict__.setdefault('__builtin__', builtin_mod) 

1270 user_module.__dict__.setdefault('__builtins__', builtin_mod) 

1271 

1272 if user_ns is None: 

1273 user_ns = user_module.__dict__ 

1274 

1275 return user_module, user_ns 

1276 

1277 def init_sys_modules(self): 

1278 # We need to insert into sys.modules something that looks like a 

1279 # module but which accesses the IPython namespace, for shelve and 

1280 # pickle to work interactively. Normally they rely on getting 

1281 # everything out of __main__, but for embedding purposes each IPython 

1282 # instance has its own private namespace, so we can't go shoving 

1283 # everything into __main__. 

1284 

1285 # note, however, that we should only do this for non-embedded 

1286 # ipythons, which really mimic the __main__.__dict__ with their own 

1287 # namespace. Embedded instances, on the other hand, should not do 

1288 # this because they need to manage the user local/global namespaces 

1289 # only, but they live within a 'normal' __main__ (meaning, they 

1290 # shouldn't overtake the execution environment of the script they're 

1291 # embedded in). 

1292 

1293 # This is overridden in the InteractiveShellEmbed subclass to a no-op. 

1294 main_name = self.user_module.__name__ 

1295 sys.modules[main_name] = self.user_module 

1296 

1297 def init_user_ns(self): 

1298 """Initialize all user-visible namespaces to their minimum defaults. 

1299 

1300 Certain history lists are also initialized here, as they effectively 

1301 act as user namespaces. 

1302 

1303 Notes 

1304 ----- 

1305 All data structures here are only filled in, they are NOT reset by this 

1306 method. If they were not empty before, data will simply be added to 

1307 them. 

1308 """ 

1309 # This function works in two parts: first we put a few things in 

1310 # user_ns, and we sync that contents into user_ns_hidden so that these 

1311 # initial variables aren't shown by %who. After the sync, we add the 

1312 # rest of what we *do* want the user to see with %who even on a new 

1313 # session (probably nothing, so they really only see their own stuff) 

1314 

1315 # The user dict must *always* have a __builtin__ reference to the 

1316 # Python standard __builtin__ namespace, which must be imported. 

1317 # This is so that certain operations in prompt evaluation can be 

1318 # reliably executed with builtins. Note that we can NOT use 

1319 # __builtins__ (note the 's'), because that can either be a dict or a 

1320 # module, and can even mutate at runtime, depending on the context 

1321 # (Python makes no guarantees on it). In contrast, __builtin__ is 

1322 # always a module object, though it must be explicitly imported. 

1323 

1324 # For more details: 

1325 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html 

1326 ns = {} 

1327 

1328 # make global variables for user access to the histories 

1329 ns['_ih'] = self.history_manager.input_hist_parsed 

1330 ns['_oh'] = self.history_manager.output_hist 

1331 ns['_dh'] = self.history_manager.dir_hist 

1332 

1333 # user aliases to input and output histories. These shouldn't show up 

1334 # in %who, as they can have very large reprs. 

1335 ns['In'] = self.history_manager.input_hist_parsed 

1336 ns['Out'] = self.history_manager.output_hist 

1337 

1338 # Store myself as the public api!!! 

1339 ns['get_ipython'] = self.get_ipython 

1340 

1341 ns['exit'] = self.exiter 

1342 ns['quit'] = self.exiter 

1343 ns["open"] = _modified_open 

1344 

1345 # Sync what we've added so far to user_ns_hidden so these aren't seen 

1346 # by %who 

1347 self.user_ns_hidden.update(ns) 

1348 

1349 # Anything put into ns now would show up in %who. Think twice before 

1350 # putting anything here, as we really want %who to show the user their 

1351 # stuff, not our variables. 

1352 

1353 # Finally, update the real user's namespace 

1354 self.user_ns.update(ns) 

1355 

1356 @property 

1357 def all_ns_refs(self): 

1358 """Get a list of references to all the namespace dictionaries in which 

1359 IPython might store a user-created object. 

1360 

1361 Note that this does not include the displayhook, which also caches 

1362 objects from the output.""" 

1363 return [self.user_ns, self.user_global_ns, self.user_ns_hidden] + \ 

1364 [m.__dict__ for m in self._main_mod_cache.values()] 

1365 

1366 def reset(self, new_session=True, aggressive=False): 

1367 """Clear all internal namespaces, and attempt to release references to 

1368 user objects. 

1369 

1370 If new_session is True, a new history session will be opened. 

1371 """ 

1372 # Clear histories 

1373 self.history_manager.reset(new_session) 

1374 # Reset counter used to index all histories 

1375 if new_session: 

1376 self.execution_count = 1 

1377 

1378 # Reset last execution result 

1379 self.last_execution_succeeded = True 

1380 self.last_execution_result = None 

1381 

1382 # Flush cached output items 

1383 if self.displayhook.do_full_cache: 

1384 self.displayhook.flush() 

1385 

1386 # The main execution namespaces must be cleared very carefully, 

1387 # skipping the deletion of the builtin-related keys, because doing so 

1388 # would cause errors in many object's __del__ methods. 

1389 if self.user_ns is not self.user_global_ns: 

1390 self.user_ns.clear() 

1391 ns = self.user_global_ns 

1392 drop_keys = set(ns.keys()) 

1393 drop_keys.discard('__builtin__') 

1394 drop_keys.discard('__builtins__') 

1395 drop_keys.discard('__name__') 

1396 for k in drop_keys: 

1397 del ns[k] 

1398 

1399 self.user_ns_hidden.clear() 

1400 

1401 # Restore the user namespaces to minimal usability 

1402 self.init_user_ns() 

1403 if aggressive and not hasattr(self, "_sys_modules_keys"): 

1404 print("Cannot restore sys.module, no snapshot") 

1405 elif aggressive: 

1406 print("culling sys module...") 

1407 current_keys = set(sys.modules.keys()) 

1408 for k in current_keys - self._sys_modules_keys: 

1409 if k.startswith("multiprocessing"): 

1410 continue 

1411 del sys.modules[k] 

1412 

1413 # Restore the default and user aliases 

1414 self.alias_manager.clear_aliases() 

1415 self.alias_manager.init_aliases() 

1416 

1417 # Now define aliases that only make sense on the terminal, because they 

1418 # need direct access to the console in a way that we can't emulate in 

1419 # GUI or web frontend 

1420 if os.name == 'posix': 

1421 for cmd in ('clear', 'more', 'less', 'man'): 

1422 if cmd not in self.magics_manager.magics['line']: 

1423 self.alias_manager.soft_define_alias(cmd, cmd) 

1424 

1425 # Flush the private list of module references kept for script 

1426 # execution protection 

1427 self.clear_main_mod_cache() 

1428 

1429 def del_var(self, varname, by_name=False): 

1430 """Delete a variable from the various namespaces, so that, as 

1431 far as possible, we're not keeping any hidden references to it. 

1432 

1433 Parameters 

1434 ---------- 

1435 varname : str 

1436 The name of the variable to delete. 

1437 by_name : bool 

1438 If True, delete variables with the given name in each 

1439 namespace. If False (default), find the variable in the user 

1440 namespace, and delete references to it. 

1441 """ 

1442 if varname in ('__builtin__', '__builtins__'): 

1443 raise ValueError("Refusing to delete %s" % varname) 

1444 

1445 ns_refs = self.all_ns_refs 

1446 

1447 if by_name: # Delete by name 

1448 for ns in ns_refs: 

1449 try: 

1450 del ns[varname] 

1451 except KeyError: 

1452 pass 

1453 else: # Delete by object 

1454 try: 

1455 obj = self.user_ns[varname] 

1456 except KeyError as e: 

1457 raise NameError("name '%s' is not defined" % varname) from e 

1458 # Also check in output history 

1459 ns_refs.append(self.history_manager.output_hist) 

1460 for ns in ns_refs: 

1461 to_delete = [n for n, o in ns.items() if o is obj] 

1462 for name in to_delete: 

1463 del ns[name] 

1464 

1465 # Ensure it is removed from the last execution result 

1466 if self.last_execution_result.result is obj: 

1467 self.last_execution_result = None 

1468 

1469 # displayhook keeps extra references, but not in a dictionary 

1470 for name in ('_', '__', '___'): 

1471 if getattr(self.displayhook, name) is obj: 

1472 setattr(self.displayhook, name, None) 

1473 

1474 def reset_selective(self, regex=None): 

1475 """Clear selective variables from internal namespaces based on a 

1476 specified regular expression. 

1477 

1478 Parameters 

1479 ---------- 

1480 regex : string or compiled pattern, optional 

1481 A regular expression pattern that will be used in searching 

1482 variable names in the users namespaces. 

1483 """ 

1484 if regex is not None: 

1485 try: 

1486 m = re.compile(regex) 

1487 except TypeError as e: 

1488 raise TypeError('regex must be a string or compiled pattern') from e 

1489 # Search for keys in each namespace that match the given regex 

1490 # If a match is found, delete the key/value pair. 

1491 for ns in self.all_ns_refs: 

1492 for var in ns: 

1493 if m.search(var): 

1494 del ns[var] 

1495 

1496 def push(self, variables, interactive=True): 

1497 """Inject a group of variables into the IPython user namespace. 

1498 

1499 Parameters 

1500 ---------- 

1501 variables : dict, str or list/tuple of str 

1502 The variables to inject into the user's namespace. If a dict, a 

1503 simple update is done. If a str, the string is assumed to have 

1504 variable names separated by spaces. A list/tuple of str can also 

1505 be used to give the variable names. If just the variable names are 

1506 give (list/tuple/str) then the variable values looked up in the 

1507 callers frame. 

1508 interactive : bool 

1509 If True (default), the variables will be listed with the ``who`` 

1510 magic. 

1511 """ 

1512 vdict = None 

1513 

1514 # We need a dict of name/value pairs to do namespace updates. 

1515 if isinstance(variables, dict): 

1516 vdict = variables 

1517 elif isinstance(variables, (str, list, tuple)): 

1518 if isinstance(variables, str): 

1519 vlist = variables.split() 

1520 else: 

1521 vlist = variables 

1522 vdict = {} 

1523 cf = sys._getframe(1) 

1524 for name in vlist: 

1525 try: 

1526 vdict[name] = eval(name, cf.f_globals, cf.f_locals) 

1527 except: 

1528 print('Could not get variable %s from %s' % 

1529 (name,cf.f_code.co_name)) 

1530 else: 

1531 raise ValueError('variables must be a dict/str/list/tuple') 

1532 

1533 # Propagate variables to user namespace 

1534 self.user_ns.update(vdict) 

1535 

1536 # And configure interactive visibility 

1537 user_ns_hidden = self.user_ns_hidden 

1538 if interactive: 

1539 for name in vdict: 

1540 user_ns_hidden.pop(name, None) 

1541 else: 

1542 user_ns_hidden.update(vdict) 

1543 

1544 def drop_by_id(self, variables): 

1545 """Remove a dict of variables from the user namespace, if they are the 

1546 same as the values in the dictionary. 

1547 

1548 This is intended for use by extensions: variables that they've added can 

1549 be taken back out if they are unloaded, without removing any that the 

1550 user has overwritten. 

1551 

1552 Parameters 

1553 ---------- 

1554 variables : dict 

1555 A dictionary mapping object names (as strings) to the objects. 

1556 """ 

1557 for name, obj in variables.items(): 

1558 if name in self.user_ns and self.user_ns[name] is obj: 

1559 del self.user_ns[name] 

1560 self.user_ns_hidden.pop(name, None) 

1561 

1562 #------------------------------------------------------------------------- 

1563 # Things related to object introspection 

1564 #------------------------------------------------------------------------- 

1565 @staticmethod 

1566 def _find_parts(oname: str) -> Tuple[bool, ListType[str]]: 

1567 """ 

1568 Given an object name, return a list of parts of this object name. 

1569 

1570 Basically split on docs when using attribute access, 

1571 and extract the value when using square bracket. 

1572 

1573 

1574 For example foo.bar[3].baz[x] -> foo, bar, 3, baz, x 

1575 

1576 

1577 Returns 

1578 ------- 

1579 parts_ok: bool 

1580 wether we were properly able to parse parts. 

1581 parts: list of str 

1582 extracted parts 

1583 

1584 

1585 

1586 """ 

1587 raw_parts = oname.split(".") 

1588 parts = [] 

1589 parts_ok = True 

1590 for p in raw_parts: 

1591 if p.endswith("]"): 

1592 var, *indices = p.split("[") 

1593 if not var.isidentifier(): 

1594 parts_ok = False 

1595 break 

1596 parts.append(var) 

1597 for ind in indices: 

1598 if ind[-1] != "]" and not is_integer_string(ind[:-1]): 

1599 parts_ok = False 

1600 break 

1601 parts.append(ind[:-1]) 

1602 continue 

1603 

1604 if not p.isidentifier(): 

1605 parts_ok = False 

1606 parts.append(p) 

1607 

1608 return parts_ok, parts 

1609 

1610 def _ofind( 

1611 self, oname: str, namespaces: Optional[Sequence[Tuple[str, AnyType]]] = None 

1612 ) -> OInfo: 

1613 """Find an object in the available namespaces. 

1614 

1615 

1616 Returns 

1617 ------- 

1618 OInfo with fields: 

1619 - ismagic 

1620 - isalias 

1621 - found 

1622 - obj 

1623 - namespac 

1624 - parent 

1625 

1626 Has special code to detect magic functions. 

1627 """ 

1628 oname = oname.strip() 

1629 parts_ok, parts = self._find_parts(oname) 

1630 

1631 if ( 

1632 not oname.startswith(ESC_MAGIC) 

1633 and not oname.startswith(ESC_MAGIC2) 

1634 and not parts_ok 

1635 ): 

1636 return OInfo( 

1637 ismagic=False, 

1638 isalias=False, 

1639 found=False, 

1640 obj=None, 

1641 namespace=None, 

1642 parent=None, 

1643 ) 

1644 

1645 if namespaces is None: 

1646 # Namespaces to search in: 

1647 # Put them in a list. The order is important so that we 

1648 # find things in the same order that Python finds them. 

1649 namespaces = [ ('Interactive', self.user_ns), 

1650 ('Interactive (global)', self.user_global_ns), 

1651 ('Python builtin', builtin_mod.__dict__), 

1652 ] 

1653 

1654 ismagic = False 

1655 isalias = False 

1656 found = False 

1657 ospace = None 

1658 parent = None 

1659 obj = None 

1660 

1661 

1662 # Look for the given name by splitting it in parts. If the head is 

1663 # found, then we look for all the remaining parts as members, and only 

1664 # declare success if we can find them all. 

1665 oname_parts = parts 

1666 oname_head, oname_rest = oname_parts[0],oname_parts[1:] 

1667 for nsname,ns in namespaces: 

1668 try: 

1669 obj = ns[oname_head] 

1670 except KeyError: 

1671 continue 

1672 else: 

1673 for idx, part in enumerate(oname_rest): 

1674 try: 

1675 parent = obj 

1676 # The last part is looked up in a special way to avoid 

1677 # descriptor invocation as it may raise or have side 

1678 # effects. 

1679 if idx == len(oname_rest) - 1: 

1680 obj = self._getattr_property(obj, part) 

1681 else: 

1682 if is_integer_string(part): 

1683 obj = obj[int(part)] 

1684 else: 

1685 obj = getattr(obj, part) 

1686 except: 

1687 # Blanket except b/c some badly implemented objects 

1688 # allow __getattr__ to raise exceptions other than 

1689 # AttributeError, which then crashes IPython. 

1690 break 

1691 else: 

1692 # If we finish the for loop (no break), we got all members 

1693 found = True 

1694 ospace = nsname 

1695 break # namespace loop 

1696 

1697 # Try to see if it's magic 

1698 if not found: 

1699 obj = None 

1700 if oname.startswith(ESC_MAGIC2): 

1701 oname = oname.lstrip(ESC_MAGIC2) 

1702 obj = self.find_cell_magic(oname) 

1703 elif oname.startswith(ESC_MAGIC): 

1704 oname = oname.lstrip(ESC_MAGIC) 

1705 obj = self.find_line_magic(oname) 

1706 else: 

1707 # search without prefix, so run? will find %run? 

1708 obj = self.find_line_magic(oname) 

1709 if obj is None: 

1710 obj = self.find_cell_magic(oname) 

1711 if obj is not None: 

1712 found = True 

1713 ospace = 'IPython internal' 

1714 ismagic = True 

1715 isalias = isinstance(obj, Alias) 

1716 

1717 # Last try: special-case some literals like '', [], {}, etc: 

1718 if not found and oname_head in ["''",'""','[]','{}','()']: 

1719 obj = eval(oname_head) 

1720 found = True 

1721 ospace = 'Interactive' 

1722 

1723 return OInfo( 

1724 obj=obj, 

1725 found=found, 

1726 parent=parent, 

1727 ismagic=ismagic, 

1728 isalias=isalias, 

1729 namespace=ospace, 

1730 ) 

1731 

1732 @staticmethod 

1733 def _getattr_property(obj, attrname): 

1734 """Property-aware getattr to use in object finding. 

1735 

1736 If attrname represents a property, return it unevaluated (in case it has 

1737 side effects or raises an error. 

1738 

1739 """ 

1740 if not isinstance(obj, type): 

1741 try: 

1742 # `getattr(type(obj), attrname)` is not guaranteed to return 

1743 # `obj`, but does so for property: 

1744 # 

1745 # property.__get__(self, None, cls) -> self 

1746 # 

1747 # The universal alternative is to traverse the mro manually 

1748 # searching for attrname in class dicts. 

1749 if is_integer_string(attrname): 

1750 return obj[int(attrname)] 

1751 else: 

1752 attr = getattr(type(obj), attrname) 

1753 except AttributeError: 

1754 pass 

1755 else: 

1756 # This relies on the fact that data descriptors (with both 

1757 # __get__ & __set__ magic methods) take precedence over 

1758 # instance-level attributes: 

1759 # 

1760 # class A(object): 

1761 # @property 

1762 # def foobar(self): return 123 

1763 # a = A() 

1764 # a.__dict__['foobar'] = 345 

1765 # a.foobar # == 123 

1766 # 

1767 # So, a property may be returned right away. 

1768 if isinstance(attr, property): 

1769 return attr 

1770 

1771 # Nothing helped, fall back. 

1772 return getattr(obj, attrname) 

1773 

1774 def _object_find(self, oname, namespaces=None) -> OInfo: 

1775 """Find an object and return a struct with info about it.""" 

1776 return self._ofind(oname, namespaces) 

1777 

1778 def _inspect(self, meth, oname, namespaces=None, **kw): 

1779 """Generic interface to the inspector system. 

1780 

1781 This function is meant to be called by pdef, pdoc & friends. 

1782 """ 

1783 info: OInfo = self._object_find(oname, namespaces) 

1784 if self.sphinxify_docstring: 

1785 if sphinxify is None: 

1786 raise ImportError("Module ``docrepr`` required but missing") 

1787 docformat = sphinxify(self.object_inspect(oname)) 

1788 else: 

1789 docformat = None 

1790 if info.found or hasattr(info.parent, oinspect.HOOK_NAME): 

1791 pmethod = getattr(self.inspector, meth) 

1792 # TODO: only apply format_screen to the plain/text repr of the mime 

1793 # bundle. 

1794 formatter = format_screen if info.ismagic else docformat 

1795 if meth == 'pdoc': 

1796 pmethod(info.obj, oname, formatter) 

1797 elif meth == 'pinfo': 

1798 pmethod( 

1799 info.obj, 

1800 oname, 

1801 formatter, 

1802 info, 

1803 enable_html_pager=self.enable_html_pager, 

1804 **kw, 

1805 ) 

1806 else: 

1807 pmethod(info.obj, oname) 

1808 else: 

1809 print('Object `%s` not found.' % oname) 

1810 return 'not found' # so callers can take other action 

1811 

1812 def object_inspect(self, oname, detail_level=0): 

1813 """Get object info about oname""" 

1814 with self.builtin_trap: 

1815 info = self._object_find(oname) 

1816 if info.found: 

1817 return self.inspector.info(info.obj, oname, info=info, 

1818 detail_level=detail_level 

1819 ) 

1820 else: 

1821 return oinspect.object_info(name=oname, found=False) 

1822 

1823 def object_inspect_text(self, oname, detail_level=0): 

1824 """Get object info as formatted text""" 

1825 return self.object_inspect_mime(oname, detail_level)['text/plain'] 

1826 

1827 def object_inspect_mime(self, oname, detail_level=0, omit_sections=()): 

1828 """Get object info as a mimebundle of formatted representations. 

1829 

1830 A mimebundle is a dictionary, keyed by mime-type. 

1831 It must always have the key `'text/plain'`. 

1832 """ 

1833 with self.builtin_trap: 

1834 info = self._object_find(oname) 

1835 if info.found: 

1836 docformat = ( 

1837 sphinxify(self.object_inspect(oname)) 

1838 if self.sphinxify_docstring 

1839 else None 

1840 ) 

1841 return self.inspector._get_info( 

1842 info.obj, 

1843 oname, 

1844 info=info, 

1845 detail_level=detail_level, 

1846 formatter=docformat, 

1847 omit_sections=omit_sections, 

1848 ) 

1849 else: 

1850 raise KeyError(oname) 

1851 

1852 #------------------------------------------------------------------------- 

1853 # Things related to history management 

1854 #------------------------------------------------------------------------- 

1855 

1856 def init_history(self): 

1857 """Sets up the command history, and starts regular autosaves.""" 

1858 self.history_manager = HistoryManager(shell=self, parent=self) 

1859 self.configurables.append(self.history_manager) 

1860 

1861 #------------------------------------------------------------------------- 

1862 # Things related to exception handling and tracebacks (not debugging) 

1863 #------------------------------------------------------------------------- 

1864 

1865 debugger_cls = InterruptiblePdb 

1866 

1867 def init_traceback_handlers(self, custom_exceptions): 

1868 # Syntax error handler. 

1869 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor', parent=self) 

1870 

1871 # The interactive one is initialized with an offset, meaning we always 

1872 # want to remove the topmost item in the traceback, which is our own 

1873 # internal code. Valid modes: ['Plain','Context','Verbose','Minimal'] 

1874 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain', 

1875 color_scheme='NoColor', 

1876 tb_offset = 1, 

1877 debugger_cls=self.debugger_cls, parent=self) 

1878 

1879 # The instance will store a pointer to the system-wide exception hook, 

1880 # so that runtime code (such as magics) can access it. This is because 

1881 # during the read-eval loop, it may get temporarily overwritten. 

1882 self.sys_excepthook = sys.excepthook 

1883 

1884 # and add any custom exception handlers the user may have specified 

1885 self.set_custom_exc(*custom_exceptions) 

1886 

1887 # Set the exception mode 

1888 self.InteractiveTB.set_mode(mode=self.xmode) 

1889 

1890 def set_custom_exc(self, exc_tuple, handler): 

1891 """set_custom_exc(exc_tuple, handler) 

1892 

1893 Set a custom exception handler, which will be called if any of the 

1894 exceptions in exc_tuple occur in the mainloop (specifically, in the 

1895 run_code() method). 

1896 

1897 Parameters 

1898 ---------- 

1899 exc_tuple : tuple of exception classes 

1900 A *tuple* of exception classes, for which to call the defined 

1901 handler. It is very important that you use a tuple, and NOT A 

1902 LIST here, because of the way Python's except statement works. If 

1903 you only want to trap a single exception, use a singleton tuple:: 

1904 

1905 exc_tuple == (MyCustomException,) 

1906 

1907 handler : callable 

1908 handler must have the following signature:: 

1909 

1910 def my_handler(self, etype, value, tb, tb_offset=None): 

1911 ... 

1912 return structured_traceback 

1913 

1914 Your handler must return a structured traceback (a list of strings), 

1915 or None. 

1916 

1917 This will be made into an instance method (via types.MethodType) 

1918 of IPython itself, and it will be called if any of the exceptions 

1919 listed in the exc_tuple are caught. If the handler is None, an 

1920 internal basic one is used, which just prints basic info. 

1921 

1922 To protect IPython from crashes, if your handler ever raises an 

1923 exception or returns an invalid result, it will be immediately 

1924 disabled. 

1925 

1926 Notes 

1927 ----- 

1928 WARNING: by putting in your own exception handler into IPython's main 

1929 execution loop, you run a very good chance of nasty crashes. This 

1930 facility should only be used if you really know what you are doing. 

1931 """ 

1932 

1933 if not isinstance(exc_tuple, tuple): 

1934 raise TypeError("The custom exceptions must be given as a tuple.") 

1935 

1936 def dummy_handler(self, etype, value, tb, tb_offset=None): 

1937 print('*** Simple custom exception handler ***') 

1938 print('Exception type :', etype) 

1939 print('Exception value:', value) 

1940 print('Traceback :', tb) 

1941 

1942 def validate_stb(stb): 

1943 """validate structured traceback return type 

1944 

1945 return type of CustomTB *should* be a list of strings, but allow 

1946 single strings or None, which are harmless. 

1947 

1948 This function will *always* return a list of strings, 

1949 and will raise a TypeError if stb is inappropriate. 

1950 """ 

1951 msg = "CustomTB must return list of strings, not %r" % stb 

1952 if stb is None: 

1953 return [] 

1954 elif isinstance(stb, str): 

1955 return [stb] 

1956 elif not isinstance(stb, list): 

1957 raise TypeError(msg) 

1958 # it's a list 

1959 for line in stb: 

1960 # check every element 

1961 if not isinstance(line, str): 

1962 raise TypeError(msg) 

1963 return stb 

1964 

1965 if handler is None: 

1966 wrapped = dummy_handler 

1967 else: 

1968 def wrapped(self,etype,value,tb,tb_offset=None): 

1969 """wrap CustomTB handler, to protect IPython from user code 

1970 

1971 This makes it harder (but not impossible) for custom exception 

1972 handlers to crash IPython. 

1973 """ 

1974 try: 

1975 stb = handler(self,etype,value,tb,tb_offset=tb_offset) 

1976 return validate_stb(stb) 

1977 except: 

1978 # clear custom handler immediately 

1979 self.set_custom_exc((), None) 

1980 print("Custom TB Handler failed, unregistering", file=sys.stderr) 

1981 # show the exception in handler first 

1982 stb = self.InteractiveTB.structured_traceback(*sys.exc_info()) 

1983 print(self.InteractiveTB.stb2text(stb)) 

1984 print("The original exception:") 

1985 stb = self.InteractiveTB.structured_traceback( 

1986 (etype,value,tb), tb_offset=tb_offset 

1987 ) 

1988 return stb 

1989 

1990 self.CustomTB = types.MethodType(wrapped,self) 

1991 self.custom_exceptions = exc_tuple 

1992 

1993 def excepthook(self, etype, value, tb): 

1994 """One more defense for GUI apps that call sys.excepthook. 

1995 

1996 GUI frameworks like wxPython trap exceptions and call 

1997 sys.excepthook themselves. I guess this is a feature that 

1998 enables them to keep running after exceptions that would 

1999 otherwise kill their mainloop. This is a bother for IPython 

2000 which expects to catch all of the program exceptions with a try: 

2001 except: statement. 

2002 

2003 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if 

2004 any app directly invokes sys.excepthook, it will look to the user like 

2005 IPython crashed. In order to work around this, we can disable the 

2006 CrashHandler and replace it with this excepthook instead, which prints a 

2007 regular traceback using our InteractiveTB. In this fashion, apps which 

2008 call sys.excepthook will generate a regular-looking exception from 

2009 IPython, and the CrashHandler will only be triggered by real IPython 

2010 crashes. 

2011 

2012 This hook should be used sparingly, only in places which are not likely 

2013 to be true IPython errors. 

2014 """ 

2015 self.showtraceback((etype, value, tb), tb_offset=0) 

2016 

2017 def _get_exc_info(self, exc_tuple=None): 

2018 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc. 

2019 

2020 Ensures sys.last_type,value,traceback hold the exc_info we found, 

2021 from whichever source. 

2022 

2023 raises ValueError if none of these contain any information 

2024 """ 

2025 if exc_tuple is None: 

2026 etype, value, tb = sys.exc_info() 

2027 else: 

2028 etype, value, tb = exc_tuple 

2029 

2030 if etype is None: 

2031 if hasattr(sys, 'last_type'): 

2032 etype, value, tb = sys.last_type, sys.last_value, \ 

2033 sys.last_traceback 

2034 

2035 if etype is None: 

2036 raise ValueError("No exception to find") 

2037 

2038 # Now store the exception info in sys.last_type etc. 

2039 # WARNING: these variables are somewhat deprecated and not 

2040 # necessarily safe to use in a threaded environment, but tools 

2041 # like pdb depend on their existence, so let's set them. If we 

2042 # find problems in the field, we'll need to revisit their use. 

2043 sys.last_type = etype 

2044 sys.last_value = value 

2045 sys.last_traceback = tb 

2046 

2047 return etype, value, tb 

2048 

2049 def show_usage_error(self, exc): 

2050 """Show a short message for UsageErrors 

2051 

2052 These are special exceptions that shouldn't show a traceback. 

2053 """ 

2054 print("UsageError: %s" % exc, file=sys.stderr) 

2055 

2056 def get_exception_only(self, exc_tuple=None): 

2057 """ 

2058 Return as a string (ending with a newline) the exception that 

2059 just occurred, without any traceback. 

2060 """ 

2061 etype, value, tb = self._get_exc_info(exc_tuple) 

2062 msg = traceback.format_exception_only(etype, value) 

2063 return ''.join(msg) 

2064 

2065 def showtraceback(self, exc_tuple=None, filename=None, tb_offset=None, 

2066 exception_only=False, running_compiled_code=False): 

2067 """Display the exception that just occurred. 

2068 

2069 If nothing is known about the exception, this is the method which 

2070 should be used throughout the code for presenting user tracebacks, 

2071 rather than directly invoking the InteractiveTB object. 

2072 

2073 A specific showsyntaxerror() also exists, but this method can take 

2074 care of calling it if needed, so unless you are explicitly catching a 

2075 SyntaxError exception, don't try to analyze the stack manually and 

2076 simply call this method.""" 

2077 

2078 try: 

2079 try: 

2080 etype, value, tb = self._get_exc_info(exc_tuple) 

2081 except ValueError: 

2082 print('No traceback available to show.', file=sys.stderr) 

2083 return 

2084 

2085 if issubclass(etype, SyntaxError): 

2086 # Though this won't be called by syntax errors in the input 

2087 # line, there may be SyntaxError cases with imported code. 

2088 self.showsyntaxerror(filename, running_compiled_code) 

2089 elif etype is UsageError: 

2090 self.show_usage_error(value) 

2091 else: 

2092 if exception_only: 

2093 stb = ['An exception has occurred, use %tb to see ' 

2094 'the full traceback.\n'] 

2095 stb.extend(self.InteractiveTB.get_exception_only(etype, 

2096 value)) 

2097 else: 

2098 try: 

2099 # Exception classes can customise their traceback - we 

2100 # use this in IPython.parallel for exceptions occurring 

2101 # in the engines. This should return a list of strings. 

2102 if hasattr(value, "_render_traceback_"): 

2103 stb = value._render_traceback_() 

2104 else: 

2105 stb = self.InteractiveTB.structured_traceback( 

2106 etype, value, tb, tb_offset=tb_offset 

2107 ) 

2108 

2109 except Exception: 

2110 print( 

2111 "Unexpected exception formatting exception. Falling back to standard exception" 

2112 ) 

2113 traceback.print_exc() 

2114 return None 

2115 

2116 self._showtraceback(etype, value, stb) 

2117 if self.call_pdb: 

2118 # drop into debugger 

2119 self.debugger(force=True) 

2120 return 

2121 

2122 # Actually show the traceback 

2123 self._showtraceback(etype, value, stb) 

2124 

2125 except KeyboardInterrupt: 

2126 print('\n' + self.get_exception_only(), file=sys.stderr) 

2127 

2128 def _showtraceback(self, etype, evalue, stb: str): 

2129 """Actually show a traceback. 

2130 

2131 Subclasses may override this method to put the traceback on a different 

2132 place, like a side channel. 

2133 """ 

2134 val = self.InteractiveTB.stb2text(stb) 

2135 try: 

2136 print(val) 

2137 except UnicodeEncodeError: 

2138 print(val.encode("utf-8", "backslashreplace").decode()) 

2139 

2140 def showsyntaxerror(self, filename=None, running_compiled_code=False): 

2141 """Display the syntax error that just occurred. 

2142 

2143 This doesn't display a stack trace because there isn't one. 

2144 

2145 If a filename is given, it is stuffed in the exception instead 

2146 of what was there before (because Python's parser always uses 

2147 "<string>" when reading from a string). 

2148 

2149 If the syntax error occurred when running a compiled code (i.e. running_compile_code=True), 

2150 longer stack trace will be displayed. 

2151 """ 

2152 etype, value, last_traceback = self._get_exc_info() 

2153 

2154 if filename and issubclass(etype, SyntaxError): 

2155 try: 

2156 value.filename = filename 

2157 except: 

2158 # Not the format we expect; leave it alone 

2159 pass 

2160 

2161 # If the error occurred when executing compiled code, we should provide full stacktrace. 

2162 elist = traceback.extract_tb(last_traceback) if running_compiled_code else [] 

2163 stb = self.SyntaxTB.structured_traceback(etype, value, elist) 

2164 self._showtraceback(etype, value, stb) 

2165 

2166 # This is overridden in TerminalInteractiveShell to show a message about 

2167 # the %paste magic. 

2168 def showindentationerror(self): 

2169 """Called by _run_cell when there's an IndentationError in code entered 

2170 at the prompt. 

2171 

2172 This is overridden in TerminalInteractiveShell to show a message about 

2173 the %paste magic.""" 

2174 self.showsyntaxerror() 

2175 

2176 @skip_doctest 

2177 def set_next_input(self, s, replace=False): 

2178 """ Sets the 'default' input string for the next command line. 

2179 

2180 Example:: 

2181 

2182 In [1]: _ip.set_next_input("Hello Word") 

2183 In [2]: Hello Word_ # cursor is here 

2184 """ 

2185 self.rl_next_input = s 

2186 

2187 def _indent_current_str(self): 

2188 """return the current level of indentation as a string""" 

2189 return self.input_splitter.get_indent_spaces() * ' ' 

2190 

2191 #------------------------------------------------------------------------- 

2192 # Things related to text completion 

2193 #------------------------------------------------------------------------- 

2194 

2195 def init_completer(self): 

2196 """Initialize the completion machinery. 

2197 

2198 This creates completion machinery that can be used by client code, 

2199 either interactively in-process (typically triggered by the readline 

2200 library), programmatically (such as in test suites) or out-of-process 

2201 (typically over the network by remote frontends). 

2202 """ 

2203 from IPython.core.completer import IPCompleter 

2204 from IPython.core.completerlib import ( 

2205 cd_completer, 

2206 magic_run_completer, 

2207 module_completer, 

2208 reset_completer, 

2209 ) 

2210 

2211 self.Completer = IPCompleter(shell=self, 

2212 namespace=self.user_ns, 

2213 global_namespace=self.user_global_ns, 

2214 parent=self, 

2215 ) 

2216 self.configurables.append(self.Completer) 

2217 

2218 # Add custom completers to the basic ones built into IPCompleter 

2219 sdisp = self.strdispatchers.get('complete_command', StrDispatch()) 

2220 self.strdispatchers['complete_command'] = sdisp 

2221 self.Completer.custom_completers = sdisp 

2222 

2223 self.set_hook('complete_command', module_completer, str_key = 'import') 

2224 self.set_hook('complete_command', module_completer, str_key = 'from') 

2225 self.set_hook('complete_command', module_completer, str_key = '%aimport') 

2226 self.set_hook('complete_command', magic_run_completer, str_key = '%run') 

2227 self.set_hook('complete_command', cd_completer, str_key = '%cd') 

2228 self.set_hook('complete_command', reset_completer, str_key = '%reset') 

2229 

2230 @skip_doctest 

2231 def complete(self, text, line=None, cursor_pos=None): 

2232 """Return the completed text and a list of completions. 

2233 

2234 Parameters 

2235 ---------- 

2236 text : string 

2237 A string of text to be completed on. It can be given as empty and 

2238 instead a line/position pair are given. In this case, the 

2239 completer itself will split the line like readline does. 

2240 line : string, optional 

2241 The complete line that text is part of. 

2242 cursor_pos : int, optional 

2243 The position of the cursor on the input line. 

2244 

2245 Returns 

2246 ------- 

2247 text : string 

2248 The actual text that was completed. 

2249 matches : list 

2250 A sorted list with all possible completions. 

2251 

2252 Notes 

2253 ----- 

2254 The optional arguments allow the completion to take more context into 

2255 account, and are part of the low-level completion API. 

2256 

2257 This is a wrapper around the completion mechanism, similar to what 

2258 readline does at the command line when the TAB key is hit. By 

2259 exposing it as a method, it can be used by other non-readline 

2260 environments (such as GUIs) for text completion. 

2261 

2262 Examples 

2263 -------- 

2264 In [1]: x = 'hello' 

2265 

2266 In [2]: _ip.complete('x.l') 

2267 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip']) 

2268 """ 

2269 

2270 # Inject names into __builtin__ so we can complete on the added names. 

2271 with self.builtin_trap: 

2272 return self.Completer.complete(text, line, cursor_pos) 

2273 

2274 def set_custom_completer(self, completer, pos=0) -> None: 

2275 """Adds a new custom completer function. 

2276 

2277 The position argument (defaults to 0) is the index in the completers 

2278 list where you want the completer to be inserted. 

2279 

2280 `completer` should have the following signature:: 

2281 

2282 def completion(self: Completer, text: string) -> List[str]: 

2283 raise NotImplementedError 

2284 

2285 It will be bound to the current Completer instance and pass some text 

2286 and return a list with current completions to suggest to the user. 

2287 """ 

2288 

2289 newcomp = types.MethodType(completer, self.Completer) 

2290 self.Completer.custom_matchers.insert(pos,newcomp) 

2291 

2292 def set_completer_frame(self, frame=None): 

2293 """Set the frame of the completer.""" 

2294 if frame: 

2295 self.Completer.namespace = frame.f_locals 

2296 self.Completer.global_namespace = frame.f_globals 

2297 else: 

2298 self.Completer.namespace = self.user_ns 

2299 self.Completer.global_namespace = self.user_global_ns 

2300 

2301 #------------------------------------------------------------------------- 

2302 # Things related to magics 

2303 #------------------------------------------------------------------------- 

2304 

2305 def init_magics(self): 

2306 from IPython.core import magics as m 

2307 self.magics_manager = magic.MagicsManager(shell=self, 

2308 parent=self, 

2309 user_magics=m.UserMagics(self)) 

2310 self.configurables.append(self.magics_manager) 

2311 

2312 # Expose as public API from the magics manager 

2313 self.register_magics = self.magics_manager.register 

2314 

2315 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics, 

2316 m.ConfigMagics, m.DisplayMagics, m.ExecutionMagics, 

2317 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics, 

2318 m.NamespaceMagics, m.OSMagics, m.PackagingMagics, 

2319 m.PylabMagics, m.ScriptMagics, 

2320 ) 

2321 self.register_magics(m.AsyncMagics) 

2322 

2323 # Register Magic Aliases 

2324 mman = self.magics_manager 

2325 # FIXME: magic aliases should be defined by the Magics classes 

2326 # or in MagicsManager, not here 

2327 mman.register_alias('ed', 'edit') 

2328 mman.register_alias('hist', 'history') 

2329 mman.register_alias('rep', 'recall') 

2330 mman.register_alias('SVG', 'svg', 'cell') 

2331 mman.register_alias('HTML', 'html', 'cell') 

2332 mman.register_alias('file', 'writefile', 'cell') 

2333 

2334 # FIXME: Move the color initialization to the DisplayHook, which 

2335 # should be split into a prompt manager and displayhook. We probably 

2336 # even need a centralize colors management object. 

2337 self.run_line_magic('colors', self.colors) 

2338 

2339 # Defined here so that it's included in the documentation 

2340 @functools.wraps(magic.MagicsManager.register_function) 

2341 def register_magic_function(self, func, magic_kind='line', magic_name=None): 

2342 self.magics_manager.register_function( 

2343 func, magic_kind=magic_kind, magic_name=magic_name 

2344 ) 

2345 

2346 def _find_with_lazy_load(self, /, type_, magic_name: str): 

2347 """ 

2348 Try to find a magic potentially lazy-loading it. 

2349 

2350 Parameters 

2351 ---------- 

2352 

2353 type_: "line"|"cell" 

2354 the type of magics we are trying to find/lazy load. 

2355 magic_name: str 

2356 The name of the magic we are trying to find/lazy load 

2357 

2358 

2359 Note that this may have any side effects 

2360 """ 

2361 finder = {"line": self.find_line_magic, "cell": self.find_cell_magic}[type_] 

2362 fn = finder(magic_name) 

2363 if fn is not None: 

2364 return fn 

2365 lazy = self.magics_manager.lazy_magics.get(magic_name) 

2366 if lazy is None: 

2367 return None 

2368 

2369 self.run_line_magic("load_ext", lazy) 

2370 res = finder(magic_name) 

2371 return res 

2372 

2373 def run_line_magic(self, magic_name: str, line, _stack_depth=1): 

2374 """Execute the given line magic. 

2375 

2376 Parameters 

2377 ---------- 

2378 magic_name : str 

2379 Name of the desired magic function, without '%' prefix. 

2380 line : str 

2381 The rest of the input line as a single string. 

2382 _stack_depth : int 

2383 If run_line_magic() is called from magic() then _stack_depth=2. 

2384 This is added to ensure backward compatibility for use of 'get_ipython().magic()' 

2385 """ 

2386 fn = self._find_with_lazy_load("line", magic_name) 

2387 if fn is None: 

2388 lazy = self.magics_manager.lazy_magics.get(magic_name) 

2389 if lazy: 

2390 self.run_line_magic("load_ext", lazy) 

2391 fn = self.find_line_magic(magic_name) 

2392 if fn is None: 

2393 cm = self.find_cell_magic(magic_name) 

2394 etpl = "Line magic function `%%%s` not found%s." 

2395 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, ' 

2396 'did you mean that instead?)' % magic_name ) 

2397 raise UsageError(etpl % (magic_name, extra)) 

2398 else: 

2399 # Note: this is the distance in the stack to the user's frame. 

2400 # This will need to be updated if the internal calling logic gets 

2401 # refactored, or else we'll be expanding the wrong variables. 

2402 

2403 # Determine stack_depth depending on where run_line_magic() has been called 

2404 stack_depth = _stack_depth 

2405 if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False): 

2406 # magic has opted out of var_expand 

2407 magic_arg_s = line 

2408 else: 

2409 magic_arg_s = self.var_expand(line, stack_depth) 

2410 # Put magic args in a list so we can call with f(*a) syntax 

2411 args = [magic_arg_s] 

2412 kwargs = {} 

2413 # Grab local namespace if we need it: 

2414 if getattr(fn, "needs_local_scope", False): 

2415 kwargs['local_ns'] = self.get_local_scope(stack_depth) 

2416 with self.builtin_trap: 

2417 result = fn(*args, **kwargs) 

2418 

2419 # The code below prevents the output from being displayed 

2420 # when using magics with decodator @output_can_be_silenced 

2421 # when the last Python token in the expression is a ';'. 

2422 if getattr(fn, magic.MAGIC_OUTPUT_CAN_BE_SILENCED, False): 

2423 if DisplayHook.semicolon_at_end_of_expression(magic_arg_s): 

2424 return None 

2425 

2426 return result 

2427 

2428 def get_local_scope(self, stack_depth): 

2429 """Get local scope at given stack depth. 

2430 

2431 Parameters 

2432 ---------- 

2433 stack_depth : int 

2434 Depth relative to calling frame 

2435 """ 

2436 return sys._getframe(stack_depth + 1).f_locals 

2437 

2438 def run_cell_magic(self, magic_name, line, cell): 

2439 """Execute the given cell magic. 

2440 

2441 Parameters 

2442 ---------- 

2443 magic_name : str 

2444 Name of the desired magic function, without '%' prefix. 

2445 line : str 

2446 The rest of the first input line as a single string. 

2447 cell : str 

2448 The body of the cell as a (possibly multiline) string. 

2449 """ 

2450 fn = self._find_with_lazy_load("cell", magic_name) 

2451 if fn is None: 

2452 lm = self.find_line_magic(magic_name) 

2453 etpl = "Cell magic `%%{0}` not found{1}." 

2454 extra = '' if lm is None else (' (But line magic `%{0}` exists, ' 

2455 'did you mean that instead?)'.format(magic_name)) 

2456 raise UsageError(etpl.format(magic_name, extra)) 

2457 elif cell == '': 

2458 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name) 

2459 if self.find_line_magic(magic_name) is not None: 

2460 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name) 

2461 raise UsageError(message) 

2462 else: 

2463 # Note: this is the distance in the stack to the user's frame. 

2464 # This will need to be updated if the internal calling logic gets 

2465 # refactored, or else we'll be expanding the wrong variables. 

2466 stack_depth = 2 

2467 if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False): 

2468 # magic has opted out of var_expand 

2469 magic_arg_s = line 

2470 else: 

2471 magic_arg_s = self.var_expand(line, stack_depth) 

2472 kwargs = {} 

2473 if getattr(fn, "needs_local_scope", False): 

2474 kwargs['local_ns'] = self.user_ns 

2475 

2476 with self.builtin_trap: 

2477 args = (magic_arg_s, cell) 

2478 result = fn(*args, **kwargs) 

2479 

2480 # The code below prevents the output from being displayed 

2481 # when using magics with decodator @output_can_be_silenced 

2482 # when the last Python token in the expression is a ';'. 

2483 if getattr(fn, magic.MAGIC_OUTPUT_CAN_BE_SILENCED, False): 

2484 if DisplayHook.semicolon_at_end_of_expression(cell): 

2485 return None 

2486 

2487 return result 

2488 

2489 def find_line_magic(self, magic_name): 

2490 """Find and return a line magic by name. 

2491 

2492 Returns None if the magic isn't found.""" 

2493 return self.magics_manager.magics['line'].get(magic_name) 

2494 

2495 def find_cell_magic(self, magic_name): 

2496 """Find and return a cell magic by name. 

2497 

2498 Returns None if the magic isn't found.""" 

2499 return self.magics_manager.magics['cell'].get(magic_name) 

2500 

2501 def find_magic(self, magic_name, magic_kind='line'): 

2502 """Find and return a magic of the given type by name. 

2503 

2504 Returns None if the magic isn't found.""" 

2505 return self.magics_manager.magics[magic_kind].get(magic_name) 

2506 

2507 def magic(self, arg_s): 

2508 """ 

2509 DEPRECATED 

2510 

2511 Deprecated since IPython 0.13 (warning added in 

2512 8.1), use run_line_magic(magic_name, parameter_s). 

2513 

2514 Call a magic function by name. 

2515 

2516 Input: a string containing the name of the magic function to call and 

2517 any additional arguments to be passed to the magic. 

2518 

2519 magic('name -opt foo bar') is equivalent to typing at the ipython 

2520 prompt: 

2521 

2522 In[1]: %name -opt foo bar 

2523 

2524 To call a magic without arguments, simply use magic('name'). 

2525 

2526 This provides a proper Python function to call IPython's magics in any 

2527 valid Python code you can type at the interpreter, including loops and 

2528 compound statements. 

2529 """ 

2530 warnings.warn( 

2531 "`magic(...)` is deprecated since IPython 0.13 (warning added in " 

2532 "8.1), use run_line_magic(magic_name, parameter_s).", 

2533 DeprecationWarning, 

2534 stacklevel=2, 

2535 ) 

2536 # TODO: should we issue a loud deprecation warning here? 

2537 magic_name, _, magic_arg_s = arg_s.partition(' ') 

2538 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC) 

2539 return self.run_line_magic(magic_name, magic_arg_s, _stack_depth=2) 

2540 

2541 #------------------------------------------------------------------------- 

2542 # Things related to macros 

2543 #------------------------------------------------------------------------- 

2544 

2545 def define_macro(self, name, themacro): 

2546 """Define a new macro 

2547 

2548 Parameters 

2549 ---------- 

2550 name : str 

2551 The name of the macro. 

2552 themacro : str or Macro 

2553 The action to do upon invoking the macro. If a string, a new 

2554 Macro object is created by passing the string to it. 

2555 """ 

2556 

2557 from IPython.core import macro 

2558 

2559 if isinstance(themacro, str): 

2560 themacro = macro.Macro(themacro) 

2561 if not isinstance(themacro, macro.Macro): 

2562 raise ValueError('A macro must be a string or a Macro instance.') 

2563 self.user_ns[name] = themacro 

2564 

2565 #------------------------------------------------------------------------- 

2566 # Things related to the running of system commands 

2567 #------------------------------------------------------------------------- 

2568 

2569 def system_piped(self, cmd): 

2570 """Call the given cmd in a subprocess, piping stdout/err 

2571 

2572 Parameters 

2573 ---------- 

2574 cmd : str 

2575 Command to execute (can not end in '&', as background processes are 

2576 not supported. Should not be a command that expects input 

2577 other than simple text. 

2578 """ 

2579 if cmd.rstrip().endswith('&'): 

2580 # this is *far* from a rigorous test 

2581 # We do not support backgrounding processes because we either use 

2582 # pexpect or pipes to read from. Users can always just call 

2583 # os.system() or use ip.system=ip.system_raw 

2584 # if they really want a background process. 

2585 raise OSError("Background processes not supported.") 

2586 

2587 # we explicitly do NOT return the subprocess status code, because 

2588 # a non-None value would trigger :func:`sys.displayhook` calls. 

2589 # Instead, we store the exit_code in user_ns. 

2590 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1)) 

2591 

2592 def system_raw(self, cmd): 

2593 """Call the given cmd in a subprocess using os.system on Windows or 

2594 subprocess.call using the system shell on other platforms. 

2595 

2596 Parameters 

2597 ---------- 

2598 cmd : str 

2599 Command to execute. 

2600 """ 

2601 cmd = self.var_expand(cmd, depth=1) 

2602 # warn if there is an IPython magic alternative. 

2603 main_cmd = cmd.split()[0] 

2604 has_magic_alternatives = ("pip", "conda", "cd") 

2605 

2606 if main_cmd in has_magic_alternatives: 

2607 warnings.warn( 

2608 ( 

2609 "You executed the system command !{0} which may not work " 

2610 "as expected. Try the IPython magic %{0} instead." 

2611 ).format(main_cmd) 

2612 ) 

2613 

2614 # protect os.system from UNC paths on Windows, which it can't handle: 

2615 if sys.platform == 'win32': 

2616 from IPython.utils._process_win32 import AvoidUNCPath 

2617 with AvoidUNCPath() as path: 

2618 if path is not None: 

2619 cmd = '"pushd %s &&"%s' % (path, cmd) 

2620 try: 

2621 ec = os.system(cmd) 

2622 except KeyboardInterrupt: 

2623 print('\n' + self.get_exception_only(), file=sys.stderr) 

2624 ec = -2 

2625 else: 

2626 # For posix the result of the subprocess.call() below is an exit 

2627 # code, which by convention is zero for success, positive for 

2628 # program failure. Exit codes above 128 are reserved for signals, 

2629 # and the formula for converting a signal to an exit code is usually 

2630 # signal_number+128. To more easily differentiate between exit 

2631 # codes and signals, ipython uses negative numbers. For instance 

2632 # since control-c is signal 2 but exit code 130, ipython's 

2633 # _exit_code variable will read -2. Note that some shells like 

2634 # csh and fish don't follow sh/bash conventions for exit codes. 

2635 executable = os.environ.get('SHELL', None) 

2636 try: 

2637 # Use env shell instead of default /bin/sh 

2638 ec = subprocess.call(cmd, shell=True, executable=executable) 

2639 except KeyboardInterrupt: 

2640 # intercept control-C; a long traceback is not useful here 

2641 print('\n' + self.get_exception_only(), file=sys.stderr) 

2642 ec = 130 

2643 if ec > 128: 

2644 ec = -(ec - 128) 

2645 

2646 # We explicitly do NOT return the subprocess status code, because 

2647 # a non-None value would trigger :func:`sys.displayhook` calls. 

2648 # Instead, we store the exit_code in user_ns. Note the semantics 

2649 # of _exit_code: for control-c, _exit_code == -signal.SIGNIT, 

2650 # but raising SystemExit(_exit_code) will give status 254! 

2651 self.user_ns['_exit_code'] = ec 

2652 

2653 # use piped system by default, because it is better behaved 

2654 system = system_piped 

2655 

2656 def getoutput(self, cmd, split=True, depth=0): 

2657 """Get output (possibly including stderr) from a subprocess. 

2658 

2659 Parameters 

2660 ---------- 

2661 cmd : str 

2662 Command to execute (can not end in '&', as background processes are 

2663 not supported. 

2664 split : bool, optional 

2665 If True, split the output into an IPython SList. Otherwise, an 

2666 IPython LSString is returned. These are objects similar to normal 

2667 lists and strings, with a few convenience attributes for easier 

2668 manipulation of line-based output. You can use '?' on them for 

2669 details. 

2670 depth : int, optional 

2671 How many frames above the caller are the local variables which should 

2672 be expanded in the command string? The default (0) assumes that the 

2673 expansion variables are in the stack frame calling this function. 

2674 """ 

2675 if cmd.rstrip().endswith('&'): 

2676 # this is *far* from a rigorous test 

2677 raise OSError("Background processes not supported.") 

2678 out = getoutput(self.var_expand(cmd, depth=depth+1)) 

2679 if split: 

2680 out = SList(out.splitlines()) 

2681 else: 

2682 out = LSString(out) 

2683 return out 

2684 

2685 #------------------------------------------------------------------------- 

2686 # Things related to aliases 

2687 #------------------------------------------------------------------------- 

2688 

2689 def init_alias(self): 

2690 self.alias_manager = AliasManager(shell=self, parent=self) 

2691 self.configurables.append(self.alias_manager) 

2692 

2693 #------------------------------------------------------------------------- 

2694 # Things related to extensions 

2695 #------------------------------------------------------------------------- 

2696 

2697 def init_extension_manager(self): 

2698 self.extension_manager = ExtensionManager(shell=self, parent=self) 

2699 self.configurables.append(self.extension_manager) 

2700 

2701 #------------------------------------------------------------------------- 

2702 # Things related to payloads 

2703 #------------------------------------------------------------------------- 

2704 

2705 def init_payload(self): 

2706 self.payload_manager = PayloadManager(parent=self) 

2707 self.configurables.append(self.payload_manager) 

2708 

2709 #------------------------------------------------------------------------- 

2710 # Things related to the prefilter 

2711 #------------------------------------------------------------------------- 

2712 

2713 def init_prefilter(self): 

2714 self.prefilter_manager = PrefilterManager(shell=self, parent=self) 

2715 self.configurables.append(self.prefilter_manager) 

2716 # Ultimately this will be refactored in the new interpreter code, but 

2717 # for now, we should expose the main prefilter method (there's legacy 

2718 # code out there that may rely on this). 

2719 self.prefilter = self.prefilter_manager.prefilter_lines 

2720 

2721 def auto_rewrite_input(self, cmd): 

2722 """Print to the screen the rewritten form of the user's command. 

2723 

2724 This shows visual feedback by rewriting input lines that cause 

2725 automatic calling to kick in, like:: 

2726 

2727 /f x 

2728 

2729 into:: 

2730 

2731 ------> f(x) 

2732 

2733 after the user's input prompt. This helps the user understand that the 

2734 input line was transformed automatically by IPython. 

2735 """ 

2736 if not self.show_rewritten_input: 

2737 return 

2738 

2739 # This is overridden in TerminalInteractiveShell to use fancy prompts 

2740 print("------> " + cmd) 

2741 

2742 #------------------------------------------------------------------------- 

2743 # Things related to extracting values/expressions from kernel and user_ns 

2744 #------------------------------------------------------------------------- 

2745 

2746 def _user_obj_error(self): 

2747 """return simple exception dict 

2748 

2749 for use in user_expressions 

2750 """ 

2751 

2752 etype, evalue, tb = self._get_exc_info() 

2753 stb = self.InteractiveTB.get_exception_only(etype, evalue) 

2754 

2755 exc_info = { 

2756 "status": "error", 

2757 "traceback": stb, 

2758 "ename": etype.__name__, 

2759 "evalue": py3compat.safe_unicode(evalue), 

2760 } 

2761 

2762 return exc_info 

2763 

2764 def _format_user_obj(self, obj): 

2765 """format a user object to display dict 

2766 

2767 for use in user_expressions 

2768 """ 

2769 

2770 data, md = self.display_formatter.format(obj) 

2771 value = { 

2772 'status' : 'ok', 

2773 'data' : data, 

2774 'metadata' : md, 

2775 } 

2776 return value 

2777 

2778 def user_expressions(self, expressions): 

2779 """Evaluate a dict of expressions in the user's namespace. 

2780 

2781 Parameters 

2782 ---------- 

2783 expressions : dict 

2784 A dict with string keys and string values. The expression values 

2785 should be valid Python expressions, each of which will be evaluated 

2786 in the user namespace. 

2787 

2788 Returns 

2789 ------- 

2790 A dict, keyed like the input expressions dict, with the rich mime-typed 

2791 display_data of each value. 

2792 """ 

2793 out = {} 

2794 user_ns = self.user_ns 

2795 global_ns = self.user_global_ns 

2796 

2797 for key, expr in expressions.items(): 

2798 try: 

2799 value = self._format_user_obj(eval(expr, global_ns, user_ns)) 

2800 except: 

2801 value = self._user_obj_error() 

2802 out[key] = value 

2803 return out 

2804 

2805 #------------------------------------------------------------------------- 

2806 # Things related to the running of code 

2807 #------------------------------------------------------------------------- 

2808 

2809 def ex(self, cmd): 

2810 """Execute a normal python statement in user namespace.""" 

2811 with self.builtin_trap: 

2812 exec(cmd, self.user_global_ns, self.user_ns) 

2813 

2814 def ev(self, expr): 

2815 """Evaluate python expression expr in user namespace. 

2816 

2817 Returns the result of evaluation 

2818 """ 

2819 with self.builtin_trap: 

2820 return eval(expr, self.user_global_ns, self.user_ns) 

2821 

2822 def safe_execfile(self, fname, *where, exit_ignore=False, raise_exceptions=False, shell_futures=False): 

2823 """A safe version of the builtin execfile(). 

2824 

2825 This version will never throw an exception, but instead print 

2826 helpful error messages to the screen. This only works on pure 

2827 Python files with the .py extension. 

2828 

2829 Parameters 

2830 ---------- 

2831 fname : string 

2832 The name of the file to be executed. 

2833 *where : tuple 

2834 One or two namespaces, passed to execfile() as (globals,locals). 

2835 If only one is given, it is passed as both. 

2836 exit_ignore : bool (False) 

2837 If True, then silence SystemExit for non-zero status (it is always 

2838 silenced for zero status, as it is so common). 

2839 raise_exceptions : bool (False) 

2840 If True raise exceptions everywhere. Meant for testing. 

2841 shell_futures : bool (False) 

2842 If True, the code will share future statements with the interactive 

2843 shell. It will both be affected by previous __future__ imports, and 

2844 any __future__ imports in the code will affect the shell. If False, 

2845 __future__ imports are not shared in either direction. 

2846 

2847 """ 

2848 fname = Path(fname).expanduser().resolve() 

2849 

2850 # Make sure we can open the file 

2851 try: 

2852 with fname.open("rb"): 

2853 pass 

2854 except: 

2855 warn('Could not open file <%s> for safe execution.' % fname) 

2856 return 

2857 

2858 # Find things also in current directory. This is needed to mimic the 

2859 # behavior of running a script from the system command line, where 

2860 # Python inserts the script's directory into sys.path 

2861 dname = str(fname.parent) 

2862 

2863 with prepended_to_syspath(dname), self.builtin_trap: 

2864 try: 

2865 glob, loc = (where + (None, ))[:2] 

2866 py3compat.execfile( 

2867 fname, glob, loc, 

2868 self.compile if shell_futures else None) 

2869 except SystemExit as status: 

2870 # If the call was made with 0 or None exit status (sys.exit(0) 

2871 # or sys.exit() ), don't bother showing a traceback, as both of 

2872 # these are considered normal by the OS: 

2873 # > python -c'import sys;sys.exit(0)'; echo $? 

2874 # 0 

2875 # > python -c'import sys;sys.exit()'; echo $? 

2876 # 0 

2877 # For other exit status, we show the exception unless 

2878 # explicitly silenced, but only in short form. 

2879 if status.code: 

2880 if raise_exceptions: 

2881 raise 

2882 if not exit_ignore: 

2883 self.showtraceback(exception_only=True) 

2884 except: 

2885 if raise_exceptions: 

2886 raise 

2887 # tb offset is 2 because we wrap execfile 

2888 self.showtraceback(tb_offset=2) 

2889 

2890 def safe_execfile_ipy(self, fname, shell_futures=False, raise_exceptions=False): 

2891 """Like safe_execfile, but for .ipy or .ipynb files with IPython syntax. 

2892 

2893 Parameters 

2894 ---------- 

2895 fname : str 

2896 The name of the file to execute. The filename must have a 

2897 .ipy or .ipynb extension. 

2898 shell_futures : bool (False) 

2899 If True, the code will share future statements with the interactive 

2900 shell. It will both be affected by previous __future__ imports, and 

2901 any __future__ imports in the code will affect the shell. If False, 

2902 __future__ imports are not shared in either direction. 

2903 raise_exceptions : bool (False) 

2904 If True raise exceptions everywhere. Meant for testing. 

2905 """ 

2906 fname = Path(fname).expanduser().resolve() 

2907 

2908 # Make sure we can open the file 

2909 try: 

2910 with fname.open("rb"): 

2911 pass 

2912 except: 

2913 warn('Could not open file <%s> for safe execution.' % fname) 

2914 return 

2915 

2916 # Find things also in current directory. This is needed to mimic the 

2917 # behavior of running a script from the system command line, where 

2918 # Python inserts the script's directory into sys.path 

2919 dname = str(fname.parent) 

2920 

2921 def get_cells(): 

2922 """generator for sequence of code blocks to run""" 

2923 if fname.suffix == ".ipynb": 

2924 from nbformat import read 

2925 nb = read(fname, as_version=4) 

2926 if not nb.cells: 

2927 return 

2928 for cell in nb.cells: 

2929 if cell.cell_type == 'code': 

2930 yield cell.source 

2931 else: 

2932 yield fname.read_text(encoding="utf-8") 

2933 

2934 with prepended_to_syspath(dname): 

2935 try: 

2936 for cell in get_cells(): 

2937 result = self.run_cell(cell, silent=True, shell_futures=shell_futures) 

2938 if raise_exceptions: 

2939 result.raise_error() 

2940 elif not result.success: 

2941 break 

2942 except: 

2943 if raise_exceptions: 

2944 raise 

2945 self.showtraceback() 

2946 warn('Unknown failure executing file: <%s>' % fname) 

2947 

2948 def safe_run_module(self, mod_name, where): 

2949 """A safe version of runpy.run_module(). 

2950 

2951 This version will never throw an exception, but instead print 

2952 helpful error messages to the screen. 

2953 

2954 `SystemExit` exceptions with status code 0 or None are ignored. 

2955 

2956 Parameters 

2957 ---------- 

2958 mod_name : string 

2959 The name of the module to be executed. 

2960 where : dict 

2961 The globals namespace. 

2962 """ 

2963 try: 

2964 try: 

2965 where.update( 

2966 runpy.run_module(str(mod_name), run_name="__main__", 

2967 alter_sys=True) 

2968 ) 

2969 except SystemExit as status: 

2970 if status.code: 

2971 raise 

2972 except: 

2973 self.showtraceback() 

2974 warn('Unknown failure executing module: <%s>' % mod_name) 

2975 

2976 def run_cell( 

2977 self, 

2978 raw_cell, 

2979 store_history=False, 

2980 silent=False, 

2981 shell_futures=True, 

2982 cell_id=None, 

2983 ): 

2984 """Run a complete IPython cell. 

2985 

2986 Parameters 

2987 ---------- 

2988 raw_cell : str 

2989 The code (including IPython code such as %magic functions) to run. 

2990 store_history : bool 

2991 If True, the raw and translated cell will be stored in IPython's 

2992 history. For user code calling back into IPython's machinery, this 

2993 should be set to False. 

2994 silent : bool 

2995 If True, avoid side-effects, such as implicit displayhooks and 

2996 and logging. silent=True forces store_history=False. 

2997 shell_futures : bool 

2998 If True, the code will share future statements with the interactive 

2999 shell. It will both be affected by previous __future__ imports, and 

3000 any __future__ imports in the code will affect the shell. If False, 

3001 __future__ imports are not shared in either direction. 

3002 

3003 Returns 

3004 ------- 

3005 result : :class:`ExecutionResult` 

3006 """ 

3007 result = None 

3008 try: 

3009 result = self._run_cell( 

3010 raw_cell, store_history, silent, shell_futures, cell_id 

3011 ) 

3012 finally: 

3013 self.events.trigger('post_execute') 

3014 if not silent: 

3015 self.events.trigger('post_run_cell', result) 

3016 return result 

3017 

3018 def _run_cell( 

3019 self, 

3020 raw_cell: str, 

3021 store_history: bool, 

3022 silent: bool, 

3023 shell_futures: bool, 

3024 cell_id: str, 

3025 ) -> ExecutionResult: 

3026 """Internal method to run a complete IPython cell.""" 

3027 

3028 # we need to avoid calling self.transform_cell multiple time on the same thing 

3029 # so we need to store some results: 

3030 preprocessing_exc_tuple = None 

3031 try: 

3032 transformed_cell = self.transform_cell(raw_cell) 

3033 except Exception: 

3034 transformed_cell = raw_cell 

3035 preprocessing_exc_tuple = sys.exc_info() 

3036 

3037 assert transformed_cell is not None 

3038 coro = self.run_cell_async( 

3039 raw_cell, 

3040 store_history=store_history, 

3041 silent=silent, 

3042 shell_futures=shell_futures, 

3043 transformed_cell=transformed_cell, 

3044 preprocessing_exc_tuple=preprocessing_exc_tuple, 

3045 cell_id=cell_id, 

3046 ) 

3047 

3048 # run_cell_async is async, but may not actually need an eventloop. 

3049 # when this is the case, we want to run it using the pseudo_sync_runner 

3050 # so that code can invoke eventloops (for example via the %run , and 

3051 # `%paste` magic. 

3052 if self.trio_runner: 

3053 runner = self.trio_runner 

3054 elif self.should_run_async( 

3055 raw_cell, 

3056 transformed_cell=transformed_cell, 

3057 preprocessing_exc_tuple=preprocessing_exc_tuple, 

3058 ): 

3059 runner = self.loop_runner 

3060 else: 

3061 runner = _pseudo_sync_runner 

3062 

3063 try: 

3064 result = runner(coro) 

3065 except BaseException as e: 

3066 info = ExecutionInfo( 

3067 raw_cell, store_history, silent, shell_futures, cell_id 

3068 ) 

3069 result = ExecutionResult(info) 

3070 result.error_in_exec = e 

3071 self.showtraceback(running_compiled_code=True) 

3072 finally: 

3073 return result 

3074 

3075 def should_run_async( 

3076 self, raw_cell: str, *, transformed_cell=None, preprocessing_exc_tuple=None 

3077 ) -> bool: 

3078 """Return whether a cell should be run asynchronously via a coroutine runner 

3079 

3080 Parameters 

3081 ---------- 

3082 raw_cell : str 

3083 The code to be executed 

3084 

3085 Returns 

3086 ------- 

3087 result: bool 

3088 Whether the code needs to be run with a coroutine runner or not 

3089 .. versionadded:: 7.0 

3090 """ 

3091 if not self.autoawait: 

3092 return False 

3093 if preprocessing_exc_tuple is not None: 

3094 return False 

3095 assert preprocessing_exc_tuple is None 

3096 if transformed_cell is None: 

3097 warnings.warn( 

3098 "`should_run_async` will not call `transform_cell`" 

3099 " automatically in the future. Please pass the result to" 

3100 " `transformed_cell` argument and any exception that happen" 

3101 " during the" 

3102 "transform in `preprocessing_exc_tuple` in" 

3103 " IPython 7.17 and above.", 

3104 DeprecationWarning, 

3105 stacklevel=2, 

3106 ) 

3107 try: 

3108 cell = self.transform_cell(raw_cell) 

3109 except Exception: 

3110 # any exception during transform will be raised 

3111 # prior to execution 

3112 return False 

3113 else: 

3114 cell = transformed_cell 

3115 return _should_be_async(cell) 

3116 

3117 async def run_cell_async( 

3118 self, 

3119 raw_cell: str, 

3120 store_history=False, 

3121 silent=False, 

3122 shell_futures=True, 

3123 *, 

3124 transformed_cell: Optional[str] = None, 

3125 preprocessing_exc_tuple: Optional[AnyType] = None, 

3126 cell_id=None, 

3127 ) -> ExecutionResult: 

3128 """Run a complete IPython cell asynchronously. 

3129 

3130 Parameters 

3131 ---------- 

3132 raw_cell : str 

3133 The code (including IPython code such as %magic functions) to run. 

3134 store_history : bool 

3135 If True, the raw and translated cell will be stored in IPython's 

3136 history. For user code calling back into IPython's machinery, this 

3137 should be set to False. 

3138 silent : bool 

3139 If True, avoid side-effects, such as implicit displayhooks and 

3140 and logging. silent=True forces store_history=False. 

3141 shell_futures : bool 

3142 If True, the code will share future statements with the interactive 

3143 shell. It will both be affected by previous __future__ imports, and 

3144 any __future__ imports in the code will affect the shell. If False, 

3145 __future__ imports are not shared in either direction. 

3146 transformed_cell: str 

3147 cell that was passed through transformers 

3148 preprocessing_exc_tuple: 

3149 trace if the transformation failed. 

3150 

3151 Returns 

3152 ------- 

3153 result : :class:`ExecutionResult` 

3154 

3155 .. versionadded:: 7.0 

3156 """ 

3157 info = ExecutionInfo(raw_cell, store_history, silent, shell_futures, cell_id) 

3158 result = ExecutionResult(info) 

3159 

3160 if (not raw_cell) or raw_cell.isspace(): 

3161 self.last_execution_succeeded = True 

3162 self.last_execution_result = result 

3163 return result 

3164 

3165 if silent: 

3166 store_history = False 

3167 

3168 if store_history: 

3169 result.execution_count = self.execution_count 

3170 

3171 def error_before_exec(value): 

3172 if store_history: 

3173 self.execution_count += 1 

3174 result.error_before_exec = value 

3175 self.last_execution_succeeded = False 

3176 self.last_execution_result = result 

3177 return result 

3178 

3179 self.events.trigger('pre_execute') 

3180 if not silent: 

3181 self.events.trigger('pre_run_cell', info) 

3182 

3183 if transformed_cell is None: 

3184 warnings.warn( 

3185 "`run_cell_async` will not call `transform_cell`" 

3186 " automatically in the future. Please pass the result to" 

3187 " `transformed_cell` argument and any exception that happen" 

3188 " during the" 

3189 "transform in `preprocessing_exc_tuple` in" 

3190 " IPython 7.17 and above.", 

3191 DeprecationWarning, 

3192 stacklevel=2, 

3193 ) 

3194 # If any of our input transformation (input_transformer_manager or 

3195 # prefilter_manager) raises an exception, we store it in this variable 

3196 # so that we can display the error after logging the input and storing 

3197 # it in the history. 

3198 try: 

3199 cell = self.transform_cell(raw_cell) 

3200 except Exception: 

3201 preprocessing_exc_tuple = sys.exc_info() 

3202 cell = raw_cell # cell has to exist so it can be stored/logged 

3203 else: 

3204 preprocessing_exc_tuple = None 

3205 else: 

3206 if preprocessing_exc_tuple is None: 

3207 cell = transformed_cell 

3208 else: 

3209 cell = raw_cell 

3210 

3211 # Do NOT store paste/cpaste magic history 

3212 if "get_ipython().run_line_magic(" in cell and "paste" in cell: 

3213 store_history = False 

3214 

3215 # Store raw and processed history 

3216 if store_history: 

3217 self.history_manager.store_inputs(self.execution_count, cell, raw_cell) 

3218 if not silent: 

3219 self.logger.log(cell, raw_cell) 

3220 

3221 # Display the exception if input processing failed. 

3222 if preprocessing_exc_tuple is not None: 

3223 self.showtraceback(preprocessing_exc_tuple) 

3224 if store_history: 

3225 self.execution_count += 1 

3226 return error_before_exec(preprocessing_exc_tuple[1]) 

3227 

3228 # Our own compiler remembers the __future__ environment. If we want to 

3229 # run code with a separate __future__ environment, use the default 

3230 # compiler 

3231 compiler = self.compile if shell_futures else self.compiler_class() 

3232 

3233 _run_async = False 

3234 

3235 with self.builtin_trap: 

3236 cell_name = compiler.cache(cell, self.execution_count, raw_code=raw_cell) 

3237 

3238 with self.display_trap: 

3239 # Compile to bytecode 

3240 try: 

3241 code_ast = compiler.ast_parse(cell, filename=cell_name) 

3242 except self.custom_exceptions as e: 

3243 etype, value, tb = sys.exc_info() 

3244 self.CustomTB(etype, value, tb) 

3245 return error_before_exec(e) 

3246 except IndentationError as e: 

3247 self.showindentationerror() 

3248 return error_before_exec(e) 

3249 except (OverflowError, SyntaxError, ValueError, TypeError, 

3250 MemoryError) as e: 

3251 self.showsyntaxerror() 

3252 return error_before_exec(e) 

3253 

3254 # Apply AST transformations 

3255 try: 

3256 code_ast = self.transform_ast(code_ast) 

3257 except InputRejected as e: 

3258 self.showtraceback() 

3259 return error_before_exec(e) 

3260 

3261 # Give the displayhook a reference to our ExecutionResult so it 

3262 # can fill in the output value. 

3263 self.displayhook.exec_result = result 

3264 

3265 # Execute the user code 

3266 interactivity = "none" if silent else self.ast_node_interactivity 

3267 

3268 

3269 has_raised = await self.run_ast_nodes(code_ast.body, cell_name, 

3270 interactivity=interactivity, compiler=compiler, result=result) 

3271 

3272 self.last_execution_succeeded = not has_raised 

3273 self.last_execution_result = result 

3274 

3275 # Reset this so later displayed values do not modify the 

3276 # ExecutionResult 

3277 self.displayhook.exec_result = None 

3278 

3279 if store_history: 

3280 # Write output to the database. Does nothing unless 

3281 # history output logging is enabled. 

3282 self.history_manager.store_output(self.execution_count) 

3283 # Each cell is a *single* input, regardless of how many lines it has 

3284 self.execution_count += 1 

3285 

3286 return result 

3287 

3288 def transform_cell(self, raw_cell): 

3289 """Transform an input cell before parsing it. 

3290 

3291 Static transformations, implemented in IPython.core.inputtransformer2, 

3292 deal with things like ``%magic`` and ``!system`` commands. 

3293 These run on all input. 

3294 Dynamic transformations, for things like unescaped magics and the exit 

3295 autocall, depend on the state of the interpreter. 

3296 These only apply to single line inputs. 

3297 

3298 These string-based transformations are followed by AST transformations; 

3299 see :meth:`transform_ast`. 

3300 """ 

3301 # Static input transformations 

3302 cell = self.input_transformer_manager.transform_cell(raw_cell) 

3303 

3304 if len(cell.splitlines()) == 1: 

3305 # Dynamic transformations - only applied for single line commands 

3306 with self.builtin_trap: 

3307 # use prefilter_lines to handle trailing newlines 

3308 # restore trailing newline for ast.parse 

3309 cell = self.prefilter_manager.prefilter_lines(cell) + '\n' 

3310 

3311 lines = cell.splitlines(keepends=True) 

3312 for transform in self.input_transformers_post: 

3313 lines = transform(lines) 

3314 cell = ''.join(lines) 

3315 

3316 return cell 

3317 

3318 def transform_ast(self, node): 

3319 """Apply the AST transformations from self.ast_transformers 

3320 

3321 Parameters 

3322 ---------- 

3323 node : ast.Node 

3324 The root node to be transformed. Typically called with the ast.Module 

3325 produced by parsing user input. 

3326 

3327 Returns 

3328 ------- 

3329 An ast.Node corresponding to the node it was called with. Note that it 

3330 may also modify the passed object, so don't rely on references to the 

3331 original AST. 

3332 """ 

3333 for transformer in self.ast_transformers: 

3334 try: 

3335 node = transformer.visit(node) 

3336 except InputRejected: 

3337 # User-supplied AST transformers can reject an input by raising 

3338 # an InputRejected. Short-circuit in this case so that we 

3339 # don't unregister the transform. 

3340 raise 

3341 except Exception: 

3342 warn("AST transformer %r threw an error. It will be unregistered." % transformer) 

3343 self.ast_transformers.remove(transformer) 

3344 

3345 if self.ast_transformers: 

3346 ast.fix_missing_locations(node) 

3347 return node 

3348 

3349 async def run_ast_nodes( 

3350 self, 

3351 nodelist: ListType[stmt], 

3352 cell_name: str, 

3353 interactivity="last_expr", 

3354 compiler=compile, 

3355 result=None, 

3356 ): 

3357 """Run a sequence of AST nodes. The execution mode depends on the 

3358 interactivity parameter. 

3359 

3360 Parameters 

3361 ---------- 

3362 nodelist : list 

3363 A sequence of AST nodes to run. 

3364 cell_name : str 

3365 Will be passed to the compiler as the filename of the cell. Typically 

3366 the value returned by ip.compile.cache(cell). 

3367 interactivity : str 

3368 'all', 'last', 'last_expr' , 'last_expr_or_assign' or 'none', 

3369 specifying which nodes should be run interactively (displaying output 

3370 from expressions). 'last_expr' will run the last node interactively 

3371 only if it is an expression (i.e. expressions in loops or other blocks 

3372 are not displayed) 'last_expr_or_assign' will run the last expression 

3373 or the last assignment. Other values for this parameter will raise a 

3374 ValueError. 

3375 

3376 compiler : callable 

3377 A function with the same interface as the built-in compile(), to turn 

3378 the AST nodes into code objects. Default is the built-in compile(). 

3379 result : ExecutionResult, optional 

3380 An object to store exceptions that occur during execution. 

3381 

3382 Returns 

3383 ------- 

3384 True if an exception occurred while running code, False if it finished 

3385 running. 

3386 """ 

3387 if not nodelist: 

3388 return 

3389 

3390 

3391 if interactivity == 'last_expr_or_assign': 

3392 if isinstance(nodelist[-1], _assign_nodes): 

3393 asg = nodelist[-1] 

3394 if isinstance(asg, ast.Assign) and len(asg.targets) == 1: 

3395 target = asg.targets[0] 

3396 elif isinstance(asg, _single_targets_nodes): 

3397 target = asg.target 

3398 else: 

3399 target = None 

3400 if isinstance(target, ast.Name): 

3401 nnode = ast.Expr(ast.Name(target.id, ast.Load())) 

3402 ast.fix_missing_locations(nnode) 

3403 nodelist.append(nnode) 

3404 interactivity = 'last_expr' 

3405 

3406 _async = False 

3407 if interactivity == 'last_expr': 

3408 if isinstance(nodelist[-1], ast.Expr): 

3409 interactivity = "last" 

3410 else: 

3411 interactivity = "none" 

3412 

3413 if interactivity == 'none': 

3414 to_run_exec, to_run_interactive = nodelist, [] 

3415 elif interactivity == 'last': 

3416 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:] 

3417 elif interactivity == 'all': 

3418 to_run_exec, to_run_interactive = [], nodelist 

3419 else: 

3420 raise ValueError("Interactivity was %r" % interactivity) 

3421 

3422 try: 

3423 

3424 def compare(code): 

3425 is_async = inspect.CO_COROUTINE & code.co_flags == inspect.CO_COROUTINE 

3426 return is_async 

3427 

3428 # refactor that to just change the mod constructor. 

3429 to_run = [] 

3430 for node in to_run_exec: 

3431 to_run.append((node, "exec")) 

3432 

3433 for node in to_run_interactive: 

3434 to_run.append((node, "single")) 

3435 

3436 for node, mode in to_run: 

3437 if mode == "exec": 

3438 mod = Module([node], []) 

3439 elif mode == "single": 

3440 mod = ast.Interactive([node]) # type: ignore 

3441 with compiler.extra_flags( 

3442 getattr(ast, "PyCF_ALLOW_TOP_LEVEL_AWAIT", 0x0) 

3443 if self.autoawait 

3444 else 0x0 

3445 ): 

3446 code = compiler(mod, cell_name, mode) 

3447 asy = compare(code) 

3448 if await self.run_code(code, result, async_=asy): 

3449 return True 

3450 

3451 # Flush softspace 

3452 if softspace(sys.stdout, 0): 

3453 print() 

3454 

3455 except: 

3456 # It's possible to have exceptions raised here, typically by 

3457 # compilation of odd code (such as a naked 'return' outside a 

3458 # function) that did parse but isn't valid. Typically the exception 

3459 # is a SyntaxError, but it's safest just to catch anything and show 

3460 # the user a traceback. 

3461 

3462 # We do only one try/except outside the loop to minimize the impact 

3463 # on runtime, and also because if any node in the node list is 

3464 # broken, we should stop execution completely. 

3465 if result: 

3466 result.error_before_exec = sys.exc_info()[1] 

3467 self.showtraceback() 

3468 return True 

3469 

3470 return False 

3471 

3472 async def run_code(self, code_obj, result=None, *, async_=False): 

3473 """Execute a code object. 

3474 

3475 When an exception occurs, self.showtraceback() is called to display a 

3476 traceback. 

3477 

3478 Parameters 

3479 ---------- 

3480 code_obj : code object 

3481 A compiled code object, to be executed 

3482 result : ExecutionResult, optional 

3483 An object to store exceptions that occur during execution. 

3484 async_ : Bool (Experimental) 

3485 Attempt to run top-level asynchronous code in a default loop. 

3486 

3487 Returns 

3488 ------- 

3489 False : successful execution. 

3490 True : an error occurred. 

3491 """ 

3492 # special value to say that anything above is IPython and should be 

3493 # hidden. 

3494 __tracebackhide__ = "__ipython_bottom__" 

3495 # Set our own excepthook in case the user code tries to call it 

3496 # directly, so that the IPython crash handler doesn't get triggered 

3497 old_excepthook, sys.excepthook = sys.excepthook, self.excepthook 

3498 

3499 # we save the original sys.excepthook in the instance, in case config 

3500 # code (such as magics) needs access to it. 

3501 self.sys_excepthook = old_excepthook 

3502 outflag = True # happens in more places, so it's easier as default 

3503 try: 

3504 try: 

3505 if async_: 

3506 await eval(code_obj, self.user_global_ns, self.user_ns) 

3507 else: 

3508 exec(code_obj, self.user_global_ns, self.user_ns) 

3509 finally: 

3510 # Reset our crash handler in place 

3511 sys.excepthook = old_excepthook 

3512 except SystemExit as e: 

3513 if result is not None: 

3514 result.error_in_exec = e 

3515 self.showtraceback(exception_only=True) 

3516 warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1) 

3517 except bdb.BdbQuit: 

3518 etype, value, tb = sys.exc_info() 

3519 if result is not None: 

3520 result.error_in_exec = value 

3521 # the BdbQuit stops here 

3522 except self.custom_exceptions: 

3523 etype, value, tb = sys.exc_info() 

3524 if result is not None: 

3525 result.error_in_exec = value 

3526 self.CustomTB(etype, value, tb) 

3527 except: 

3528 if result is not None: 

3529 result.error_in_exec = sys.exc_info()[1] 

3530 self.showtraceback(running_compiled_code=True) 

3531 else: 

3532 outflag = False 

3533 return outflag 

3534 

3535 # For backwards compatibility 

3536 runcode = run_code 

3537 

3538 def check_complete(self, code: str) -> Tuple[str, str]: 

3539 """Return whether a block of code is ready to execute, or should be continued 

3540 

3541 Parameters 

3542 ---------- 

3543 code : string 

3544 Python input code, which can be multiline. 

3545 

3546 Returns 

3547 ------- 

3548 status : str 

3549 One of 'complete', 'incomplete', or 'invalid' if source is not a 

3550 prefix of valid code. 

3551 indent : str 

3552 When status is 'incomplete', this is some whitespace to insert on 

3553 the next line of the prompt. 

3554 """ 

3555 status, nspaces = self.input_transformer_manager.check_complete(code) 

3556 return status, ' ' * (nspaces or 0) 

3557 

3558 #------------------------------------------------------------------------- 

3559 # Things related to GUI support and pylab 

3560 #------------------------------------------------------------------------- 

3561 

3562 active_eventloop = None 

3563 

3564 def enable_gui(self, gui=None): 

3565 raise NotImplementedError('Implement enable_gui in a subclass') 

3566 

3567 def enable_matplotlib(self, gui=None): 

3568 """Enable interactive matplotlib and inline figure support. 

3569 

3570 This takes the following steps: 

3571 

3572 1. select the appropriate eventloop and matplotlib backend 

3573 2. set up matplotlib for interactive use with that backend 

3574 3. configure formatters for inline figure display 

3575 4. enable the selected gui eventloop 

3576 

3577 Parameters 

3578 ---------- 

3579 gui : optional, string 

3580 If given, dictates the choice of matplotlib GUI backend to use 

3581 (should be one of IPython's supported backends, 'qt', 'osx', 'tk', 

3582 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by 

3583 matplotlib (as dictated by the matplotlib build-time options plus the 

3584 user's matplotlibrc configuration file). Note that not all backends 

3585 make sense in all contexts, for example a terminal ipython can't 

3586 display figures inline. 

3587 """ 

3588 from matplotlib_inline.backend_inline import configure_inline_support 

3589 

3590 from IPython.core import pylabtools as pt 

3591 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select) 

3592 

3593 if gui != 'inline': 

3594 # If we have our first gui selection, store it 

3595 if self.pylab_gui_select is None: 

3596 self.pylab_gui_select = gui 

3597 # Otherwise if they are different 

3598 elif gui != self.pylab_gui_select: 

3599 print('Warning: Cannot change to a different GUI toolkit: %s.' 

3600 ' Using %s instead.' % (gui, self.pylab_gui_select)) 

3601 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select) 

3602 

3603 pt.activate_matplotlib(backend) 

3604 configure_inline_support(self, backend) 

3605 

3606 # Now we must activate the gui pylab wants to use, and fix %run to take 

3607 # plot updates into account 

3608 self.enable_gui(gui) 

3609 self.magics_manager.registry['ExecutionMagics'].default_runner = \ 

3610 pt.mpl_runner(self.safe_execfile) 

3611 

3612 return gui, backend 

3613 

3614 def enable_pylab(self, gui=None, import_all=True, welcome_message=False): 

3615 """Activate pylab support at runtime. 

3616 

3617 This turns on support for matplotlib, preloads into the interactive 

3618 namespace all of numpy and pylab, and configures IPython to correctly 

3619 interact with the GUI event loop. The GUI backend to be used can be 

3620 optionally selected with the optional ``gui`` argument. 

3621 

3622 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib. 

3623 

3624 Parameters 

3625 ---------- 

3626 gui : optional, string 

3627 If given, dictates the choice of matplotlib GUI backend to use 

3628 (should be one of IPython's supported backends, 'qt', 'osx', 'tk', 

3629 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by 

3630 matplotlib (as dictated by the matplotlib build-time options plus the 

3631 user's matplotlibrc configuration file). Note that not all backends 

3632 make sense in all contexts, for example a terminal ipython can't 

3633 display figures inline. 

3634 import_all : optional, bool, default: True 

3635 Whether to do `from numpy import *` and `from pylab import *` 

3636 in addition to module imports. 

3637 welcome_message : deprecated 

3638 This argument is ignored, no welcome message will be displayed. 

3639 """ 

3640 from IPython.core.pylabtools import import_pylab 

3641 

3642 gui, backend = self.enable_matplotlib(gui) 

3643 

3644 # We want to prevent the loading of pylab to pollute the user's 

3645 # namespace as shown by the %who* magics, so we execute the activation 

3646 # code in an empty namespace, and we update *both* user_ns and 

3647 # user_ns_hidden with this information. 

3648 ns = {} 

3649 import_pylab(ns, import_all) 

3650 # warn about clobbered names 

3651 ignored = {"__builtins__"} 

3652 both = set(ns).intersection(self.user_ns).difference(ignored) 

3653 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ] 

3654 self.user_ns.update(ns) 

3655 self.user_ns_hidden.update(ns) 

3656 return gui, backend, clobbered 

3657 

3658 #------------------------------------------------------------------------- 

3659 # Utilities 

3660 #------------------------------------------------------------------------- 

3661 

3662 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()): 

3663 """Expand python variables in a string. 

3664 

3665 The depth argument indicates how many frames above the caller should 

3666 be walked to look for the local namespace where to expand variables. 

3667 

3668 The global namespace for expansion is always the user's interactive 

3669 namespace. 

3670 """ 

3671 ns = self.user_ns.copy() 

3672 try: 

3673 frame = sys._getframe(depth+1) 

3674 except ValueError: 

3675 # This is thrown if there aren't that many frames on the stack, 

3676 # e.g. if a script called run_line_magic() directly. 

3677 pass 

3678 else: 

3679 ns.update(frame.f_locals) 

3680 

3681 try: 

3682 # We have to use .vformat() here, because 'self' is a valid and common 

3683 # name, and expanding **ns for .format() would make it collide with 

3684 # the 'self' argument of the method. 

3685 cmd = formatter.vformat(cmd, args=[], kwargs=ns) 

3686 except Exception: 

3687 # if formatter couldn't format, just let it go untransformed 

3688 pass 

3689 return cmd 

3690 

3691 def mktempfile(self, data=None, prefix='ipython_edit_'): 

3692 """Make a new tempfile and return its filename. 

3693 

3694 This makes a call to tempfile.mkstemp (created in a tempfile.mkdtemp), 

3695 but it registers the created filename internally so ipython cleans it up 

3696 at exit time. 

3697 

3698 Optional inputs: 

3699 

3700 - data(None): if data is given, it gets written out to the temp file 

3701 immediately, and the file is closed again.""" 

3702 

3703 dir_path = Path(tempfile.mkdtemp(prefix=prefix)) 

3704 self.tempdirs.append(dir_path) 

3705 

3706 handle, filename = tempfile.mkstemp(".py", prefix, dir=str(dir_path)) 

3707 os.close(handle) # On Windows, there can only be one open handle on a file 

3708 

3709 file_path = Path(filename) 

3710 self.tempfiles.append(file_path) 

3711 

3712 if data: 

3713 file_path.write_text(data, encoding="utf-8") 

3714 return filename 

3715 

3716 def ask_yes_no(self, prompt, default=None, interrupt=None): 

3717 if self.quiet: 

3718 return True 

3719 return ask_yes_no(prompt,default,interrupt) 

3720 

3721 def show_usage(self): 

3722 """Show a usage message""" 

3723 page.page(IPython.core.usage.interactive_usage) 

3724 

3725 def extract_input_lines(self, range_str, raw=False): 

3726 """Return as a string a set of input history slices. 

3727 

3728 Parameters 

3729 ---------- 

3730 range_str : str 

3731 The set of slices is given as a string, like "~5/6-~4/2 4:8 9", 

3732 since this function is for use by magic functions which get their 

3733 arguments as strings. The number before the / is the session 

3734 number: ~n goes n back from the current session. 

3735 

3736 If empty string is given, returns history of current session 

3737 without the last input. 

3738 

3739 raw : bool, optional 

3740 By default, the processed input is used. If this is true, the raw 

3741 input history is used instead. 

3742 

3743 Notes 

3744 ----- 

3745 Slices can be described with two notations: 

3746 

3747 * ``N:M`` -> standard python form, means including items N...(M-1). 

3748 * ``N-M`` -> include items N..M (closed endpoint). 

3749 """ 

3750 lines = self.history_manager.get_range_by_str(range_str, raw=raw) 

3751 text = "\n".join(x for _, _, x in lines) 

3752 

3753 # Skip the last line, as it's probably the magic that called this 

3754 if not range_str: 

3755 if "\n" not in text: 

3756 text = "" 

3757 else: 

3758 text = text[: text.rfind("\n")] 

3759 

3760 return text 

3761 

3762 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True, search_ns=False): 

3763 """Get a code string from history, file, url, or a string or macro. 

3764 

3765 This is mainly used by magic functions. 

3766 

3767 Parameters 

3768 ---------- 

3769 target : str 

3770 A string specifying code to retrieve. This will be tried respectively 

3771 as: ranges of input history (see %history for syntax), url, 

3772 corresponding .py file, filename, or an expression evaluating to a 

3773 string or Macro in the user namespace. 

3774 

3775 If empty string is given, returns complete history of current 

3776 session, without the last line. 

3777 

3778 raw : bool 

3779 If true (default), retrieve raw history. Has no effect on the other 

3780 retrieval mechanisms. 

3781 

3782 py_only : bool (default False) 

3783 Only try to fetch python code, do not try alternative methods to decode file 

3784 if unicode fails. 

3785 

3786 Returns 

3787 ------- 

3788 A string of code. 

3789 ValueError is raised if nothing is found, and TypeError if it evaluates 

3790 to an object of another type. In each case, .args[0] is a printable 

3791 message. 

3792 """ 

3793 code = self.extract_input_lines(target, raw=raw) # Grab history 

3794 if code: 

3795 return code 

3796 try: 

3797 if target.startswith(('http://', 'https://')): 

3798 return openpy.read_py_url(target, skip_encoding_cookie=skip_encoding_cookie) 

3799 except UnicodeDecodeError as e: 

3800 if not py_only : 

3801 # Deferred import 

3802 from urllib.request import urlopen 

3803 response = urlopen(target) 

3804 return response.read().decode('latin1') 

3805 raise ValueError(("'%s' seem to be unreadable.") % target) from e 

3806 

3807 potential_target = [target] 

3808 try : 

3809 potential_target.insert(0,get_py_filename(target)) 

3810 except IOError: 

3811 pass 

3812 

3813 for tgt in potential_target : 

3814 if os.path.isfile(tgt): # Read file 

3815 try : 

3816 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie) 

3817 except UnicodeDecodeError as e: 

3818 if not py_only : 

3819 with io_open(tgt,'r', encoding='latin1') as f : 

3820 return f.read() 

3821 raise ValueError(("'%s' seem to be unreadable.") % target) from e 

3822 elif os.path.isdir(os.path.expanduser(tgt)): 

3823 raise ValueError("'%s' is a directory, not a regular file." % target) 

3824 

3825 if search_ns: 

3826 # Inspect namespace to load object source 

3827 object_info = self.object_inspect(target, detail_level=1) 

3828 if object_info['found'] and object_info['source']: 

3829 return object_info['source'] 

3830 

3831 try: # User namespace 

3832 codeobj = eval(target, self.user_ns) 

3833 except Exception as e: 

3834 raise ValueError(("'%s' was not found in history, as a file, url, " 

3835 "nor in the user namespace.") % target) from e 

3836 

3837 if isinstance(codeobj, str): 

3838 return codeobj 

3839 elif isinstance(codeobj, Macro): 

3840 return codeobj.value 

3841 

3842 raise TypeError("%s is neither a string nor a macro." % target, 

3843 codeobj) 

3844 

3845 def _atexit_once(self): 

3846 """ 

3847 At exist operation that need to be called at most once. 

3848 Second call to this function per instance will do nothing. 

3849 """ 

3850 

3851 if not getattr(self, "_atexit_once_called", False): 

3852 self._atexit_once_called = True 

3853 # Clear all user namespaces to release all references cleanly. 

3854 self.reset(new_session=False) 

3855 # Close the history session (this stores the end time and line count) 

3856 # this must be *before* the tempfile cleanup, in case of temporary 

3857 # history db 

3858 self.history_manager.end_session() 

3859 self.history_manager = None 

3860 

3861 #------------------------------------------------------------------------- 

3862 # Things related to IPython exiting 

3863 #------------------------------------------------------------------------- 

3864 def atexit_operations(self): 

3865 """This will be executed at the time of exit. 

3866 

3867 Cleanup operations and saving of persistent data that is done 

3868 unconditionally by IPython should be performed here. 

3869 

3870 For things that may depend on startup flags or platform specifics (such 

3871 as having readline or not), register a separate atexit function in the 

3872 code that has the appropriate information, rather than trying to 

3873 clutter 

3874 """ 

3875 self._atexit_once() 

3876 

3877 # Cleanup all tempfiles and folders left around 

3878 for tfile in self.tempfiles: 

3879 try: 

3880 tfile.unlink() 

3881 self.tempfiles.remove(tfile) 

3882 except FileNotFoundError: 

3883 pass 

3884 del self.tempfiles 

3885 for tdir in self.tempdirs: 

3886 try: 

3887 tdir.rmdir() 

3888 self.tempdirs.remove(tdir) 

3889 except FileNotFoundError: 

3890 pass 

3891 del self.tempdirs 

3892 

3893 # Restore user's cursor 

3894 if hasattr(self, "editing_mode") and self.editing_mode == "vi": 

3895 sys.stdout.write("\x1b[0 q") 

3896 sys.stdout.flush() 

3897 

3898 def cleanup(self): 

3899 self.restore_sys_module_state() 

3900 

3901 

3902 # Overridden in terminal subclass to change prompts 

3903 def switch_doctest_mode(self, mode): 

3904 pass 

3905 

3906 

3907class InteractiveShellABC(metaclass=abc.ABCMeta): 

3908 """An abstract base class for InteractiveShell.""" 

3909 

3910InteractiveShellABC.register(InteractiveShell)