Python 3定时input

我希望能够做的是使用input问一个用户一个问题。 例如:

print('some scenario') prompt = input("You have 10 seconds to choose the correct answer...\n") 

如果时间过去了,就打印一下

 print('Sorry, times up.') 

任何帮助指向我在正确的方向将不胜感激。

有趣的问题,这似乎工作:

 import time from threading import Thread answer = None def check(): time.sleep(2) if answer != None: return print "Too Slow" Thread(target = check).start() answer = raw_input("Input something: ") 

如果在用户没有提供答案时阻止主线程是可以接受的:

 from threading import Timer timeout = 10 t = Timer(timeout, print, ['Sorry, times up']) t.start() prompt = "You have %d seconds to choose the correct answer...\n" % timeout answer = input(prompt) t.cancel() 

否则,您可以在Windows上使用@Alex Martelli的回答 (针对Python 3进行了修改)(未经testing):

 import msvcrt import time class TimeoutExpired(Exception): pass def input_with_timeout(prompt, timeout, timer=time.monotonic): sys.stdout.write(prompt) sys.stdout.flush() endtime = timer() + timeout result = [] while timer() < endtime: if msvcrt.kbhit(): result.append(msvcrt.getwche()) #XXX can it block on multibyte characters? if result[-1] == '\n': #XXX check what Windows returns here return ''.join(result[:-1]) time.sleep(0.04) # just to yield to other processes/threads raise TimeoutExpired 

用法:

 try: answer = input_with_timeout(prompt, 10) except TimeoutExpired: print('Sorry, times up') else: print('Got %r' % answer) 

在Unix上,你可以尝试:

 import select import sys def input_with_timeout(prompt, timeout): sys.stdout.write(prompt) sys.stdout.flush() ready, _, _ = select.select([sys.stdin], [],[], timeout) if ready: return sys.stdin.readline().rstrip('\n') # expect stdin to be line-buffered raise TimeoutExpired 

要么:

 import signal def alarm_handler(signum, frame): raise TimeoutExpired def input_with_timeout(prompt, timeout): # set signal handler signal.signal(signal.SIGALRM, alarm_handler) signal.alarm(timeout) # produce SIGALRM in `timeout` seconds try: return input(prompt) finally: signal.alarm(0) # cancel alarm