IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Test non bloquant de présence de caractères dans sys.stdin?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut Test non bloquant de présence de caractères dans sys.stdin?
    Bonjour,

    Je voudrais pouvoir arrêter avec une touche de clavier un programme qui tourne en console, mais il utilise psyco qui ne tient aucun compte de Ctle-C / KeyboardInterrupt.

    Je voudrais donc tester périodiquement s'il y a un caractère en attente dans l'entrée sys.stdin, mais sans que le déroulement ne soit bloqué. Ceci sous Windows et Linux.

    Quelqu'un sait-il comment faire?

    Tyrtamos

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Par défaut
    en googlant un peu:
    http://mail.python.org/pipermail/pyt...er/014262.html

    Sinon, je pense qu'avec un package graphique (wx ou autre), on doit pouvoir le faire?

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour fructidor,

    Merci de ta réponse.

    Pour l'instant, je souhaite que mon programme reste en console. Une expérience précédente m'a montré qu'une programme tkinter sous psyco pouvait rester "sourd" pendant les calculs.

    Merci pour le lien. J'ai continué à chercher aussi, et j'ai trouvé les liens suivants:

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

    http://www.darkcoding.net/software/n...-not-possible/

    http://code.activestate.com/recipes/572182/

    Comme mon problème était très précis (arrêter un calcul sous psyco alors qu'il n'écoute pas le clavier), j'ai utilisé la solution suivante:

    1- création d'une fonction getch() qui renvoit un caractère tapée au clavier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    def getch_win():
        return msvcrt.getch()
     
    def getch_lin():
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(fd)
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch
     
    def getch_autre():
        return None
     
    if sys.platform=="win32":
        import msvcrt
        getch = getch_win
    elif sys.platform=="linux2":
        import tty, termios
        getch = getch_lin
    else:
        getch = getch_autre

    2- création d'un thread clavier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    class Clavier(threading.Thread):
     
        def __init__(self):
            threading.Thread.__init__(self)
            self.quit = False
     
        def run(self):
            while True:
                car = getch()
                if ord(car)==3:
                    self.quit = True
                    break  # =fin du thread
     
        def quitter(self):
            return self.quit

    3- lancer le thread clavier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    clavier = Clavier()
    clavier.start()

    4- exemple d'utilisation dans la boucle de calcul:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if clavier.quitter():
        raise KeyboardInterrupt
    Et voilà, ça fonctionne très bien! Le calcul sous psyco est effectivement stoppé par un simple Ctle-C.

    En fait, le thread est nécessaire pour palier l'absence d'un "kbhit()" afin simplement de tester la présence d'un caractère en attente. Et ce kbhit() existe avec Windows (msvcrt.kbhit()), mais pas avec Linux. Comme je ne travaille qu'en multiplateforme, j'ai commencé à travailler sur une vraie fonction kbhit() linux, mais ça oblige à modifier le mode de fonctionnement du terminal stdin. Le 3ème lien cité est une bonne approche.

    J'avoue que je ne comprends pas qu'une telle fonction n'existe pas: il ne s'agit pourtant que de tester si le buffer d'entrée de stdin est vide ou pas, non?

    Enfin, bref, j'ai résolu mon petit pb. On verra le reste plus tard...

    j'attends quelques jours avant de mettre "résolu" au cas ou quelqu'un aurait une idée géniale à proposer .

    Tyrtamos

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/09/2011, 11h04
  2. test sur l'existence d'un caractère dans une chaine
    Par pigeon11 dans le forum VB.NET
    Réponses: 7
    Dernier message: 02/04/2009, 16h46
  3. Réponses: 4
    Dernier message: 24/04/2007, 21h58
  4. Réponses: 3
    Dernier message: 13/11/2006, 16h08
  5. [VS.net] Vérifier le présence d'un caractère dans une chaine
    Par arnolem dans le forum Windows Forms
    Réponses: 15
    Dernier message: 10/09/2005, 15h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo