Как вы перехватываете прерывание клавиатуры (CTRL-C) в Jython?

Это то, что я пробовал...

from sun.misc import Signal
from sun.misc import SignalHandler

class InterruptHandler(SignalHandler):

    def handle(self):
        print "Shutting down server..."


Signal.handle(Signal("INT"),InterruptHandler())

Он основан на этом http://www.javaspecialists.co.za/archive/Issue043.html, но, видимо, я что-то упускаю.


person espeed    schedule 15.09.2011    source источник
comment
Что бы это ни стоило, try catch тоже не работает. Похоже, что поток python vm ловит прерывание вместо скрипта.   -  person Carl F.    schedule 20.09.2011


Ответы (2)


Похоже на ошибку в Jython. Там приведены некоторые обходные пути.

person TimS    schedule 18.01.2013

Я сталкивался с подобной проблемой раньше. Вот как я это решаю.

Сначала зарегистрируйте обработчик сигнала в вашем сценарии Jython:

import signal
def intHandler(signum, frame):
    print "Shutting down.."
    System.exit(1)

# Set the signal handler
signal.signal(signal.SIGINT, intHandler)
signal.signal(signal.SIGTERM, intHandler)

Это зарегистрирует обработчик сигнала для сценария Jython для обработки ввода с клавиатуры CTRL+C.

Однако класс консоли по умолчанию org.python.util.JLineConsole обрабатывает Ctrl+C как обычный ввод символов.

Итак, во-вторых, необходимо изменить python.console на альтернативный консольный класс org.python.core.PlainConsole, либо изменив свойство Jython:

python.console=org.python.core.PlainConsole

или добавьте аргумент jvm:

-Dpython.console=org.python.core.PlainConsole

Это поможет вам закрыть программу после нажатия CTRL+C.

person Feng    schedule 09.07.2015