Question

Dans mon code boucle I bien raw_input() pour voir si l'utilisateur a demandé de cesser de fumer. Mon application peut quitter avant que l'utilisateur quitte, mais mon problème est l'application est encore en vie jusqu'à ce que j'entrer une clé pour revenir de la fonction de blocage raw_input(). Puis-je faire pour forcer raw_input() à retourner en envoyant peut-être une entrée faux? Pourrais-je terminer le fil que ce soit sur? (Les seules données qu'il a est une variable appelée wantQuit).

Était-ce utile?

La solution

Vous pouvez utiliser cette fonction de temporisation qui enveloppe votre fonction. Voici la recette 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

Autres conseils

Pourquoi ne pas simplement marquer le fil comme daemonic?

De la docs :

  

Un thread peut être marqué comme un « fil démon ». L'importance de ce drapeau est que l'ensemble du programme de sortie de Python lorsque seuls threads démon sont laissés. La valeur initiale est hérité du fil de création. Le drapeau peut être défini par l'attribut démon.

Vous pouvez utiliser une fonction non-bloquant pour lire l'entrée utilisateur.
Cette solution est spécifique à 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)

Pour faire quelque chose de similaire dans Unix, qui lit une ligne à la fois, contrairement à la lecture de la version Windows par char (charbon grâce à Aaron Digulla pour fournir le lien vers le forum des utilisateurs de 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()

Voir aussi: http://code.activestate.com/recipes/134892/

Il y a un afficher sur la liste de diffusion Python qui explique comment faire pour 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top