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