Partage
  • Partager sur Facebook
  • Partager sur Twitter

Attendre une entrée clavier sans bloquer le programme

Ecouter sys.stdin ?

    11 octobre 2010 à 17:21:32

    Bonsoir à tous,

    Je me vois en face d'une certaine difficulté. L'idée est assez simple : je voudrais pouvoir demander à l'utilisateur d'entrer une information au clavier mais continuer d'exécuter le programme. Si je fais appel à input, le programme se bloque.

    Les solutions que je trouve font toute appel à des threads, mais j'aimerais trouver une autre solution que la programmation parallèle, dont je me méfie plutôt.

    J'ai essayé d'utiliser le module select pour ce faire. L'idée est d'attendre un certain lapse de temps en écoutant le descripteur sys.stdin et, si rien n'arrive, arrêter l'écoute (pour la reprendre plus tard). C'est ce mécanisme que j'utilise dans l'architecture réseau de mes programmes Python. Seulement, ça ne semble pas marcher : Python, sous Windows en tous cas, refuse d'écouter un descripteur tel que sys.stdin grâce à select.

    Je vous pose donc la question : est-ce possible, sans faire appel à des threads, d'attendre une information entrée par l'utilisateur sans bloquer tout à fait le programme ? Si possible j'aimerais trouver une solution portable ;) .

    Voilà, bonne soirée à tous, merci à l'avance de vos participations.
    • Partager sur Facebook
    • Partager sur Twitter
      11 octobre 2010 à 17:44:42

      Salut.

      Tout d'abord, une question, par curiosité : quel genre de programme avec une interface console peut avoir besoin de gérer des entrées au clavier de manière parallèle à l'exécution ?

      Sinon, personnellement, je ne vois, comme toi, que deux solutions : utiliser des threads (et tout le lot de détails, locks, mutexes, etc. qui les accompagnent) pour avoir une exécution parallèle, ou bien créer une sorte de boucle événementielle, ce qui m'a l'air quand même très compliqué pour une interface console et pas forcément adapté à tous types de programmes. Honnêtement, si j'avais à faire un truc comme ça en console, je pense que je me pencherais sur des threads assez directement : ce sera compliqué quoi qu'il arrive, autant faire face à des difficultés déjà connues. ;)
      • Partager sur Facebook
      • Partager sur Twitter
      Zeste de Savoir, le site qui en a dans le citron !
        11 octobre 2010 à 18:38:35

        Lol oui la question de l'utilité se pose. µComme je l'ai dit dans mon premier post j'utilise select pour construire une architecture serveur assez simple, capable d'attendre des requêtes de plusieurs clients, tout ça dans une seule boucle synchro. Je suis un peu alergique à la programmation parallèle...

        Mais pour faire un client basique, en console, capable d'attendre une entrée de l'utilisateur et écoutant en même temps les messages provenant du serveur, je bloque.

        C'est devenu plus une curiosité que quelque chose de vraiment utile.

        Je viens de vérifier la documentation du module select :

        NAME
        select - This module supports asynchronous I/O on multiple file descriptors.
        FILE
        c:\python31\dlls\select.pyd
        DESCRIPTION
        *** IMPORTANT NOTICE ***
        On Windows and OpenVMS, only sockets are supported; on Unix, all file descriptors.


        Dommage ;) ...
        • Partager sur Facebook
        • Partager sur Twitter

        Attendre une entrée clavier sans bloquer le programme

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown