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