2013-12-14 32 views
1

一段时间的节目我做了一个Python程序看起来像这样:做事情在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

程序在'y = input(“你叫什么名字?”)块''''''直到用户按下输入。你的程序没有什么可以中断'输入'并导致它提前终止。看看你连接的答案,找出可能的解决方案。 – Tim

+1

本杰明是对的。你到底想做什么? – aIKid

回答

1

输入在python中阻塞。含义time.sleep(1)行和接收输入后才执行的所有行。

+0

我该如何解决它? @Ruslan Osipov – user2218101

+0

@ user2218101使用您提供的答案中描述的解决方案:http://stackoverflow.com/questions/1335507/keyboard-input-with-timeout-in-python。 –

+0

我知道那个代码有效,但对我来说,这是一个练习,而不是一个功能。你知道我能解决吗? – user2218101

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.') 
相关问题