我在python中创建了一个如下所示的程序:
import time
y = "a"
x = 0
while x != 10 and y == "a":
y = input("What is your name? ")
time.sleep(1)
x = x + 1
if y != "a":
print("Hi " + y)
else:
print("You took too long to answer...")
我知道在这个问题上有一种方法可以完成同样的事情:Keyboard input with timeout in Python,但我想知道为什么这不起作用。无论我等多久,它都不会超时;它只是坐在那里等我输入内容。我做错了什么?我在Win 7上使用python 3.3。
答案 0 :(得分:1)
输入在python中阻塞。含义time.sleep(1)
行和仅在收到输入后执行后的所有行。
答案 1 :(得分:1)
有两种方法可以达到你想要的效果:
input()
语句封装在一个线程中,加入一个超时然后终止该线程。但是,不建议这样做。请参阅此问题:Is there any way to kill a Thread in Python? input()
我基于this blog以简单的方式实现您的需求:
import signal
y = 'a'
x = 0
class AlarmException(Exception):
pass
def alarm_handler(signum, frame):
raise AlarmException
def my_input(prompt="What's your name? ", timeout=3):
signal.signal(signal.SIGALRM, alarm_handler)
signal.alarm(timeout)
try:
name = input(prompt)
signal.alarm(0)
return name
except AlarmException:
print('timeout......')
signal.signal(signal.SIGALRM, signal.SIG_IGN)
return
while x != 10 and y == 'a':
y = my_input(timeout=3) or 'a'
x += 1
if y != 'a':
print('Hi %s' % (y,))
else:
print('You took too long to answer.')