Domanda

Nel mio codice ciclo ho pensato raw_input() per vedere se l'utente ha richiesto di smettere. La mia applicazione può uscire prima che l'utente si chiude, ma il mio problema è l'applicazione è ancora in vita fino a quando entro in un tasto per tornare dalla funzione di blocco raw_input(). Posso fare per forza raw_input() per tornare da forse l'invio di un ingresso falso? Potrei terminare il filo che è su? (Gli unici dati che ha è una singola variabile denominata wantQuit).

È stato utile?

Soluzione

È possibile utilizzare questo tempo fuori funzione che avvolge la vostra funzione. Ecco la ricetta da: 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

Altri suggerimenti

Perché non basta marcare il filo come demoniaca?

docs :

  

Un filo può essere contrassegnato come un “filo daemon”. Il significato di questo flag è che l'intero programma Python esce quando solo thread demoni sono lasciati. Il valore iniziale è ereditato dalla filettatura creando. Il flag può essere impostato tramite l'attributo daemon.

Si potrebbe utilizzare un non-blocking funzione per leggere l'input dell'utente.
Questa soluzione è specifico per 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)

Per fare qualcosa di simile a Unix, che legge una riga alla volta, a differenza della versione di Windows leggere char da char (grazie a Aaron Digulla per fornire il link al forum degli utenti 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()

Si veda anche: http://code.activestate.com/recipes/134892/

C'è un postare su Python mailing list che spiega come fare questo per 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top