Как бы вы запросили пользователя для некоторого ввода, но время ожидания истекло через N секунд?
Google указывает на почтовую ветку об этом по адресу http://mail.python.org/pipermail/python-list/2006-January/533215.html но, похоже, это не работает. Оператор, в котором происходит таймаут, независимо от того, является ли это sys.input.readline или timer.sleep(), я всегда получаю:
<type 'exceptions.TypeError'>: [raw_]input expected at most 1 arguments, got 2
который каким-то образом except не удается перехватить.
Переведено автоматически
Ответ 1
Использование вызова select короче и должно быть намного более переносимым
import sys, select
print"You have ten seconds to answer!"
i, o, e = select.select( [sys.stdin], [], [], 10 )
if (i): print"You said", sys.stdin.readline().strip() else: print"You said nothing!"
Ответ 2
Пример, на который вы ссылаетесь, неверен, и исключение на самом деле возникает при вызове обработчика сигналов тревоги, а не при блокировке чтения. Лучше попробуйте это:
import signal TIMEOUT = 5# number of seconds your want for timeout
definterrupted(signum, frame): "called when read times out" print'interrupted!' signal.signal(signal.SIGALRM, interrupted)
definput(): try: print'You have 5 seconds to type in your stuff...' foo = raw_input() return foo except: # timeout return
# set alarm signal.alarm(TIMEOUT) s = input() # disable the alarm after success signal.alarm(0) print'You typed', s
Ответ 3
если вам все равно, как это работает, просто
pip install inputimeout и
from inputimeout import inputimeout, TimeoutOccurred
if __name__ == "__main__": try: c = inputimeout(prompt='hello\n', timeout=3) except TimeoutOccurred: c = 'timeout' print(c)
Я столкнулся с этой проблемой с помощью скрипта, работающего под CentOS (Linux), и то, что сработало в моей ситуации, было просто выполнением команды Bash "read -t" в подпроцессе. Жестокий отвратительный взлом, я знаю, но я чувствую себя настолько виноватым из-за того, насколько хорошо это сработало, что захотел поделиться им со всеми присутствующими.