Предположите, что все пользователи являются злонамеренными. Санируйте весь вход как можно скорее. Точка.
Я знаю, что это не полностью отвечает на ваш вопрос, но вы можете сделать следующее:
perform_actions
. Вызовите его при запуске программы. Таким образом, одно прерывание будет вести себя так, как вы хотите ctrl + r вести себя. Два быстрых прерывания завершают программу.
import time
def perform_actions():
print("Hello.. again")
try:
while True:
perform_actions()
try:
while True: time.sleep(3600)
except KeyboardInterrupt:
time.sleep(0.5)
except KeyboardInterrupt:
pass
Хорошим побочным эффектом использования сигнала (в данном случае SIGINT
) является то, что вы также перезапускаете сценарий другими способами, например, запустив kill - int
.
Вы можете использовать Tkinter {требуется X: (}
#!/usr/bin/env python
from Tkinter import * # needs python-tk
root = Tk()
def hello(*ignore):
print 'Hello World'
root.bind('<Control-r>', hello)
root.mainloop() # starts an X widget
Этот сценарий выводит на консоль Hello World
, если вы нажмете ctrl + r
См. Также Tkinter keybindings . Другое решение, использующее GTK, можно найти здесь
в спящем режиме цикла for 3500 раз в течение 1 секунды, проверяя, нажималась ли клавиша каждый раз
# sleep for 3500 seconds unless ctrl+r is pressed
for i in range(3500):
time.sleep(1)
# check if ctrl+r is pressed
# if pressed -> do something
# otherwise go back to sleep