Вопрос-Ответ

Keyboard input with timeout?

Ввод с клавиатуры по таймауту?

Как бы вы запросили пользователя для некоторого ввода, но время ожидания истекло через 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

def interrupted(signum, frame):
"called when read times out"
print 'interrupted!'
signal.signal(signal.SIGALRM, interrupted)

def input():
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)

так просто

https://pypi.org/project/inputimeout/

Ответ 4

Не решение на Python, но...

Я столкнулся с этой проблемой с помощью скрипта, работающего под CentOS (Linux), и то, что сработало в моей ситуации, было просто выполнением команды Bash "read -t" в подпроцессе. Жестокий отвратительный взлом, я знаю, но я чувствую себя настолько виноватым из-за того, насколько хорошо это сработало, что захотел поделиться им со всеми присутствующими.

import subprocess
subprocess.call('read -t 30', shell=True)

Все, что мне было нужно, это что-то, что ждало 30 секунд, пока не была нажата клавиша ENTER. Это отлично сработало.

python