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