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

File last commit:

r5615:9a0989a4
r5616:7431cd60
Show More
app.py
149 lines | 5.0 KiB | text/x-python | PythonLexer
Paul Ivanov
zmqterminal now uses the zmq mixin app
r5604 """ A minimal application using the ZMQ-based terminal IPython frontend.
MinRK
zmqterminal subclasses TerminalInteractiveShell/IPApp...
r5600
Paul Ivanov
zmqterminal now uses the zmq mixin app
r5604 This is not a complete console app, as subprocess will not be able to receive
input, there is no real readline support, among other limitations.
Authors:
* Min RK
* Paul Ivanov
"""
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
MinRK
zmqterminal subclasses TerminalInteractiveShell/IPApp...
r5600 import signal
import sys
import time
MinRK
update flags&aliases for two-process apps...
r5610 from IPython.frontend.terminal.ipapp import TerminalIPythonApp, frontend_flags as term_flags
MinRK
zmqterminal subclasses TerminalInteractiveShell/IPApp...
r5600
from IPython.utils.traitlets import (
Dict, List, Unicode, Int, CaselessStrEnum, CBool, Any
)
MinRK
Adjustment to console signal-handling...
r5615 from IPython.utils.warn import warn,error
Paul Ivanov
zmqterminal now uses the zmq mixin app
r5604 from IPython.zmq.ipkernel import IPKernelApp
from IPython.zmq.session import Session, default_secure
MinRK
zmqterminal subclasses TerminalInteractiveShell/IPApp...
r5600 from IPython.zmq.zmqshell import ZMQInteractiveShell
Paul Ivanov
zmqterminal now uses the zmq mixin app
r5604 from IPython.frontend.kernelmixinapp import (
MinRK
update flags&aliases for two-process apps...
r5610 IPythonMixinConsoleApp, app_aliases, app_flags, aliases, app_aliases, flags
Paul Ivanov
zmqterminal now uses the zmq mixin app
r5604 )
MinRK
Move IPython.frontend.zmqterminal to IPython.frontend.terminal.console
r5611 from IPython.frontend.terminal.console.interactiveshell import ZMQTerminalInteractiveShell
MinRK
zmqterminal subclasses TerminalInteractiveShell/IPApp...
r5600
#-----------------------------------------------------------------------------
Paul Ivanov
zmqterminal now uses the zmq mixin app
r5604 # Globals
MinRK
zmqterminal subclasses TerminalInteractiveShell/IPApp...
r5600 #-----------------------------------------------------------------------------
Paul Ivanov
zmqterminal now uses the zmq mixin app
r5604 _examples = """
ipython console # start the ZMQ-based console
Paul Ivanov
documentation update
r5607 ipython console --existing # connect to an existing ipython session
Paul Ivanov
zmqterminal now uses the zmq mixin app
r5604 """
MinRK
zmqterminal subclasses TerminalInteractiveShell/IPApp...
r5600
#-----------------------------------------------------------------------------
# Flags and Aliases
#-----------------------------------------------------------------------------
MinRK
update flags&aliases for two-process apps...
r5610 # copy flags from mixin:
flags = dict(flags)
# start with mixin frontend flags:
frontend_flags = dict(app_flags)
# add TerminalIPApp flags:
frontend_flags.update(term_flags)
# pylab is not frontend-specific in two-process IPython
frontend_flags.pop('pylab')
# disable quick startup, as it won't propagate to the kernel anyway
frontend_flags.pop('quick')
# update full dict with frontend flags:
MinRK
zmqterminal subclasses TerminalInteractiveShell/IPApp...
r5600 flags.update(frontend_flags)
Paul Ivanov
zmqterminal now uses the zmq mixin app
r5604
MinRK
update flags&aliases for two-process apps...
r5610 # copy flags from mixin
aliases = dict(aliases)
# start with mixin frontend flags
frontend_aliases = dict(app_aliases)
# load updated frontend flags into full dict
aliases.update(frontend_aliases)
Paul Ivanov
zmqterminal now uses the zmq mixin app
r5604
MinRK
update flags&aliases for two-process apps...
r5610 # get flags&aliases into sets, and remove a couple that
# shouldn't be scrubbed from backend flags:
frontend_aliases = set(frontend_aliases.keys())
frontend_flags = set(frontend_flags.keys())
MinRK
zmqterminal subclasses TerminalInteractiveShell/IPApp...
r5600
#-----------------------------------------------------------------------------
# Classes
#-----------------------------------------------------------------------------
Paul Ivanov
zmqterminal now uses the zmq mixin app
r5604 class ZMQTerminalIPythonApp(TerminalIPythonApp, IPythonMixinConsoleApp):
MinRK
update flags&aliases for two-process apps...
r5610 name = "ipython-console"
MinRK
zmqterminal subclasses TerminalInteractiveShell/IPApp...
r5600 """Start a terminal frontend to the IPython zmq kernel."""
Paul Ivanov
documentation update
r5607
description = """
The IPython terminal-based Console.
This launches a Console application inside a terminal.
The Console supports various extra features beyond the traditional
single-process Terminal IPython shell, such as connecting to an
existing ipython session, via:
ipython console --existing
where the previous session could have been created by another ipython
console, an ipython qtconsole, or by opening an ipython notebook.
"""
examples = _examples
MinRK
update flags&aliases for two-process apps...
r5610 classes = List([IPKernelApp, ZMQTerminalInteractiveShell, Session])
MinRK
zmqterminal subclasses TerminalInteractiveShell/IPApp...
r5600 flags = Dict(flags)
aliases = Dict(aliases)
Paul Ivanov
documentation update
r5607 subcommands = Dict()
MinRK
update flags&aliases for two-process apps...
r5610
MinRK
zmqterminal subclasses TerminalInteractiveShell/IPApp...
r5600 def parse_command_line(self, argv=None):
super(ZMQTerminalIPythonApp, self).parse_command_line(argv)
Paul Ivanov
zmqterminal now uses the zmq mixin app
r5604 self.swallow_args(frontend_aliases,frontend_flags,argv=argv)
MinRK
zmqterminal subclasses TerminalInteractiveShell/IPApp...
r5600
def init_shell(self):
Paul Ivanov
zmqterminal now uses the zmq mixin app
r5604 IPythonMixinConsoleApp.initialize(self)
Paul Ivanov
restore KeyboardInterrupt capability
r5605 # relay sigint to kernel
signal.signal(signal.SIGINT, self.handle_sigint)
MinRK
zmqterminal subclasses TerminalInteractiveShell/IPApp...
r5600 self.shell = ZMQTerminalInteractiveShell.instance(config=self.config,
display_banner=False, profile_dir=self.profile_dir,
ipython_dir=self.ipython_dir, kernel_manager=self.kernel_manager)
Paul Ivanov
zmqterminal now uses the zmq mixin app
r5604
MinRK
zmqterminal subclasses TerminalInteractiveShell/IPApp...
r5600 def handle_sigint(self, *args):
MinRK
Adjustment to console signal-handling...
r5615 if self.shell._executing:
if self.kernel_manager.has_kernel:
# interrupt already gets passed to subprocess by signal handler.
# Only if we prevent that should we need to explicitly call
# interrupt_kernel, until which time, this would result in a
# double-interrupt:
# self.kernel_manager.interrupt_kernel()
pass
else:
self.shell.write_err('\n')
error("Cannot interrupt kernels we didn't start.\n")
Paul Ivanov
report inability to signal --existing kernels
r5608 else:
MinRK
Adjustment to console signal-handling...
r5615 # raise the KeyboardInterrupt if we aren't waiting for execution,
# so that the interact loop advances, and prompt is redrawn, etc.
raise KeyboardInterrupt
Paul Ivanov
zmqterminal now uses the zmq mixin app
r5604
MinRK
zmqterminal subclasses TerminalInteractiveShell/IPApp...
r5600 def init_code(self):
# no-op in the frontend, code gets run in the backend
pass
def launch_new_instance():
"""Create and run a full blown IPython instance"""
app = ZMQTerminalIPythonApp.instance()
app.initialize()
app.start()
if __name__ == '__main__':
launch_new_instance()