python: как отлавливать ctrl-c

Phoenix

import time
class SleepException(Exception):
pass
def notmyfunc(interval):
try:
time.sleep(interval)
except:
raise SleepException("Hey! I'm not finished yet!")

def myfunc(interval):
status = True
while status:
notmyfunc(interval)
time.sleep(1)
def main:
try:
myfunc(3)
except KeyboardInterrupt:
print 'quiting...'
except Exception,e:
print 'Broken transaction: %s' % e

if __name__ == '__main__':
main

f:\igor\apps\devel\python>python interrupt.py
f:\igor\apps\devel\python>python interrupt.py
Broken transaction: Hey! I'm not finished yet!
f:\igor\apps\devel\python>python interrupt.py
Broken transaction: Hey! I'm not finished yet!
f:\igor\apps\devel\python>python interrupt.py
quiting...

Какие идеи? notmyfunc - функция, которую я менять не могу.
Было бы идеально, чтобы после ctrl-c прога разрешила доделать notmyfunc, а потом завершилась.
UPD
Т.е. keyboardInterrupt не ловится в notmyfunc, в результате чего она не довыполняется.
Я хочу сделать так, чтобы этот сигнал попридержали, пока выполняется эта функция.

SCIF32

except KeyboardInterrupt,e:

pilot

signal

Phoenix

ы?

Phoenix

вот гуглил по этому слову. Можно более конкретно? или ссылку.
на всякие случай добавил инфы в первое сообщение.

ppplva

Перед входом в левую функцию устанавливаешь свой обработчик SIGINT, потом восстанавливаешь дефолтный, и, если нужно, бросаешь KeyboardInterrupt.
Только учти, что твой time.sleep вывалится немедленно по любому сигналу.

Phoenix

устанавливаешь свой обработчик SIGINT

как? питоном обойтись можно? или сишные вызовы нужны?
Только учти, что твой time.sleep вывалится немедленно по любому сигналу.

Это не понял. Даже если свой обработчик?

Phoenix

всё. спасибо!.
То, что нужно.

pilot

вот гуглил по этому слову. Можно более конкретно? или ссылку.
Надо знать stdlib хотя бы на уровне названий модулей :mad:

FRider

скорей надо уметь гуглить. Потому что первая ссылка в результатах гугла ведет сюда: http://docs.python.org/library/signal.html
Помнить нах не надо, само запоминается если часто используешь, и забывается если не используешь.

Phoenix

точно. значит не увидел или не точно такой запрос был.
всё, сдаюсь :grin:

Phoenix

А в чём глубинный смысл менять поведение при получении сигнала sleep'ом ?

tipnote

А если это сигнал о том, что пора заканчивать работу? Ты же хочешь корректно завершиться, а не дожидаться принудительной выгрузки, игнорируя все и вся в слипе?

Phoenix

так sleep не бесконечно спит.
и потом, если я хочу выгрузиться корректно, я вот и воспользуюсь переопределением обработчика через signal.

tipnote

Наверное, я тебя не понимаю... Слип прервется и запустит тот самый обработчик сигнала. Я думал, ты интересуешься, почему слип прерывается отлавливаемыми сигналами.

Phoenix

да именно этим и интересовался.
Всё. Теперь дошло наконец.
Оставить комментарий
Имя или ник:
Комментарий: