##// END OF EJS Templates
Adjustment to console signal-handling...
MinRK -
Show More
@@ -22,6 +22,8 b' from IPython.frontend.terminal.ipapp import TerminalIPythonApp, frontend_flags a'
22 22 from IPython.utils.traitlets import (
23 23 Dict, List, Unicode, Int, CaselessStrEnum, CBool, Any
24 24 )
25 from IPython.utils.warn import warn,error
26
25 27 from IPython.zmq.ipkernel import IPKernelApp
26 28 from IPython.zmq.session import Session, default_secure
27 29 from IPython.zmq.zmqshell import ZMQInteractiveShell
@@ -114,12 +116,22 b' class ZMQTerminalIPythonApp(TerminalIPythonApp, IPythonMixinConsoleApp):'
114 116 ipython_dir=self.ipython_dir, kernel_manager=self.kernel_manager)
115 117
116 118 def handle_sigint(self, *args):
117 self.shell.write('KeyboardInterrupt\n')
118 if self.kernel_manager.has_kernel:
119 self.kernel_manager.interrupt_kernel()
119 if self.shell._executing:
120 if self.kernel_manager.has_kernel:
121 # interrupt already gets passed to subprocess by signal handler.
122 # Only if we prevent that should we need to explicitly call
123 # interrupt_kernel, until which time, this would result in a
124 # double-interrupt:
125 # self.kernel_manager.interrupt_kernel()
126 pass
127 else:
128 self.shell.write_err('\n')
129 error("Cannot interrupt kernels we didn't start.\n")
120 130 else:
121 print 'Kernel process is either remote or unspecified.',
122 print 'Cannot interrupt.'
131 # raise the KeyboardInterrupt if we aren't waiting for execution,
132 # so that the interact loop advances, and prompt is redrawn, etc.
133 raise KeyboardInterrupt
134
123 135
124 136 def init_code(self):
125 137 # no-op in the frontend, code gets run in the backend
@@ -198,6 +198,9 b' class Kernel(Configurable):'
198 198 except KeyboardInterrupt:
199 199 # Ctrl-C shouldn't crash the kernel
200 200 io.raw_print("KeyboardInterrupt caught in kernel")
201 # stop ignoring sigint, now that we are out of our own loop,
202 # we don't want to prevent future code from handling it
203 signal(SIGINT, default_int_handler)
201 204 if self.eventloop is not None:
202 205 try:
203 206 self.eventloop(self)
General Comments 0
You need to be logged in to leave comments. Login now