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