Pergunta

No meu código eu ciclo embora raw_input() para ver se o usuário tiver solicitado a parar. Meu aplicativo pode sair antes os quites usuário, mas o meu problema é o aplicativo ainda está vivo até que eu inserir uma chave para retornar do raw_input() função de bloqueio. Que posso fazer para forçar raw_input() para retornar por talvez enviá-lo uma entrada falsa? Eu poderia terminar a thread que é em? (Os únicos dados que tem é uma única variável chamada wantQuit).

Foi útil?

Solução

Você pode usar este tempo fora função que envolve a função. Aqui está a receita de: http://code.activestate.com/recipes/473878/

def timeout(func, args=(), kwargs={}, timeout_duration=1, default=None):
    '''This function will spwan a thread and run the given function using the args, kwargs and 
    return the given default value if the timeout_duration is exceeded 
    ''' 
    import threading
    class InterruptableThread(threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self)
            self.result = default
        def run(self):
            try:
                self.result = func(*args, **kwargs)
            except:
                self.result = default
    it = InterruptableThread()
    it.start()
    it.join(timeout_duration)
    if it.isAlive():
        return it.result
    else:
        return it.result

Outras dicas

Por que você não apenas marcar o tópico como demoníaca?

A partir da docs :

A linha pode ser sinalizado como um “thread daemon”. O significado desta bandeira é que todo o programa sai do Python quando apenas threads daemon estão à esquerda. O valor inicial é herdada do segmento de criação. A bandeira pode ser configurado através do atributo daemon.

Você pode usar uma função non-blocking para ler a entrada do usuário.
Esta solução é específico para Windows:

import msvcrt
import time

while True:
    # test if there are keypresses in the input buffer
    while msvcrt.kbhit(): 
        # read a character
        print msvcrt.getch()
    # no keypresses, sleep for a while...
    time.sleep(1)

Para fazer algo semelhante em Unix, que lê uma linha de cada vez, ao contrário da versão janelas lendo caractere por caractere (graças a Aaron Digulla para fornecer o link para o fórum de usuários python):

import sys
import select

i = 0
while i < 10:
    i = i + 1
    r,w,x = select.select([sys.stdin.fileno()],[],[],2)
    if len(r) != 0:
        print sys.stdin.readline()

Veja também: http://code.activestate.com/recipes/134892/

Há um post sobre a lista de discussão Python que explica como fazer isso para Unix:

# this works on some platforms:

import signal, sys

def alarm_handler(*args):
    raise Exception("timeout")

def function_xyz(prompt, timeout):
    signal.signal(signal.SIGALRM, alarm_handler)
    signal.alarm(timeout)
    sys.stdout.write(prompt)
    sys.stdout.flush()
    try:
        text = sys.stdin.readline()
    except:
        text = ""
    signal.alarm(0)
    return text
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top