##// END OF EJS Templates
fix format of LazyEvaluate based on *actual* review
fix format of LazyEvaluate based on *actual* review

File last commit:

r7491:5f7fdbd9
r7578:67235329
Show More
ipkernel.py
921 lines | 34.2 KiB | text/x-python | PythonLexer
Fernando Perez
Added zmq kernel file which I forgot
r2598 #!/usr/bin/env python
"""A simple interactive kernel that talks to a frontend over 0MQ.
Things to do:
* Implement `set_parent` logic. Right before doing exec, the Kernel should
call set_parent on all the PUB objects with the message about to be executed.
* Implement random port and security key logic.
* Implement control messages.
* Implement event loop and poll version.
"""
epatters
Kernel subprocess parent polling is now implemented for Windows.
r2712 #-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
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
add ids to ipkernel
r6789 # Standard library imports
Fernando Perez
Added zmq kernel file which I forgot
r2598 import __builtin__
Fernando Perez
Added kernel shutdown support: messaging spec, zmq and client code ready....
r2972 import atexit
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 (
MinRK
use IOLoop in ipkernel...
r6790 signal, getsignal, default_int_handler, SIGINT, SIG_IGN
Paul Ivanov
ignore KeyboardInterrupt until we can handle it
r5601 )
MinRK
add ids to ipkernel
r6789
# System library imports
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
MinRK
add ids to ipkernel
r6789 # Local imports
Brian Granger
First semi-working draft of ipython based kernel.
r2759 from IPython.config.configurable import Configurable
MinRK
revert embed_kernel changes that implied bind_kernel in engine
r6892 from IPython.config.application import boolean_flag, catch_config_error
MinRK
rename core.newapplication -> core.application
r4023 from IPython.core.application import ProfileDir
MinRK
use ROUTER/DEALER sockets for stdin...
r4952 from IPython.core.error import StdinNotImplementedError
MinRK
IPKernelApp now based on InteractiveShellApp
r3979 from IPython.core.shellapp import (
InteractiveShellApp, shell_flags, shell_aliases
)
Fernando Perez
Improve io.rprint* interface, unify usage in ipkernel....
r2856 from IPython.utils import io
Thomas Kluyver
Override input(), not raw_input(), for Qt console in Python 3.
r4772 from IPython.utils import py3compat
MinRK
adjust embed_kernel signature...
r6571 from IPython.utils.frame import extract_module_locals
Fernando Perez
Fix bug with info requests that were not json-safe....
r2948 from IPython.utils.jsonutil import json_clean
MinRK
zmq kernels now started via newapp
r3970 from IPython.utils.traitlets import (
MinRK
add ids to ipkernel
r6789 Any, Instance, Float, Dict, CaselessStrEnum, List, Set, Integer, Unicode
MinRK
zmq kernels now started via newapp
r3970 )
MinRK
IPKernelApp now based on InteractiveShellApp
r3979
MinRK
zmq kernels now started via newapp
r3970 from entry_point import base_launch_kernel
from kernelapp import KernelApp, kernel_flags, kernel_aliases
MinRK
move apply serialization into zmq.serialize
r6788 from serialize import serialize_object, unpack_apply_message
epatters
* Restored functionality after major merge....
r2778 from session import Session, Message
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
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()
loop.add_timeout(time.time()+0.1, 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
* 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
user_ns = Dict(default_value=None)
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):
return unicode(uuid.uuid4())
Fernando Perez
Make exec/event loop times configurable. Set exec one to 500 microseconds.
r2940 # Private interface
MinRK
allow aborting tasks
r6785
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()
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
%profile points to application value, not shell value...
r5261 self.shell = ZMQInteractiveShell.instance(config=self.config,
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
%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
fix topic on displayhook in ZMQShell
r6814 self.shell.displayhook.topic = self._topic('pyout')
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
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',
Thomas Kluyver
Implement more general history_request for ZMQ protocol.
r3817 'object_info_request', 'history_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
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
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
fix subheaders for execute_reply and aborted messages...
r6807 sub = {'engine' : self.ident}
sub.update(status)
reply_msg = self.session.send(stream, reply_type, subheader=sub,
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)
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
demote enter/exit eventloop messages to INFO
r6882 self.log.info("entering eventloop")
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")
MinRK
use IOLoop in ipkernel...
r6790 # if eventloop exits, IOLoop should stop
ioloop.IOLoop.instance().stop()
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)
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
def _make_subheader(self):
"""init subheader dict, for execute/apply_reply"""
return {
'dependencies_met' : True,
'engine' : self.ident,
'started': datetime.now(),
}
Paul Ivanov
include execution_count in pyin msgs, closes #1619
r6542 def _publish_pyin(self, code, parent, execution_count):
Fernando Perez
Rework messaging to better conform to our spec....
r2926 """Publish the code request on the pyin stream."""
MinRK
do not use ZMQStream for IOPub...
r6804 self.session.send(self.iopub_socket, u'pyin',
MinRK
scrub: ident on iopub
r6794 {u'code':code, u'execution_count': execution_count},
MinRK
enable topics on IOPub messages
r6795 parent=parent, ident=self._topic('pyin')
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 )
Fernando Perez
Minor cleanups after a check with pyflakes of the refactored code.
r5471
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']
code = content[u'code']
Bernardo B. Marques
remove all trailling spaces
r4872 silent = content[u'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
sub = self._make_subheader()
epatters
Greatly increased frontend performance by improving kernel stdout/stderr buffering.
r2722
Fernando Perez
Rework messaging to better conform to our spec....
r2926 shell = self.shell # we'll need this a lot here
Bernardo B. Marques
remove all trailling spaces
r4872 # Replace raw_input. Note that is not sufficient to replace
Fernando Perez
Rework messaging to better conform to our spec....
r2926 # raw_input in the user namespace.
MinRK
use ROUTER/DEALER sockets for stdin...
r4952 if content.get('allow_stdin', False):
raw_input = lambda prompt='': self._raw_input(prompt, ident, parent)
else:
raw_input = lambda prompt='' : self._no_raw_input()
Thomas Kluyver
Override input(), not raw_input(), for Qt console in Python 3.
r4772 if py3compat.PY3:
__builtin__.input = raw_input
else:
__builtin__.raw_input = raw_input
Fernando Perez
Rework messaging to better conform to our spec....
r2926
# Set the parent message of the display hook and out streams.
shell.displayhook.set_parent(parent)
Brian Granger
Mostly final version of display data....
r3277 shell.display_pub.set_parent(parent)
Fernando Perez
Rework messaging to better conform to our spec....
r2926 sys.stdout.set_parent(parent)
sys.stderr.set_parent(parent)
# Re-broadcast our input for the benefit of listening clients, and
# start computing output
if not silent:
Paul Ivanov
include execution_count in pyin msgs, closes #1619
r6542 self._publish_pyin(code, parent, shell.execution_count)
Fernando Perez
Rework messaging to better conform to our spec....
r2926
reply_content = {}
Fernando Perez
Added zmq kernel file which I forgot
r2598 try:
MinRK
use new run_cell(silent=True) instead of run_code in ipkernel
r6803 # FIXME: the shell calls the exception handler itself.
shell.run_cell(code, store_history=not silent, 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'
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
Fernando Perez
Rework messaging to better conform to our spec....
r2926
# At this point, we can tell whether the main code execution succeeded
# or not. If it did, we proceed to evaluate user_variables/expressions
if reply_content['status'] == 'ok':
reply_content[u'user_variables'] = \
MinRK
allow exceptions in handlers without crashing
r6792 shell.user_variables(content.get(u'user_variables', []))
Fernando Perez
Rework messaging to better conform to our spec....
r2926 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:
# If there was an error, don't even try to compute variables or
# expressions
reply_content[u'user_variables'] = {}
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
sub['status'] = reply_content['status']
if reply_content['status'] == 'error' and \
reply_content['ename'] == 'UnmetDependency':
sub['dependencies_met'] = False
MinRK
use IOLoop in ipkernel...
r6790 reply_msg = self.session.send(stream, u'execute_reply',
MinRK
fix subheaders for execute_reply and aborted messages...
r6807 reply_content, parent, subheader=sub,
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):
Fernando Perez
Improve io.rprint* interface, unify usage in ipkernel....
r2856 txt, matches = self._complete(parent)
matches = {'matches' : matches,
'matched_text' : txt,
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
use IOLoop in ipkernel...
r6790 def object_info_request(self, stream, ident, parent):
MinRK
add detail_level to object_info requests...
r6556 content = parent['content']
object_info = self.shell.object_inspect(content['oname'],
detail_level = content.get('detail_level', 0)
)
Fernando Perez
Add function signature info to calltips....
r3051 # Before we send this object over, we scrub it for JSON usage
oinfo = json_clean(object_info)
MinRK
use IOLoop in ipkernel...
r6790 msg = self.session.send(stream, 'object_info_reply',
Fernando Perez
Fix bug with info requests that were not json-safe....
r2948 oinfo, 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':
pattern = parent['content']['pattern']
Fernando Perez
Minor cleanups after a check with pyflakes of the refactored code.
r5471 hist = self.shell.history_manager.search(pattern, raw=raw,
output=output)
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
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)
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
shell.displayhook.set_parent(parent)
shell.display_pub.set_parent(parent)
MinRK
add topic to display publisher, and fix set_parent for apply_requests
r6834 sys.stdout.set_parent(parent)
sys.stderr.set_parent(parent)
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 # pyin_msg = self.session.msg(u'pyin',{u'code':code}, parent=parent)
MinRK
do not use ZMQStream for IOPub...
r6804 # self.iopub_socket.send(pyin_msg)
# self.session.send(self.iopub_socket, u'pyin', {u'code':code},parent=parent)
MinRK
fix subheaders for execute_reply and aborted messages...
r6807 sub = self._make_subheader()
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:
MinRK
use IPython traceback formatting in apply requests
r7469 exec code in shell.user_global_ns, shell.user_ns
MinRK
drop in apply_request handler in zmq.ipkernel...
r6782 result = working.get(resultname)
finally:
for key in ns.iterkeys():
working.pop(key)
packed_result,buf = serialize_object(result)
result_buf = [packed_result]+buf
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
self.session.send(self.iopub_socket, u'pyerr', reply_content, parent=parent,
MinRK
enable topics on IOPub messages
r6795 ident=self._topic('pyerr'))
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
drop in apply_request handler in zmq.ipkernel...
r6782 sub['dependencies_met'] = False
else:
reply_content = {'status' : 'ok'}
# put 'ok'/'error' status in header, for scheduler introspection:
sub['status'] = reply_content['status']
# 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
drop in apply_request handler in zmq.ipkernel...
r6782 parent=parent, ident=ident,buffers=result_buf, subheader=sub)
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)
if isinstance(msg_ids, basestring):
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
enable topics on IOPub messages
r6795
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'}
sub = {'engine' : self.ident}
sub.update(status)
reply_msg = self.session.send(stream, reply_type, subheader=sub,
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
use ROUTER/DEALER sockets for stdin...
r4952
epatters
* Restored functionality after major merge....
r2778 def _raw_input(self, prompt, ident, parent):
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 # Flush output before making the request.
sys.stderr.flush()
sys.stdout.flush()
# Send the input request.
MinRK
ensure replies from ipkernel are clean for JSON
r4782 content = json_clean(dict(prompt=prompt))
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)
else:
break
epatters
* Change input mechanism: replace raw_input instead of stdin....
r2730 try:
value = reply['content']['value']
except:
MinRK
zmq kernels now started via newapp
r3970 self.log.error("Got bad raw_input reply: ")
MinRK
lazy-formatting logs in ipkernel...
r6783 self.log.error("%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
epatters
* Restored functionality after major merge....
r2778 def _complete(self, msg):
Fernando Perez
Multiple improvements to tab completion....
r2839 c = msg['content']
try:
cpos = int(c['cursor_pos'])
except:
# If we don't get something that we can convert to an integer, at
Fernando Perez
Improve io.rprint* interface, unify usage in ipkernel....
r2856 # least attempt the completion guessing the cursor is at the end of
# the text, if there's any, and otherwise of the line
Fernando Perez
Multiple improvements to tab completion....
r2839 cpos = len(c['text'])
Fernando Perez
Improve io.rprint* interface, unify usage in ipkernel....
r2856 if cpos==0:
cpos = len(c['line'])
Fernando Perez
Multiple improvements to tab completion....
r2839 return self.shell.complete(c['text'], c['line'], cpos)
Fernando Perez
Added zmq kernel file which I forgot
r2598
epatters
* Restored functionality after major merge....
r2778 def _object_info(self, context):
symbol, leftover = self._symbol_from_context(context)
epatters
* Adding object_info_request support to prototype kernel....
r2612 if symbol is not None and not leftover:
doc = getattr(symbol, '__doc__', '')
else:
doc = ''
object_info = dict(docstring = doc)
return object_info
epatters
* Restored functionality after major merge....
r2778 def _symbol_from_context(self, context):
epatters
* Adding object_info_request support to prototype kernel....
r2612 if not context:
return None, context
base_symbol_string = context[0]
Brian Granger
First semi-working draft of ipython based kernel.
r2759 symbol = self.shell.user_ns.get(base_symbol_string, None)
epatters
* Adding object_info_request support to prototype kernel....
r2612 if symbol is None:
symbol = __builtin__.__dict__.get(base_symbol_string, None)
if symbol is None:
return None, context
context = context[1:]
for i, name in enumerate(context):
new_symbol = getattr(symbol, name, None)
if new_symbol is None:
return symbol, context[i:]
else:
symbol = new_symbol
return symbol, []
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
epatters
Kernel subprocess parent polling is now implemented for Windows.
r2712 #-----------------------------------------------------------------------------
MinRK
zmq kernels now started via newapp
r3970 # Aliases and Flags for the IPKernelApp
epatters
Kernel subprocess parent polling is now implemented for Windows.
r2712 #-----------------------------------------------------------------------------
MinRK
zmq kernels now started via newapp
r3970 flags = dict(kernel_flags)
MinRK
IPKernelApp now based on InteractiveShellApp
r3979 flags.update(shell_flags)
MinRK
zmq kernels now started via newapp
r3970
addflag = lambda *args: flags.update(boolean_flag(*args))
flags['pylab'] = (
{'IPKernelApp' : {'pylab' : 'auto'}},
"""Pre-load matplotlib and numpy for interactive use with
the default matplotlib backend."""
)
aliases = dict(kernel_aliases)
MinRK
IPKernelApp now based on InteractiveShellApp
r3979 aliases.update(shell_aliases)
MinRK
zmq kernels now started via newapp
r3970
#-----------------------------------------------------------------------------
# The IPKernelApp class
#-----------------------------------------------------------------------------
epatters
* Added 'independent' argument to 'launch_kernel' for setting subprocess persistence goals. The case for 'independent=False' is only partially implemented....
r2700
MinRK
IPKernelApp now based on InteractiveShellApp
r3979 class IPKernelApp(KernelApp, InteractiveShellApp):
MinRK
zmq kernels now started via newapp
r3970 name = 'ipkernel'
aliases = Dict(aliases)
flags = Dict(flags)
MinRK
finish plumbing config to Session objects...
r4015 classes = [Kernel, ZMQInteractiveShell, ProfileDir, Session]
Bradley M. Froehle
Move gui and pylab options to InteractiveShellApp.
r7096
MinRK
catch_config -> catch_config_error
r5214 @catch_config_error
MinRK
IPKernelApp now based on InteractiveShellApp
r3979 def initialize(self, argv=None):
super(IPKernelApp, self).initialize(argv)
Bradley M. Froehle
Move sys.path.insert(0, '') from subclasses to InteractiveShellApp
r6695 self.init_path()
MinRK
IPKernelApp now based on InteractiveShellApp
r3979 self.init_shell()
Bradley M. Froehle
Accept --gui=<...> switch in IPython qtconsole....
r7094 self.init_gui_pylab()
MinRK
IPKernelApp now based on InteractiveShellApp
r3979 self.init_extensions()
self.init_code()
MinRK
zmq kernels now started via newapp
r3970
def init_kernel(self):
MinRK
use IOLoop in ipkernel...
r6790
shell_stream = ZMQStream(self.shell_socket)
MinRK
zmq kernels now started via newapp
r3970
MinRK
%profile points to application value, not shell value...
r5261 kernel = Kernel(config=self.config, session=self.session,
MinRK
use IOLoop in ipkernel...
r6790 shell_streams=[shell_stream],
MinRK
do not use ZMQStream for IOPub...
r6804 iopub_socket=self.iopub_socket,
MinRK
zmq kernels now started via newapp
r3970 stdin_socket=self.stdin_socket,
MinRK
enable %gui/%pylab magics in the Kernel...
r5153 log=self.log,
MinRK
%profile points to application value, not shell value...
r5261 profile_dir=self.profile_dir,
MinRK
zmq kernels now started via newapp
r3970 )
self.kernel = kernel
kernel.record_ports(self.ports)
MinRK
Show traceback, continuing to start kernel if pylab init fails...
r5295 shell = kernel.shell
Bradley M. Froehle
Accept --gui=<...> switch in IPython qtconsole....
r7094
def init_gui_pylab(self):
"""Enable GUI event loop integration, taking pylab into account."""
Bradley M. Froehle
Move gui and pylab options to InteractiveShellApp.
r7096
# Provide a wrapper for :meth:`InteractiveShellApp.init_gui_pylab`
# to ensure that any exception is printed straight to stderr.
# Normally _showtraceback associates the reply with an execution,
# which means frontends will never draw it, as this exception
# is not associated with any execute request.
shell = self.shell
_showtraceback = shell._showtraceback
try:
# replace pyerr-sending traceback with stderr
def print_tb(etype, evalue, stb):
print ("GUI event loop or pylab initialization failed",
file=io.stderr)
print (shell.InteractiveTB.stb2text(stb), file=io.stderr)
shell._showtraceback = print_tb
InteractiveShellApp.init_gui_pylab(self)
finally:
shell._showtraceback = _showtraceback
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
IPKernelApp now based on InteractiveShellApp
r3979 def init_shell(self):
self.shell = self.kernel.shell
MinRK
include parent Application in InteractiveShell.configurables...
r5315 self.shell.configurables.append(self)
epatters
Add stdin/stdout/stderr options to kernel launch functions.
r3828
epatters
Add option for specifying Python executable to 'launch_kernel'.
r3812
MinRK
zmq kernels now started via newapp
r3970 #-----------------------------------------------------------------------------
# Kernel main and launch functions
#-----------------------------------------------------------------------------
epatters
* Added 'independent' argument to 'launch_kernel' for setting subprocess persistence goals. The case for 'independent=False' is only partially implemented....
r2700
MinRK
zmq kernels now started via newapp
r3970 def launch_kernel(*args, **kwargs):
"""Launches a localhost IPython kernel, binding to the specified ports.
epatters
* Restored functionality after major merge....
r2778
Fernando Perez
Minor cleanups after a check with pyflakes of the refactored code.
r5471 This function simply calls entry_point.base_launch_kernel with the right
first command to start an ipkernel. See base_launch_kernel for arguments.
MinRK
color settings from ipythonqt propagate down to the ZMQInteractiveShell in the Kernel
r3173
epatters
* Added 'independent' argument to 'launch_kernel' for setting subprocess persistence goals. The case for 'independent=False' is only partially implemented....
r2700 Returns
-------
A tuple of form:
MinRK
zmq kernels now started via newapp
r3970 (kernel_process, shell_port, iopub_port, stdin_port, hb_port)
epatters
* Added 'req_port' option to 'launch_kernel' and the kernel entry point....
r2702 where kernel_process is a Popen object and the ports are integers.
epatters
* Added a function for spawning a localhost kernel in a new process on random ports....
r2641 """
epatters
* Restored functionality after major merge....
r2778 return base_launch_kernel('from IPython.zmq.ipkernel import main; main()',
MinRK
zmq kernels now started via newapp
r3970 *args, **kwargs)
epatters
* Added 'independent' argument to 'launch_kernel' for setting subprocess persistence goals. The case for 'independent=False' is only partially implemented....
r2700
Fernando Perez
Rework messaging to better conform to our spec....
r2926
MinRK
adjust embed_kernel signature...
r6571 def embed_kernel(module=None, local_ns=None, **kwargs):
"""Embed and start an IPython kernel in a given scope.
Parameters
----------
module : ModuleType, optional
The module to load into IPython globals (default: caller)
local_ns : dict, optional
The namespace to load into IPython user namespace (default: caller)
kwargs : various, optional
Further keyword args are relayed to the KernelApp constructor,
allowing configuration of the Kernel. Will only have an effect
on the first embed_kernel call for a given process.
"""
# get the app if it exists, or set it up if it doesn't
MinRK
revert embed_kernel changes that implied bind_kernel in engine
r6892 if IPKernelApp.initialized():
app = IPKernelApp.instance()
MinRK
adjust embed_kernel signature...
r6571 else:
app = IPKernelApp.instance(**kwargs)
app.initialize([])
MinRK
undo initial clobbering done by init_sys_modules in embed_kernel...
r6831 # Undo unnecessary sys module mangling from init_sys_modules.
# This would not be necessary if we could prevent it
# in the first place by using a different InteractiveShell
# subclass, as in the regular embed case.
main = app.kernel.shell._orig_sys_modules_main_mod
if main is not None:
sys.modules[app.kernel.shell._orig_sys_modules_main_name] = main
MinRK
adjust embed_kernel signature...
r6571
# load the calling scope if not given
(caller_module, caller_locals) = extract_module_locals(1)
if module is None:
module = caller_module
if local_ns is None:
local_ns = caller_locals
app.kernel.user_module = module
app.kernel.user_ns = local_ns
Scott Tsai
add IPython.embed_kernel()...
r6041 app.start()
Fernando Perez
Rework messaging to better conform to our spec....
r2926
epatters
* Restored functionality after major merge....
r2778 def main():
MinRK
IPKernelApp now based on InteractiveShellApp
r3979 """Run an IPKernel as an application"""
MinRK
use App.instance() in kernel launchers...
r3980 app = IPKernelApp.instance()
MinRK
zmq kernels now started via newapp
r3970 app.initialize()
app.start()
Fernando Perez
Added zmq kernel file which I forgot
r2598
Fernando Perez
Rework messaging to better conform to our spec....
r2926
Fernando Perez
Added zmq kernel file which I forgot
r2598 if __name__ == '__main__':
epatters
* Implemented a proper main() function for kernel.py that reads command line input....
r2667 main()