##// END OF EJS Templates
updates per review...
updates per review - two-part protocol version (5.0) - default value for cursor_pos is end of code - docs, comment, and docstring touchups

File last commit:

r16665:c08bdde7
r16665:c08bdde7
Show More
ipkernel.py
854 lines | 31.9 KiB | text/x-python | PythonLexer
MinRK
make parent_header available from the Shell object
r13222 """An interactive kernel that talks to frontends over 0MQ."""
Fernando Perez
Added zmq kernel file which I forgot
r2598
MinRK
kernel_info versions are strings
r16566 # Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License.
Fernando Perez
Improve io.rprint* interface, unify usage in ipkernel....
r2856 from __future__ import print_function
epatters
Kernel subprocess parent polling is now implemented for Windows.
r2712
MinRK
support password in input_request
r16573 import getpass
Fernando Perez
Added zmq kernel file which I forgot
r2598 import sys
import time
import traceback
Omar Andres Zapata Mesa
logging implemented kernel's messages
r3294 import logging
MinRK
move apply serialization into zmq.serialize
r6788 import uuid
from datetime import datetime
Paul Ivanov
ignore KeyboardInterrupt until we can handle it
r5601 from signal import (
Thomas Kluyver
Remove unused imports in IPython.kernel
r11130 signal, default_int_handler, SIGINT
Paul Ivanov
ignore KeyboardInterrupt until we can handle it
r5601 )
MinRK
add ids to ipkernel
r6789
Fernando Perez
Added zmq kernel file which I forgot
r2598 import zmq
MinRK
use IOLoop in ipkernel...
r6790 from zmq.eventloop import ioloop
from zmq.eventloop.zmqstream import ZMQStream
Fernando Perez
Added zmq kernel file which I forgot
r2598
Brian Granger
First semi-working draft of ipython based kernel.
r2759 from IPython.config.configurable import Configurable
MinRK
use ROUTER/DEALER sockets for stdin...
r4952 from IPython.core.error import StdinNotImplementedError
Takafumi Arakaki
Move protocol_version to core.release
r9094 from IPython.core import release
Thomas Kluyver
Override input(), not raw_input(), for Qt console in Python 3.
r4772 from IPython.utils import py3compat
Thomas Kluyver
Replace references to unicode and basestring
r13353 from IPython.utils.py3compat import builtin_mod, unicode_type, string_types
Fernando Perez
Fix bug with info requests that were not json-safe....
r2948 from IPython.utils.jsonutil import json_clean
MinRK
update completion_ and objection_info_request...
r16580 from IPython.utils.tokenutil import token_at_cursor
MinRK
zmq kernels now started via newapp
r3970 from IPython.utils.traitlets import (
Thomas Kluyver
Remove unused imports in IPython.kernel
r11130 Any, Instance, Float, Dict, List, Set, Integer, Unicode,
MinRK
use QSocketNotifier, not poll...
r13583 Type, Bool,
MinRK
zmq kernels now started via newapp
r3970 )
MinRK
IPKernelApp now based on InteractiveShellApp
r3979
Thomas Kluyver
Use explicit relative imports...
r13347 from .serialize import serialize_object, unpack_apply_message
from .session import Session
from .zmqshell import ZMQInteractiveShell
Fernando Perez
Added zmq kernel file which I forgot
r2598
Omar Andres Zapata Mesa
added suggest from Fernando and Robert in logger
r3314
epatters
Kernel subprocess parent polling is now implemented for Windows.
r2712 #-----------------------------------------------------------------------------
Brian Granger
Separating kernel into smaller pieces.
r2754 # Main kernel class
epatters
Kernel subprocess parent polling is now implemented for Windows.
r2712 #-----------------------------------------------------------------------------
epatters
* Added a function for spawning a localhost kernel in a new process on random ports....
r2641
MinRK
kernel_info versions are strings
r16566 protocol_version = release.kernel_protocol_version
ipython_version = release.version
language_version = sys.version.split()[0]
Takafumi Arakaki
Add version_request/reply messaging protocol
r8830
Brian Granger
First semi-working draft of ipython based kernel.
r2759 class Kernel(Configurable):
epatters
* Restored functionality after major merge....
r2778 #---------------------------------------------------------------------------
# Kernel interface
#---------------------------------------------------------------------------
MinRK
enable %gui/%pylab magics in the Kernel...
r5153 # attribute to override with a GUI
eventloop = Any(None)
MinRK
use IOLoop in ipkernel...
r6790 def _eventloop_changed(self, name, old, new):
"""schedule call to eventloop from IOLoop"""
loop = ioloop.IOLoop.instance()
MinRK
flush replies when entering an eventloop...
r15232 loop.add_callback(self.enter_eventloop)
MinRK
enable %gui/%pylab magics in the Kernel...
r5153
Brian Granger
Moving and renaming in preparation of subclassing InteractiveShell....
r2760 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
epatters
BUG: GUI integration broken in the in-process kernel.
r8474 shell_class = Type(ZMQInteractiveShell)
epatters
* Restored functionality after major merge....
r2778 session = Instance(Session)
MinRK
%profile points to application value, not shell value...
r5261 profile_dir = Instance('IPython.core.profiledir.ProfileDir')
MinRK
use IOLoop in ipkernel...
r6790 shell_streams = List()
control_stream = Instance(ZMQStream)
MinRK
do not use ZMQStream for IOPub...
r6804 iopub_socket = Instance(zmq.Socket)
MinRK
use IOLoop in ipkernel...
r6790 stdin_socket = Instance(zmq.Socket)
MinRK
zmq kernels now started via newapp
r3970 log = Instance(logging.Logger)
MinRK
adjust embed_kernel signature...
r6571
MinRK
minor fixes to allow kernel to be re-entrant...
r6826 user_module = Any()
MinRK
adjust embed_kernel signature...
r6571 def _user_module_changed(self, name, old, new):
if self.shell is not None:
self.shell.user_module = new
Thomas Kluyver
Use Instance trait for user_ns instead of Dict....
r12476 user_ns = Instance(dict, args=None, allow_none=True)
MinRK
adjust embed_kernel signature...
r6571 def _user_ns_changed(self, name, old, new):
if self.shell is not None:
self.shell.user_ns = new
self.shell.init_user_ns()
Brian Granger
First semi-working draft of ipython based kernel.
r2759
MinRK
add ids to ipkernel
r6789 # identities:
int_id = Integer(-1)
ident = Unicode()
def _ident_default(self):
Thomas Kluyver
Replace references to unicode and basestring
r13353 return unicode_type(uuid.uuid4())
MinRK
add ids to ipkernel
r6789
Fernando Perez
Make exec/event loop times configurable. Set exec one to 500 microseconds.
r2940 # Private interface
MinRK
allow aborting tasks
r6785
MinRK
use QSocketNotifier, not poll...
r13583 _darwin_app_nap = Bool(True, config=True,
help="""Whether to use appnope for compatiblity with OS X App Nap.
Only affects OS X >= 10.9.
"""
)
MinRK
track parent in kernel...
r16574 # track associations with current request
_allow_stdin = Bool(False)
_parent_header = Dict()
_parent_ident = Any(b'')
Fernando Perez
Make exec/event loop times configurable. Set exec one to 500 microseconds.
r2940 # Time to sleep after flushing the stdout/err buffers in each execute
# cycle. While this introduces a hard limit on the minimal latency of the
# execute cycle, it helps prevent output synchronization problems for
# clients.
# Units are in seconds. The minimum zmq latency on local host is probably
# ~150 microseconds, set this to 500us for now. We may need to increase it
# a little if it's not enough after more interactive testing.
_execute_sleep = Float(0.0005, config=True)
# Frequency of the kernel's event loop.
# Units are in seconds, kernel subclasses for GUI toolkits may need to
# adapt to milliseconds.
_poll_interval = Float(0.05, config=True)
Fernando Perez
Added kernel shutdown support: messaging spec, zmq and client code ready....
r2972
# If the shutdown was requested over the network, we leave here the
# necessary reply message so it can be sent by our registered atexit
# handler. This ensures that the reply is only sent to clients truly at
# the end of our shutdown process (which happens after the underlying
# IPython shell's own shutdown).
_shutdown_message = None
Brian Granger
New connect_request message type added.
r3019
# This is a dict of port number that the kernel is listening on. It is set
# by record_ports and used by connect_request.
MinRK
zmq kernels now started via newapp
r3970 _recorded_ports = Dict()
Pietro Berkes
BUG: Solve 2to3 conversion error....
r8940
# A reference to the Python builtin 'raw_input' function.
# (i.e., __builtin__.raw_input for Python 2.7, builtins.input for Python 3)
_sys_raw_input = Any()
MinRK
support `input` in Python 2 kernels...
r12320 _sys_eval_input = Any()
Pietro Berkes
BUG: Solve 2to3 conversion error....
r8940
MinRK
allow aborting tasks
r6785 # set of aborted msg_ids
aborted = Set()
MinRK
zmq kernels now started via newapp
r3970
Omar Andres Zapata Mesa
logging implemented kernel's messages
r3294
Brian Granger
First semi-working draft of ipython based kernel.
r2759 def __init__(self, **kwargs):
super(Kernel, self).__init__(**kwargs)
Brian Granger
Initial support in ipkernel for proper displayhook handling.
r2786
# Initialize the InteractiveShell subclass
MinRK
use `parent=self` throughout IPython...
r11064 self.shell = self.shell_class.instance(parent=self,
MinRK
%profile points to application value, not shell value...
r5261 profile_dir = self.profile_dir,
Scott Tsai
zmq.Kernel: turn user_{module,ns} into traitlets
r6043 user_module = self.user_module,
user_ns = self.user_ns,
MinRK
zmqshell has handle on Kernel
r13199 kernel = self,
MinRK
%profile points to application value, not shell value...
r5261 )
Brian Granger
Initial support in ipkernel for proper displayhook handling.
r2786 self.shell.displayhook.session = self.session
MinRK
do not use ZMQStream for IOPub...
r6804 self.shell.displayhook.pub_socket = self.iopub_socket
MinRK
pyout -> execute_result...
r16568 self.shell.displayhook.topic = self._topic('execute_result')
Brian Granger
Mostly final version of display data....
r3277 self.shell.display_pub.session = self.session
MinRK
do not use ZMQStream for IOPub...
r6804 self.shell.display_pub.pub_socket = self.iopub_socket
MinRK
add data_pub messages...
r8102 self.shell.data_pub.session = self.session
self.shell.data_pub.pub_socket = self.iopub_socket
epatters
* Restored functionality after major merge....
r2778
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 # TMP - hack while developing
self.shell._reply_content = None
Fernando Perez
Added zmq kernel file which I forgot
r2598 # Build dict of handlers for message types
Bernardo B. Marques
remove all trailling spaces
r4872 msg_types = [ 'execute_request', 'complete_request',
MinRK
s/object_info_request/inspect_request
r16587 'inspect_request', 'history_request',
Takafumi Arakaki
Rename version_rep/req to kernel_info_rep/req
r8879 'kernel_info_request',
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 'connect_request', 'shutdown_request',
'apply_request',
]
MinRK
use IOLoop in ipkernel...
r6790 self.shell_handlers = {}
epatters
* Adding object_info_request support to prototype kernel....
r2612 for msg_type in msg_types:
MinRK
use IOLoop in ipkernel...
r6790 self.shell_handlers[msg_type] = getattr(self, msg_type)
MinRK
lazy-formatting logs in ipkernel...
r6783
MinRK
rename widget to comm
r13195 comm_msg_types = [ 'comm_open', 'comm_msg', 'comm_close' ]
comm_manager = self.shell.comm_manager
for msg_type in comm_msg_types:
self.shell_handlers[msg_type] = getattr(comm_manager, msg_type)
MinRK
add Kernel-side widgets
r13188
MinRK
fixup shutdown/exit now that we use IOLoop...
r6799 control_msg_types = msg_types + [ 'clear_request', 'abort_request' ]
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 self.control_handlers = {}
for msg_type in control_msg_types:
self.control_handlers[msg_type] = getattr(self, msg_type)
MinRK
add Kernel-side widgets
r13188
MinRK
use IOLoop in ipkernel...
r6790 def dispatch_control(self, msg):
"""dispatch control requests"""
idents,msg = self.session.feed_identities(msg, copy=False)
try:
msg = self.session.unserialize(msg, content=True, copy=False)
except:
self.log.error("Invalid Control Message", exc_info=True)
return
Brian E. Granger
Fixing bug in ipkernel.py related to msg_type refactoring.
r4237
MinRK
use IOLoop in ipkernel...
r6790 self.log.debug("Control received: %s", msg)
Brian E. Granger
Fixing bug in ipkernel.py related to msg_type refactoring.
r4237
MinRK
use IOLoop in ipkernel...
r6790 header = msg['header']
msg_id = header['msg_id']
msg_type = header['msg_type']
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
use IOLoop in ipkernel...
r6790 handler = self.control_handlers.get(msg_type, None)
if handler is None:
self.log.error("UNKNOWN CONTROL MESSAGE TYPE: %r", msg_type)
else:
MinRK
allow exceptions in handlers without crashing
r6792 try:
handler(self.control_stream, idents, msg)
except Exception:
self.log.error("Exception in control handler:", exc_info=True)
MinRK
use IOLoop in ipkernel...
r6790
def dispatch_shell(self, stream, msg):
"""dispatch shell requests"""
# flush control requests first
if self.control_stream:
self.control_stream.flush()
idents,msg = self.session.feed_identities(msg, copy=False)
try:
msg = self.session.unserialize(msg, content=True, copy=False)
except:
self.log.error("Invalid Message", exc_info=True)
return
header = msg['header']
msg_id = header['msg_id']
msg_type = msg['header']['msg_type']
Fernando Perez
Rework messaging to better conform to our spec....
r2926 # Print some info about this message and leave a '--->' marker, so it's
# easier to trace visually the message chain when debugging. Each
# handler prints its message at the end.
MinRK
lazy-formatting logs in ipkernel...
r6783 self.log.debug('\n*** MESSAGE TYPE:%s***', msg_type)
self.log.debug(' Content: %s\n --->\n ', msg['content'])
Fernando Perez
Rework messaging to better conform to our spec....
r2926
MinRK
allow aborting tasks
r6785 if msg_id in self.aborted:
self.aborted.remove(msg_id)
# is it safe to assume a msg_id will not be resubmitted?
reply_type = msg_type.split('_')[0] + '_reply'
status = {'status' : 'aborted'}
MinRK
migrate subheader usage to new metadata
r7957 md = {'engine' : self.ident}
md.update(status)
reply_msg = self.session.send(stream, reply_type, metadata=md,
MinRK
allow aborting tasks
r6785 content=status, parent=msg, ident=idents)
return
MinRK
use IOLoop in ipkernel...
r6790 handler = self.shell_handlers.get(msg_type, None)
Brian Granger
Initial GUI support in kernel.
r2868 if handler is None:
MinRK
use IOLoop in ipkernel...
r6790 self.log.error("UNKNOWN MESSAGE TYPE: %r", msg_type)
Brian Granger
Initial GUI support in kernel.
r2868 else:
MinRK
use IOLoop in ipkernel...
r6790 # ensure default_int_handler during handler call
sig = signal(SIGINT, default_int_handler)
MinRK
update completion_ and objection_info_request...
r16580 self.log.debug("%s: %s", msg_type, msg)
MinRK
use IOLoop in ipkernel...
r6790 try:
handler(stream, idents, msg)
MinRK
allow exceptions in handlers without crashing
r6792 except Exception:
self.log.error("Exception in message handler:", exc_info=True)
MinRK
use IOLoop in ipkernel...
r6790 finally:
signal(SIGINT, sig)
def enter_eventloop(self):
"""enter eventloop"""
MinRK
flush replies when entering an eventloop...
r15232 self.log.info("entering eventloop %s", self.eventloop)
for stream in self.shell_streams:
# flush any pending replies,
# which may be skipped by entering the eventloop
stream.flush(zmq.POLLOUT)
MinRK
use IOLoop in ipkernel...
r6790 # restore default_int_handler
signal(SIGINT, default_int_handler)
MinRK
upstream change preventing kernel exit on SIGINT during eventloop integration.
r6827 while self.eventloop is not None:
try:
self.eventloop(self)
except KeyboardInterrupt:
# Ctrl-C shouldn't crash the kernel
self.log.error("KeyboardInterrupt caught in kernel")
continue
else:
# eventloop exited cleanly, this means we should stop (right?)
self.eventloop = None
break
MinRK
demote enter/exit eventloop messages to INFO
r6882 self.log.info("exiting eventloop")
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
use IOLoop in ipkernel...
r6790 def start(self):
"""register dispatchers for streams"""
MinRK
minor fixes to allow kernel to be re-entrant...
r6826 self.shell.exit_now = False
MinRK
use IOLoop in ipkernel...
r6790 if self.control_stream:
self.control_stream.on_recv(self.dispatch_control, copy=False)
Fernando Perez
Implement exit/quit/Exit/Quit recognition....
r2950
MinRK
use IOLoop in ipkernel...
r6790 def make_dispatcher(stream):
def dispatcher(msg):
return self.dispatch_shell(stream, msg)
return dispatcher
epatters
* Restored functionality after major merge....
r2778
MinRK
use IOLoop in ipkernel...
r6790 for s in self.shell_streams:
s.on_recv(make_dispatcher(s), copy=False)
MinRK
publish 'starting' status when kernel starts
r10338
# publish idle status
self._publish_status('starting')
MinRK
use IOLoop in ipkernel...
r6790
def do_one_iteration(self):
"""step eventloop just once"""
if self.control_stream:
self.control_stream.flush()
for stream in self.shell_streams:
# handle at most one request per iteration
stream.flush(zmq.POLLIN, 1)
stream.flush(zmq.POLLOUT)
MinRK
enable %gui/%pylab magics in the Kernel...
r5153
Brian Granger
New connect_request message type added.
r3019
MinRK
zmq kernels now started via newapp
r3970 def record_ports(self, ports):
Brian Granger
New connect_request message type added.
r3019 """Record the ports that this kernel is using.
The creator of the Kernel instance must call this methods if they
want the :meth:`connect_request` method to return the port numbers.
"""
MinRK
zmq kernels now started via newapp
r3970 self._recorded_ports = ports
Brian Granger
New connect_request message type added.
r3019
epatters
* Restored functionality after major merge....
r2778 #---------------------------------------------------------------------------
# Kernel request handlers
#---------------------------------------------------------------------------
MinRK
fix subheaders for execute_reply and aborted messages...
r6807
MinRK
migrate subheader usage to new metadata
r7957 def _make_metadata(self, other=None):
"""init metadata dict, for execute/apply_reply"""
new_md = {
MinRK
fix subheaders for execute_reply and aborted messages...
r6807 'dependencies_met' : True,
'engine' : self.ident,
'started': datetime.now(),
}
MinRK
migrate subheader usage to new metadata
r7957 if other:
new_md.update(other)
return new_md
MinRK
fix subheaders for execute_reply and aborted messages...
r6807
MinRK
pyin -> execute_input
r16567 def _publish_execute_input(self, code, parent, execution_count):
"""Publish the code request on the iopub stream."""
Fernando Perez
Rework messaging to better conform to our spec....
r2926
MinRK
pyin -> execute_input
r16567 self.session.send(self.iopub_socket, u'execute_input',
MinRK
scrub: ident on iopub
r6794 {u'code':code, u'execution_count': execution_count},
MinRK
pyin -> execute_input
r16567 parent=parent, ident=self._topic('execute_input')
MinRK
scrub: ident on iopub
r6794 )
MinRK
publish busy/idle for apply_requests
r7491
def _publish_status(self, status, parent=None):
"""send status (busy/idle) on IOPub"""
MinRK
do not use ZMQStream for IOPub...
r6804 self.session.send(self.iopub_socket,
Fernando Perez
Minor cleanups after a check with pyflakes of the refactored code.
r5471 u'status',
MinRK
publish busy/idle for apply_requests
r7491 {u'execution_state': status},
MinRK
scrub: ident on iopub
r6794 parent=parent,
MinRK
enable topics on IOPub messages
r6795 ident=self._topic('status'),
MinRK
scrub: ident on iopub
r6794 )
MinRK
support password in input_request
r16573
MinRK
track parent in kernel...
r16574 def _forward_input(self, allow_stdin=False):
"""Forward raw_input and getpass to the current frontend.
via input_request
MinRK
support password in input_request
r16573 """
MinRK
track parent in kernel...
r16574 self._allow_stdin = allow_stdin
MinRK
support password in input_request
r16573
if py3compat.PY3:
self._sys_raw_input = builtin_mod.input
MinRK
track parent in kernel...
r16574 builtin_mod.input = self.raw_input
MinRK
support password in input_request
r16573 else:
self._sys_raw_input = builtin_mod.raw_input
self._sys_eval_input = builtin_mod.input
MinRK
track parent in kernel...
r16574 builtin_mod.raw_input = self.raw_input
builtin_mod.input = lambda prompt='': eval(self.raw_input(prompt))
MinRK
support password in input_request
r16573 self._save_getpass = getpass.getpass
MinRK
track parent in kernel...
r16574 getpass.getpass = self.getpass
def _restore_input(self):
"""Restore raw_input, getpass"""
MinRK
support password in input_request
r16573 if py3compat.PY3:
builtin_mod.input = self._sys_raw_input
else:
builtin_mod.raw_input = self._sys_raw_input
builtin_mod.input = self._sys_eval_input
Fernando Perez
Minor cleanups after a check with pyflakes of the refactored code.
r5471
MinRK
support password in input_request
r16573 getpass.getpass = self._save_getpass
MinRK
track parent in kernel...
r16574
def set_parent(self, ident, parent):
MinRK
updates per review...
r16665 """Set the current parent_header
MinRK
track parent in kernel...
r16574
MinRK
updates per review...
r16665 Side effects (IOPub messages) and replies are associated with
the request that caused them via the parent_header.
The parent identity is used to route input_request messages
on the stdin channel.
MinRK
track parent in kernel...
r16574 """
self._parent_ident = ident
self._parent_header = parent
self.shell.set_parent(parent)
MinRK
publish busy/idle for apply_requests
r7491 def execute_request(self, stream, ident, parent):
"""handle an execute_request"""
self._publish_status(u'busy', parent)
Fernando Perez
Added zmq kernel file which I forgot
r2598 try:
Fernando Perez
Rework messaging to better conform to our spec....
r2926 content = parent[u'content']
Thomas Kluyver
Fix ``%history -f foo`` in kernel....
r13893 code = py3compat.cast_unicode_py2(content[u'code'])
Bernardo B. Marques
remove all trailling spaces
r4872 silent = content[u'silent']
Jason Grout
Expose store_history to execute_request messages.
r7981 store_history = content.get(u'store_history', not silent)
Fernando Perez
Added zmq kernel file which I forgot
r2598 except:
MinRK
zmq kernels now started via newapp
r3970 self.log.error("Got bad msg: ")
MinRK
lazy-formatting logs in ipkernel...
r6783 self.log.error("%s", parent)
Fernando Perez
Added zmq kernel file which I forgot
r2598 return
MinRK
fix subheaders for execute_reply and aborted messages...
r6807
MinRK
migrate subheader usage to new metadata
r7957 md = self._make_metadata(parent['metadata'])
MinRK
track parent in kernel...
r16574
Fernando Perez
Rework messaging to better conform to our spec....
r2926 shell = self.shell # we'll need this a lot here
MinRK
track parent in kernel...
r16574
self._forward_input(content.get('allow_stdin', False))
Fernando Perez
Rework messaging to better conform to our spec....
r2926 # Set the parent message of the display hook and out streams.
MinRK
track parent in kernel...
r16574 self.set_parent(ident, parent)
Fernando Perez
Rework messaging to better conform to our spec....
r2926 # Re-broadcast our input for the benefit of listening clients, and
# start computing output
if not silent:
MinRK
pyin -> execute_input
r16567 self._publish_execute_input(code, parent, shell.execution_count)
Fernando Perez
Rework messaging to better conform to our spec....
r2926
reply_content = {}
MinRK
clear _reply_content cache before using it...
r15580 # FIXME: the shell calls the exception handler itself.
shell._reply_content = None
Fernando Perez
Added zmq kernel file which I forgot
r2598 try:
Jason Grout
Expose store_history to execute_request messages.
r7981 shell.run_cell(code, store_history=store_history, silent=silent)
Fernando Perez
Added zmq kernel file which I forgot
r2598 except:
Fernando Perez
Rework messaging to better conform to our spec....
r2926 status = u'error'
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 # FIXME: this code right now isn't being used yet by default,
Thomas Kluyver
Remove runlines method and calls to it.
r3752 # because the run_cell() call above directly fires off exception
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 # reporting. This code, therefore, is only active in the scenario
# where runlines itself has an unhandled exception. We need to
# uniformize this, for all exception construction to come from a
# single location in the codbase.
Fernando Perez
Added zmq kernel file which I forgot
r2598 etype, evalue, tb = sys.exc_info()
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 tb_list = traceback.format_exception(etype, evalue, tb)
Fernando Perez
Rework messaging to better conform to our spec....
r2926 reply_content.update(shell._showtraceback(etype, evalue, tb_list))
Fernando Perez
Added zmq kernel file which I forgot
r2598 else:
Fernando Perez
Rework messaging to better conform to our spec....
r2926 status = u'ok'
epatters
BUG: raw_input logic incorrect for in-process terminal frontend.
r8482 finally:
MinRK
track parent in kernel...
r16574 self._restore_input()
Fernando Perez
Rework messaging to better conform to our spec....
r2926
reply_content[u'status'] = status
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Refactor multiline input and prompt management.
r3077 # Return the execution counter so clients can display prompts
MinRK
use new run_cell(silent=True) instead of run_code in ipkernel
r6803 reply_content['execution_count'] = shell.execution_count - 1
Fernando Perez
Rework messaging to better conform to our spec....
r2926
# FIXME - fish exception info out of shell, possibly left there by
# runlines. We'll need to clean up this logic later.
if shell._reply_content is not None:
reply_content.update(shell._reply_content)
MinRK
add engine_info to execute errors
r7038 e_info = dict(engine_uuid=self.ident, engine_id=self.int_id, method='execute')
reply_content['engine_info'] = e_info
MinRK
cleanup shell._reply_content after use...
r3853 # reset after use
shell._reply_content = None
MinRK
log user tracebacks in the kernel (INFO-level)
r8579
if 'traceback' in reply_content:
self.log.info("Exception in execute request:\n%s", '\n'.join(reply_content['traceback']))
Fernando Perez
Rework messaging to better conform to our spec....
r2926
# At this point, we can tell whether the main code execution succeeded
MinRK
remove user_variables...
r16570 # or not. If it did, we proceed to evaluate user_expressions
Fernando Perez
Rework messaging to better conform to our spec....
r2926 if reply_content['status'] == 'ok':
reply_content[u'user_expressions'] = \
MinRK
allow exceptions in handlers without crashing
r6792 shell.user_expressions(content.get(u'user_expressions', {}))
Fernando Perez
Rework messaging to better conform to our spec....
r2926 else:
MinRK
remove user_variables...
r16570 # If there was an error, don't even try to compute expressions
Fernando Perez
Rework messaging to better conform to our spec....
r2926 reply_content[u'user_expressions'] = {}
Fernando Perez
Add support for simultaneous interactive and inline matplotlib plots....
r2987
# Payloads should be retrieved regardless of outcome, so we can both
# recover partial output (that could have been generated early in a
# block, before an error) and clear the payload system always.
reply_content[u'payload'] = shell.payload_manager.read_payload()
# Be agressive about clearing the payload because we don't want
# it to sit in memory until the next execute_request comes in.
shell.payload_manager.clear_payload()
Fernando Perez
Add missing flush of output streams on execute
r2938 # Flush output before sending the reply.
sys.stdout.flush()
sys.stderr.flush()
# FIXME: on rare occasions, the flush doesn't seem to make it to the
# clients... This seems to mitigate the problem, but we definitely need
# to better understand what's going on.
Fernando Perez
Make exec/event loop times configurable. Set exec one to 500 microseconds.
r2940 if self._execute_sleep:
time.sleep(self._execute_sleep)
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
kernel sends reply on the right side of std<x>.flush
r3333 # Send the reply.
MinRK
ensure replies from ipkernel are clean for JSON
r4782 reply_content = json_clean(reply_content)
MinRK
fix subheaders for execute_reply and aborted messages...
r6807
MinRK
migrate subheader usage to new metadata
r7957 md['status'] = reply_content['status']
MinRK
fix subheaders for execute_reply and aborted messages...
r6807 if reply_content['status'] == 'error' and \
reply_content['ename'] == 'UnmetDependency':
MinRK
migrate subheader usage to new metadata
r7957 md['dependencies_met'] = False
MinRK
fix subheaders for execute_reply and aborted messages...
r6807
MinRK
use IOLoop in ipkernel...
r6790 reply_msg = self.session.send(stream, u'execute_reply',
MinRK
migrate subheader usage to new metadata
r7957 reply_content, parent, metadata=md,
MinRK
fix subheaders for execute_reply and aborted messages...
r6807 ident=ident)
MinRK
lazy-formatting logs in ipkernel...
r6783 self.log.debug("%s", reply_msg)
MinRK
kernel sends reply on the right side of std<x>.flush
r3333
MinRK
use new run_cell(silent=True) instead of run_code in ipkernel
r6803 if not silent and reply_msg['content']['status'] == u'error':
self._abort_queues()
epatters
* Restored functionality after major merge....
r2778
MinRK
publish busy/idle for apply_requests
r7491 self._publish_status(u'idle', parent)
Brian Granger
Implementing kernel status messages.
r3035
MinRK
use IOLoop in ipkernel...
r6790 def complete_request(self, stream, ident, parent):
MinRK
update completion_ and objection_info_request...
r16580 content = parent['content']
code = content['code']
cursor_pos = content['cursor_pos']
txt, matches = self.shell.complete('', code, cursor_pos)
Fernando Perez
Improve io.rprint* interface, unify usage in ipkernel....
r2856 matches = {'matches' : matches,
MinRK
complete_reply has cursor_start and cursor_end, not matched_text
r16588 'cursor_end' : cursor_pos,
'cursor_start' : cursor_pos - len(txt),
'metadata' : {},
epatters
* Restored functionality after major merge....
r2778 'status' : 'ok'}
MinRK
ensure replies from ipkernel are clean for JSON
r4782 matches = json_clean(matches)
MinRK
use IOLoop in ipkernel...
r6790 completion_msg = self.session.send(stream, 'complete_reply',
epatters
* Restored functionality after major merge....
r2778 matches, parent, ident)
MinRK
lazy-formatting logs in ipkernel...
r6783 self.log.debug("%s", completion_msg)
epatters
* Restored functionality after major merge....
r2778
MinRK
s/object_info_request/inspect_request
r16587 def inspect_request(self, stream, ident, parent):
MinRK
add detail_level to object_info requests...
r6556 content = parent['content']
MinRK
update completion_ and objection_info_request...
r16580
name = token_at_cursor(content['code'], content['cursor_pos'])
info = self.shell.object_inspect(name)
reply_content = {'status' : 'ok'}
reply_content['data'] = data = {}
reply_content['metadata'] = {}
reply_content['found'] = info['found']
if info['found']:
info_text = self.shell.object_inspect_text(
name,
detail_level=content.get('detail_level', 0),
)
reply_content['data']['text/plain'] = info_text
Fernando Perez
Add function signature info to calltips....
r3051 # Before we send this object over, we scrub it for JSON usage
MinRK
update completion_ and objection_info_request...
r16580 reply_content = json_clean(reply_content)
MinRK
s/object_info_request/inspect_request
r16587 msg = self.session.send(stream, 'inspect_reply',
MinRK
update completion_ and objection_info_request...
r16580 reply_content, parent, ident)
MinRK
lazy-formatting logs in ipkernel...
r6783 self.log.debug("%s", msg)
epatters
Merge branch 'newkernel' of git://github.com/ellisonbg/ipython into qtfrontend...
r2795
MinRK
use IOLoop in ipkernel...
r6790 def history_request(self, stream, ident, parent):
Thomas Kluyver
Fix zmq request code for Python < 2.6.5
r3404 # We need to pull these out, as passing **kwargs doesn't work with
# unicode keys before Python 2.6.5.
Thomas Kluyver
Implement more general history_request for ZMQ protocol.
r3817 hist_access_type = parent['content']['hist_access_type']
epatters
* Added support for prompt and history requests to the kernel manager and Qt console frontend....
r2844 raw = parent['content']['raw']
Thomas Kluyver
Fix zmq request code for Python < 2.6.5
r3404 output = parent['content']['output']
Thomas Kluyver
Implement more general history_request for ZMQ protocol.
r3817 if hist_access_type == 'tail':
n = parent['content']['n']
hist = self.shell.history_manager.get_tail(n, raw=raw, output=output,
include_latest=True)
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Implement more general history_request for ZMQ protocol.
r3817 elif hist_access_type == 'range':
session = parent['content']['session']
start = parent['content']['start']
stop = parent['content']['stop']
hist = self.shell.history_manager.get_range(session, start, stop,
raw=raw, output=output)
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Implement more general history_request for ZMQ protocol.
r3817 elif hist_access_type == 'search':
Takafumi Arakaki
Make 'n' optional for search type history request
r8404 n = parent['content'].get('n')
Takafumi Arakaki
Be explicit about default value for unique
r9415 unique = parent['content'].get('unique', False)
Thomas Kluyver
Implement more general history_request for ZMQ protocol.
r3817 pattern = parent['content']['pattern']
Takafumi Arakaki
Add key "unique" to history_request protocol
r9413 hist = self.shell.history_manager.search(
pattern, raw=raw, output=output, n=n, unique=unique)
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Implement more general history_request for ZMQ protocol.
r3817 else:
hist = []
MinRK
Don't log complete contents of history replies, even in debug
r6057 hist = list(hist)
content = {'history' : hist}
MinRK
ensure replies from ipkernel are clean for JSON
r4782 content = json_clean(content)
MinRK
use IOLoop in ipkernel...
r6790 msg = self.session.send(stream, 'history_reply',
epatters
Merge branch 'newkernel' of git://github.com/ellisonbg/ipython into qtfrontend...
r2795 content, parent, ident)
MinRK
Don't log complete contents of history replies, even in debug
r6057 self.log.debug("Sending history reply with %i entries", len(hist))
Brian Granger
New connect_request message type added.
r3019
MinRK
use IOLoop in ipkernel...
r6790 def connect_request(self, stream, ident, parent):
Brian Granger
New connect_request message type added.
r3019 if self._recorded_ports is not None:
content = self._recorded_ports.copy()
else:
content = {}
MinRK
use IOLoop in ipkernel...
r6790 msg = self.session.send(stream, 'connect_reply',
Brian Granger
New connect_request message type added.
r3019 content, parent, ident)
MinRK
lazy-formatting logs in ipkernel...
r6783 self.log.debug("%s", msg)
Brian Granger
New connect_request message type added.
r3019
Takafumi Arakaki
Rename version_rep/req to kernel_info_rep/req
r8879 def kernel_info_request(self, stream, ident, parent):
Takafumi Arakaki
Add version_request/reply messaging protocol
r8830 vinfo = {
Takafumi Arakaki
Change version protocol according to the discussion in #2649
r8861 'protocol_version': protocol_version,
MinRK
add implementation and implementation_version to kernel_info_reply
r16584 'implementation': 'ipython',
'implementation_version': ipython_version,
Takafumi Arakaki
Change version protocol according to the discussion in #2649
r8861 'language_version': language_version,
'language': 'python',
MinRK
add banner to kernel_info_reply
r16582 'banner': self.shell.banner,
Takafumi Arakaki
Add version_request/reply messaging protocol
r8830 }
Takafumi Arakaki
Rename version_rep/req to kernel_info_rep/req
r8879 msg = self.session.send(stream, 'kernel_info_reply',
Takafumi Arakaki
Add version_request/reply messaging protocol
r8830 vinfo, parent, ident)
self.log.debug("%s", msg)
MinRK
use IOLoop in ipkernel...
r6790 def shutdown_request(self, stream, ident, parent):
Fernando Perez
Added kernel shutdown support: messaging spec, zmq and client code ready....
r2972 self.shell.exit_now = True
MinRK
fixup shutdown/exit now that we use IOLoop...
r6799 content = dict(status='ok')
content.update(parent['content'])
self.session.send(stream, u'shutdown_reply', content, parent, ident=ident)
# same content, but different msg_id for broadcasting on IOPub
Fernando Perez
Minor cleanups after a check with pyflakes of the refactored code.
r5471 self._shutdown_message = self.session.msg(u'shutdown_reply',
MinRK
fixup shutdown/exit now that we use IOLoop...
r6799 content, parent
MinRK
use IOLoop in ipkernel...
r6790 )
self._at_shutdown()
# call sys.exit after a short delay
MinRK
minor fixes to allow kernel to be re-entrant...
r6826 loop = ioloop.IOLoop.instance()
loop.add_timeout(time.time()+0.1, loop.stop)
Brian Granger
New connect_request message type added.
r3019
epatters
* Restored functionality after major merge....
r2778 #---------------------------------------------------------------------------
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 # Engine methods
#---------------------------------------------------------------------------
MinRK
use IOLoop in ipkernel...
r6790 def apply_request(self, stream, ident, parent):
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 try:
content = parent[u'content']
bufs = parent[u'buffers']
msg_id = parent['header']['msg_id']
except:
MinRK
lazy-formatting logs in ipkernel...
r6783 self.log.error("Got bad msg: %s", parent, exc_info=True)
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 return
MinRK
add topic to display publisher, and fix set_parent for apply_requests
r6834
MinRK
publish busy/idle for apply_requests
r7491 self._publish_status(u'busy', parent)
y-p
Don't die if stderr/stdout do not support set_parent() #2925...
r9556
MinRK
add topic to display publisher, and fix set_parent for apply_requests
r6834 # Set the parent message of the display hook and out streams.
MinRK
use IPython traceback formatting in apply requests
r7469 shell = self.shell
MinRK
add ZMQShell.set_parent...
r13200 shell.set_parent(parent)
MinRK
add topic to display publisher, and fix set_parent for apply_requests
r6834
MinRK
migrate subheader usage to new metadata
r7957 md = self._make_metadata(parent['metadata'])
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 try:
MinRK
use IPython traceback formatting in apply requests
r7469 working = shell.user_ns
MinRK
use shell namespaces in apply_request
r6796
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 prefix = "_"+str(msg_id).replace("-","")+"_"
f,args,kwargs = unpack_apply_message(bufs, working, copy=False)
fname = getattr(f, '__name__', 'f')
fname = prefix+"f"
argname = prefix+"args"
kwargname = prefix+"kwargs"
resultname = prefix+"result"
ns = { fname : f, argname : args, kwargname : kwargs , resultname : None }
# print ns
working.update(ns)
MinRK
use shell namespaces in apply_request
r6796 code = "%s = %s(*%s,**%s)" % (resultname, fname, argname, kwargname)
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 try:
Thomas Kluyver
Fix exec statements for Py 3...
r13350 exec(code, shell.user_global_ns, shell.user_ns)
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 result = working.get(resultname)
finally:
Thomas Kluyver
Remove uses of iterkeys
r13360 for key in ns:
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 working.pop(key)
MinRK
allow configuration of item/buffer thresholds
r8033 result_buf = serialize_object(result,
buffer_threshold=self.session.buffer_threshold,
item_threshold=self.session.item_threshold,
)
MinRK
better serialization for parallel code...
r7967
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 except:
MinRK
use IPython traceback formatting in apply requests
r7469 # invoke IPython traceback formatting
shell.showtraceback()
# FIXME - fish exception info out of shell, possibly left there by
# run_code. We'll need to clean up this logic later.
reply_content = {}
if shell._reply_content is not None:
reply_content.update(shell._reply_content)
e_info = dict(engine_uuid=self.ident, engine_id=self.int_id, method='apply')
reply_content['engine_info'] = e_info
# reset after use
shell._reply_content = None
MinRK
pyerr -> error
r16569 self.session.send(self.iopub_socket, u'error', reply_content, parent=parent,
ident=self._topic('error'))
MinRK
log user tracebacks in the kernel (INFO-level)
r8579 self.log.info("Exception in apply request:\n%s", '\n'.join(reply_content['traceback']))
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 result_buf = []
MinRK
use IPython traceback formatting in apply requests
r7469 if reply_content['ename'] == 'UnmetDependency':
MinRK
migrate subheader usage to new metadata
r7957 md['dependencies_met'] = False
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 else:
reply_content = {'status' : 'ok'}
# put 'ok'/'error' status in header, for scheduler introspection:
MinRK
migrate subheader usage to new metadata
r7957 md['status'] = reply_content['status']
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782
# flush i/o
sys.stdout.flush()
sys.stderr.flush()
MinRK
lazy-formatting logs in ipkernel...
r6783
MinRK
use IOLoop in ipkernel...
r6790 reply_msg = self.session.send(stream, u'apply_reply', reply_content,
MinRK
migrate subheader usage to new metadata
r7957 parent=parent, ident=ident,buffers=result_buf, metadata=md)
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782
MinRK
publish busy/idle for apply_requests
r7491 self._publish_status(u'idle', parent)
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 #---------------------------------------------------------------------------
# Control messages
#---------------------------------------------------------------------------
MinRK
use IOLoop in ipkernel...
r6790 def abort_request(self, stream, ident, parent):
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 """abort a specifig msg by id"""
msg_ids = parent['content'].get('msg_ids', None)
Thomas Kluyver
Replace references to unicode and basestring
r13353 if isinstance(msg_ids, string_types):
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 msg_ids = [msg_ids]
if not msg_ids:
self.abort_queues()
for mid in msg_ids:
self.aborted.add(str(mid))
content = dict(status='ok')
MinRK
use IOLoop in ipkernel...
r6790 reply_msg = self.session.send(stream, 'abort_reply', content=content,
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 parent=parent, ident=ident)
MinRK
lazy-formatting logs in ipkernel...
r6783 self.log.debug("%s", reply_msg)
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782
MinRK
use IOLoop in ipkernel...
r6790 def clear_request(self, stream, idents, parent):
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 """Clear our namespace."""
MinRK
use shell namespaces in apply_request
r6796 self.shell.reset(False)
MinRK
use IOLoop in ipkernel...
r6790 msg = self.session.send(stream, 'clear_reply', ident=idents, parent=parent,
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 content = dict(status='ok'))
#---------------------------------------------------------------------------
epatters
* Restored functionality after major merge....
r2778 # Protected interface
#---------------------------------------------------------------------------
Fernando Perez
Added zmq kernel file which I forgot
r2598
MinRK
use shell namespaces in apply_request
r6796 def _wrap_exception(self, method=None):
# import here, because _wrap_exception is only used in parallel,
# and parallel has higher min pyzmq version
from IPython.parallel.error import wrap_exception
e_info = dict(engine_uuid=self.ident, engine_id=self.int_id, method=method)
content = wrap_exception(e_info)
return content
MinRK
enable topics on IOPub messages
r6795 def _topic(self, topic):
"""prefixed topic for IOPub messages"""
if self.int_id >= 0:
base = "engine.%i" % self.int_id
else:
base = "kernel.%s" % self.ident
return py3compat.cast_bytes("%s.%s" % (base, topic))
MinRK
allow aborting tasks
r6785 def _abort_queues(self):
MinRK
use IOLoop in ipkernel...
r6790 for stream in self.shell_streams:
if stream:
self._abort_queue(stream)
MinRK
allow aborting tasks
r6785
MinRK
use IOLoop in ipkernel...
r6790 def _abort_queue(self, stream):
MinRK
fixup shutdown/exit now that we use IOLoop...
r6799 poller = zmq.Poller()
poller.register(stream.socket, zmq.POLLIN)
epatters
* Restored functionality after major merge....
r2778 while True:
MinRK
use IOLoop in ipkernel...
r6790 idents,msg = self.session.recv(stream, zmq.NOBLOCK, content=True)
MinRK
all sends/recvs now via Session.send/recv....
r3269 if msg is None:
MinRK
allow aborting tasks
r6785 return
Fernando Perez
Merge branch 'kernel-logging' of https://github.com/omazapa/ipython into omazapa-kernel-logging...
r3322
MinRK
allow aborting tasks
r6785 self.log.info("Aborting:")
self.log.info("%s", msg)
Brian E. Granger
Fixing code to assume msg_type and msg_id are top-level....
r4230 msg_type = msg['header']['msg_type']
epatters
* Restored functionality after major merge....
r2778 reply_type = msg_type.split('_')[0] + '_reply'
MinRK
fix subheaders for execute_reply and aborted messages...
r6807
status = {'status' : 'aborted'}
MinRK
migrate subheader usage to new metadata
r7957 md = {'engine' : self.ident}
md.update(status)
MinRK
fix meatadata typo
r7978 reply_msg = self.session.send(stream, reply_type, metadata=md,
MinRK
fix subheaders for execute_reply and aborted messages...
r6807 content=status, parent=msg, ident=idents)
MinRK
lazy-formatting logs in ipkernel...
r6783 self.log.debug("%s", reply_msg)
epatters
* Restored functionality after major merge....
r2778 # We need to wait a bit for requests to come in. This can probably
# be set shorter for true asynchronous clients.
MinRK
fixup shutdown/exit now that we use IOLoop...
r6799 poller.poll(50)
MinRK
allow aborting tasks
r6785
epatters
* Restored functionality after major merge....
r2778
MinRK
use ROUTER/DEALER sockets for stdin...
r4952 def _no_raw_input(self):
Fernando Perez
Minor cleanups after a check with pyflakes of the refactored code.
r5471 """Raise StdinNotImplentedError if active frontend doesn't support
stdin."""
raise StdinNotImplementedError("raw_input was called, but this "
"frontend does not support stdin.")
MinRK
support password in input_request
r16573
MinRK
track parent in kernel...
r16574 def getpass(self, prompt=''):
"""Forward getpass to frontends
Raises
------
StdinNotImplentedError if active frontend doesn't support stdin.
"""
if not self._allow_stdin:
raise StdinNotImplementedError(
"getpass was called, but this frontend does not support input requests."
)
return self._input_request(prompt,
self._parent_ident,
self._parent_header,
password=True,
)
def raw_input(self, prompt=''):
"""Forward raw_input to frontends
Raises
------
StdinNotImplentedError if active frontend doesn't support stdin.
"""
if not self._allow_stdin:
raise StdinNotImplementedError(
"raw_input was called, but this frontend does not support input requests."
)
return self._input_request(prompt,
self._parent_ident,
self._parent_header,
password=False,
)
def _input_request(self, prompt, ident, parent, password=False):
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 # Flush output before making the request.
sys.stderr.flush()
sys.stdout.flush()
MinRK
flush stale messages on stdin channel prior to raw_input
r10367 # flush the stdin socket, to purge stale replies
while True:
try:
self.stdin_socket.recv_multipart(zmq.NOBLOCK)
except zmq.ZMQError as e:
if e.errno == zmq.EAGAIN:
break
else:
raise
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 # Send the input request.
MinRK
support password in input_request
r16573 content = json_clean(dict(prompt=prompt, password=password))
Fernando Perez
Minor cleanups after a check with pyflakes of the refactored code.
r5471 self.session.send(self.stdin_socket, u'input_request', content, parent,
ident=ident)
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730
# Await a response.
MinRK
gracefully handle bad messages in ipkernel...
r4521 while True:
try:
ident, reply = self.session.recv(self.stdin_socket, 0)
except Exception:
self.log.warn("Invalid Message:", exc_info=True)
MinRK
re-raise KeyboardInterrupt in raw_input...
r11706 except KeyboardInterrupt:
# re-raise KeyboardInterrupt, to truncate traceback
raise KeyboardInterrupt
MinRK
gracefully handle bad messages in ipkernel...
r4521 else:
break
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 try:
MinRK
ensure raw_input returns str in zmq shell...
r11154 value = py3compat.unicode_to_str(reply['content']['value'])
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 except:
MinRK
track parent in kernel...
r16574 self.log.error("Bad input_reply: %s", parent)
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 value = ''
MinRK
[termconsole] raw_input improvements...
r5622 if value == '\x04':
# EOF
raise EOFError
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 return value
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Added kernel shutdown support: messaging spec, zmq and client code ready....
r2972 def _at_shutdown(self):
"""Actions taken at shutdown by the kernel, called by python's atexit.
"""
# io.rprint("Kernel at_shutdown") # dbg
if self._shutdown_message is not None:
MinRK
do not use ZMQStream for IOPub...
r6804 self.session.send(self.iopub_socket, self._shutdown_message, ident=self._topic('shutdown'))
MinRK
lazy-formatting logs in ipkernel...
r6783 self.log.debug("%s", self._shutdown_message)
MinRK
do not use ZMQStream for IOPub...
r6804 [ s.flush(zmq.POLLOUT) for s in self.shell_streams ]
Fernando Perez
Added kernel shutdown support: messaging spec, zmq and client code ready....
r2972