在python中执行一段时间的程序

时间:2013-12-14 23:51:01

标签: python python-3.3

我在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。

2 个答案:

答案 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.')