##// END OF EJS Templates
two-process interactive shell progress...
two-process interactive shell progress * execute payloads (e.g. page/pinfo output) are displayed and paged. * aborted replies don't crash frontend. * intermediate iopub is displayed as it comes * wait for kernel to start before printing first prompt. This gets the right number on the first prompt, and also avoids the log output from being drawn after the first prompt. * protect most of the interact block from keyboard interrupts, which could cause weird errors if ctrl-C was held for a while. * separate restart/wait prompt when kernel dies.

File last commit:

r5495:4f8891af
r5616:7431cd60
Show More
displayhook.py
265 lines | 10.1 KiB | text/x-python | PythonLexer
Brian Granger
Refactor of prompts and the displayhook....
r2781 # -*- coding: utf-8 -*-
"""Displayhook for IPython.
Brian Granger
Display system is fully working now....
r3278 This defines a callable class that IPython uses for `sys.displayhook`.
Brian Granger
Refactor of prompts and the displayhook....
r2781 Authors:
* Fernando Perez
* Brian Granger
Brian Granger
Display system is fully working now....
r3278 * Robert Kern
Brian Granger
Refactor of prompts and the displayhook....
r2781 """
#-----------------------------------------------------------------------------
Matthias BUSSONNIER
update copyright to 2011/20xx-2011...
r5390 # Copyright (C) 2008-2011 The IPython Development Team
Brian Granger
Refactor of prompts and the displayhook....
r2781 # Copyright (C) 2001-2007 Fernando Perez <fperez@colorado.edu>
#
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
import __builtin__
from IPython.config.configurable import Configurable
MinRK
io.Term.cin/out/err replaced by io.stdin/out/err...
r3800 from IPython.utils import io
Robert Kern
ENH: Allow configurability of the DefaultFormatter and the DisplayHook.
r3210 from IPython.utils.traitlets import Instance, List
Brian Granger
Refactor of prompts and the displayhook....
r2781 from IPython.utils.warn import warn
#-----------------------------------------------------------------------------
# Main displayhook class
#-----------------------------------------------------------------------------
Thomas Kluyver
Refactor prompt handling into new prompt manager.
r5495 # TODO: Move the various attributes (cache_size, [others now moved]). Some
# of these are also attributes of InteractiveShell. They should be on ONE object
# only and the other objects should ask that one object for their values.
Brian Granger
Refactor of prompts and the displayhook....
r2781
class DisplayHook(Configurable):
"""The custom IPython displayhook to replace sys.displayhook.
This class does many things, but the basic idea is that it is a callable
that gets called anytime user code returns a value.
"""
shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
Fernando Perez
Refactor multiline input and prompt management.
r3077
Thomas Kluyver
Refactor prompt handling into new prompt manager.
r5495 def __init__(self, shell=None, cache_size=1000, config=None):
Brian Granger
Refactor of prompts and the displayhook....
r2781 super(DisplayHook, self).__init__(shell=shell, config=config)
cache_size_min = 3
if cache_size <= 0:
self.do_full_cache = 0
cache_size = 0
elif cache_size < cache_size_min:
self.do_full_cache = 0
cache_size = 0
warn('caching was disabled (min value for cache size is %s).' %
cache_size_min,level=3)
else:
self.do_full_cache = 1
self.cache_size = cache_size
# we need a reference to the user-level namespace
self.shell = shell
Thomas Kluyver
Refactor prompt handling into new prompt manager.
r5495
Brian Granger
Refactor of prompts and the displayhook....
r2781 self._,self.__,self.___ = '','',''
# these are deliberately global:
to_user_ns = {'_':self._,'__':self.__,'___':self.___}
self.shell.user_ns.update(to_user_ns)
Fernando Perez
Refactor multiline input and prompt management.
r3077 @property
def prompt_count(self):
return self.shell.execution_count
Brian Granger
Refactor of prompts and the displayhook....
r2781 #-------------------------------------------------------------------------
# Methods used in __call__. Override these methods to modify the behavior
# of the displayhook.
#-------------------------------------------------------------------------
def check_for_underscore(self):
"""Check if the user has set the '_' variable by hand."""
# If something injected a '_' variable in __builtin__, delete
# ipython's automatic one so we don't clobber that. gettext() in
# particular uses _, so we need to stay away from it.
if '_' in __builtin__.__dict__:
try:
del self.shell.user_ns['_']
except KeyError:
pass
Brian Granger
Initial support in ipkernel for proper displayhook handling.
r2786 def quiet(self):
Brian Granger
Refactor of prompts and the displayhook....
r2781 """Should we silence the display hook because of ';'?"""
# do not print output if input ends in ';'
try:
MinRK
fix displayhook.quiet() check...
r3686 cell = self.shell.history_manager.input_hist_parsed[self.prompt_count]
if cell.rstrip().endswith(';'):
Brian Granger
Refactor of prompts and the displayhook....
r2781 return True
except IndexError:
# some uses of ipshellembed may fail here
pass
return False
Brian Granger
Initial support in ipkernel for proper displayhook handling.
r2786 def start_displayhook(self):
"""Start the displayhook, initializing resources."""
pass
Brian Granger
Refactor of prompts and the displayhook....
r2781 def write_output_prompt(self):
Brian Granger
Display system is fully working now....
r3278 """Write the output prompt.
The default implementation simply writes the prompt to
MinRK
io.Term.cin/out/err replaced by io.stdin/out/err...
r3800 ``io.stdout``.
Brian Granger
Display system is fully working now....
r3278 """
Brian Granger
Refactor of prompts and the displayhook....
r2781 # Use write, not print which adds an extra space.
Thomas Kluyver
Refactor prompt handling into new prompt manager.
r5495 io.stdout.write(self.shell.separate_out)
outprompt = self.shell.prompt_manager.render('out')
Brian Granger
Refactor of prompts and the displayhook....
r2781 if self.do_full_cache:
MinRK
io.Term.cin/out/err replaced by io.stdin/out/err...
r3800 io.stdout.write(outprompt)
Brian Granger
Refactor of prompts and the displayhook....
r2781
Brian Granger
Display system is fully working now....
r3278 def compute_format_data(self, result):
"""Compute format data of the object to be displayed.
Brian Granger
Refactor of prompts and the displayhook....
r2781
Brian Granger
Display system is fully working now....
r3278 The format data is a generalization of the :func:`repr` of an object.
In the default implementation the format data is a :class:`dict` of
key value pair where the keys are valid MIME types and the values
are JSON'able data structure containing the raw data for that MIME
type. It is up to frontends to determine pick a MIME to to use and
display that data in an appropriate manner.
Brian Granger
Addressing review comments....
r3286 This method only computes the format data for the object and should
NOT actually print or write that to a stream.
Brian Granger
Display system is fully working now....
r3278
Parameters
----------
result : object
Brian Granger
Addressing review comments....
r3286 The Python object passed to the display hook, whose format will be
Brian Granger
Display system is fully working now....
r3278 computed.
Returns
-------
format_data : dict
A :class:`dict` whose keys are valid MIME types and values are
JSON'able raw data for that MIME type. It is recommended that
all return values of this should always include the "text/plain"
MIME type representation of the object.
Brian Granger
Refactor of prompts and the displayhook....
r2781 """
Brian Granger
Final work on display system....
r3288 return self.shell.display_formatter.format(result)
Robert Kern
ENH: Extend the DisplayHook.compute_result_repr() and write_result_repr() methods to produce and consume the lists of extra formats. Use this capability in the ZMQ shell. Document the extension to the messaging format.
r3215
Brian Granger
Display system is fully working now....
r3278 def write_format_data(self, format_dict):
"""Write the format data dict to the frontend.
Brian Granger
Refactor of prompts and the displayhook....
r2781
Brian Granger
Display system is fully working now....
r3278 This default version of this method simply writes the plain text
MinRK
io.Term.cin/out/err replaced by io.stdin/out/err...
r3800 representation of the object to ``io.stdout``. Subclasses should
Brian Granger
Display system is fully working now....
r3278 override this method to send the entire `format_dict` to the
frontends.
Parameters
----------
format_dict : dict
The format dict for the object passed to `sys.displayhook`.
"""
Bernardo B. Marques
remove all trailling spaces
r4872 # We want to print because we want to always make sure we have a
Brian Granger
Refactor of prompts and the displayhook....
r2781 # newline, even if all the prompt separators are ''. This is the
# standard IPython behavior.
Brian Granger
Display system is fully working now....
r3278 result_repr = format_dict['text/plain']
Robert Kern
BUG: For multiline outputs, conditionally prepend a newline if necessary. Move this code to where we actually write the output. Frontends should be able to decide whether to use this or not.
r3224 if '\n' in result_repr:
# So that multi-line strings line up with the left column of
# the screen, instead of having the output prompt mess up
# their first line.
Thomas Kluyver
Refactor prompt handling into new prompt manager.
r5495 # We use the prompt template instead of the expanded prompt
Robert Kern
BUG: For multiline outputs, conditionally prepend a newline if necessary. Move this code to where we actually write the output. Frontends should be able to decide whether to use this or not.
r3224 # because the expansion may add ANSI escapes that will interfere
# with our ability to determine whether or not we should add
# a newline.
Thomas Kluyver
Refactor prompt handling into new prompt manager.
r5495 prompt_template = self.shell.prompt_manager.out_template
if prompt_template and not prompt_template.endswith('\n'):
Robert Kern
BUG: For multiline outputs, conditionally prepend a newline if necessary. Move this code to where we actually write the output. Frontends should be able to decide whether to use this or not.
r3224 # But avoid extraneous empty lines.
result_repr = '\n' + result_repr
MinRK
io.Term.cin/out/err replaced by io.stdin/out/err...
r3800 print >>io.stdout, result_repr
Brian Granger
Refactor of prompts and the displayhook....
r2781
def update_user_ns(self, result):
"""Update user_ns with various things like _, __, _1, etc."""
# Avoid recursive reference when displaying _oh/Out
if result is not self.shell.user_ns['_oh']:
if len(self.shell.user_ns['_oh']) >= self.cache_size and self.do_full_cache:
warn('Output cache limit (currently '+
`self.cache_size`+' entries) hit.\n'
'Flushing cache and resetting history counter...\n'
'The only history variables available will be _,__,___ and _1\n'
'with the current result.')
self.flush()
# Don't overwrite '_' and friends if '_' is in __builtin__ (otherwise
# we cause buggy behavior for things like gettext).
Fernando Perez
Improve docs and comments of some internal tools, and of testing code
r3297
Brian Granger
Refactor of prompts and the displayhook....
r2781 if '_' not in __builtin__.__dict__:
self.___ = self.__
self.__ = self._
self._ = result
Thomas Kluyver
Minor improvements to how namespaces are handled.
r5458 self.shell.push({'_':self._,
'__':self.__,
'___':self.___}, interactive=False)
Brian Granger
Refactor of prompts and the displayhook....
r2781
# hackish access to top-level namespace to create _1,_2... dynamically
to_main = {}
if self.do_full_cache:
new_result = '_'+`self.prompt_count`
to_main[new_result] = result
Thomas Kluyver
Minor improvements to how namespaces are handled.
r5458 self.shell.push(to_main, interactive=False)
Thomas Kluyver
Separate 'Out' in user_ns from the output history logging.
r3417 self.shell.user_ns['_oh'][self.prompt_count] = result
Brian Granger
Refactor of prompts and the displayhook....
r2781
Thomas Kluyver
Connect storing output in database to DisplayHook.log_output
r3392 def log_output(self, format_dict):
Brian Granger
Refactor of prompts and the displayhook....
r2781 """Log the output."""
if self.shell.logger.log_output:
Thomas Kluyver
Connect storing output in database to DisplayHook.log_output
r3392 self.shell.logger.log_write(format_dict['text/plain'], 'output')
Thomas Kluyver
History expects single output per cell, and doesn't use JSON to store them in the database.
r3741 self.shell.history_manager.output_hist_reprs[self.prompt_count] = \
format_dict['text/plain']
Brian Granger
Refactor of prompts and the displayhook....
r2781
def finish_displayhook(self):
"""Finish up all displayhook activities."""
Thomas Kluyver
Refactor prompt handling into new prompt manager.
r5495 io.stdout.write(self.shell.separate_out2)
MinRK
io.Term.cin/out/err replaced by io.stdin/out/err...
r3800 io.stdout.flush()
Brian Granger
Refactor of prompts and the displayhook....
r2781
def __call__(self, result=None):
"""Printing with history cache management.
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Refactor of prompts and the displayhook....
r2781 This is invoked everytime the interpreter needs to print, and is
activated by setting the variable sys.displayhook to it.
"""
self.check_for_underscore()
Brian Granger
Initial support in ipkernel for proper displayhook handling.
r2786 if result is not None and not self.quiet():
self.start_displayhook()
Brian Granger
Refactor of prompts and the displayhook....
r2781 self.write_output_prompt()
Brian Granger
Display system is fully working now....
r3278 format_dict = self.compute_format_data(result)
self.write_format_data(format_dict)
Brian Granger
Refactor of prompts and the displayhook....
r2781 self.update_user_ns(result)
Thomas Kluyver
Connect storing output in database to DisplayHook.log_output
r3392 self.log_output(format_dict)
Brian Granger
Refactor of prompts and the displayhook....
r2781 self.finish_displayhook()
def flush(self):
if not self.do_full_cache:
raise ValueError,"You shouldn't have reached the cache flush "\
"if full caching is not enabled!"
# delete auto-generated vars from global namespace
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Refactor of prompts and the displayhook....
r2781 for n in range(1,self.prompt_count + 1):
key = '_'+`n`
try:
del self.shell.user_ns[key]
except: pass
self.shell.user_ns['_oh'].clear()
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Implement hard reset with '%reset -h' call....
r3521 # Release our own references to objects:
self._, self.__, self.___ = '', '', ''
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Refactor of prompts and the displayhook....
r2781 if '_' not in __builtin__.__dict__:
self.shell.user_ns.update({'_':None,'__':None, '___':None})
import gc
Brian Granger
Display system is fully working now....
r3278 # TODO: Is this really needed?
gc.collect()
Brian Granger
Refactor of prompts and the displayhook....
r2781