Partage
  • Partager sur Facebook
  • Partager sur Twitter

Remplir un raw_input() via un autre programme ?

Communication Client/Serveur

Sujet résolu
    27 février 2013 à 17:28:41

    Bonjour,

    J'ai créé un client qui envoie du texte à un serveur. Le serveur récupère le texte et lance un script que j'ai créé. Mais dans ce script, j'ai un raw_input(). Comment puis-je faire pour que le client remplisse le raw_input() en attente sur le serveur ??

    Merci d'avance

    -
    Edité par NiReaS 27 février 2013 à 17:40:12

    • Partager sur Facebook
    • Partager sur Twitter
      27 février 2013 à 17:44:36

      Pourquoi ne pas plutôt appeler directement dans ton serveur la fonction de ton script qui va bien ? Sinon, ça peut se faire avec subprocess.Popen (en écrivant sur le STDIN du processus fils).

      -
      Edité par nohar 27 février 2013 à 17:46:32

      • Partager sur Facebook
      • Partager sur Twitter
      Zeste de Savoir, le site qui en a dans le citron !
        27 février 2013 à 18:01:25

        nohar a écrit:

        Pourquoi ne pas plutôt appeler directement dans ton serveur la fonction de ton script qui va bien ?


        Comment ça? Mon raw_input() n'est pas obligatoire. Selon le cas, il demande des informations supplémentaires, sinon tout se déroule sans problème.

        • Partager sur Facebook
        • Partager sur Twitter
          27 février 2013 à 18:42:37

          Tu ne voudrais pas développer un peu plus le contexte ou nous montrer du code ? Parce que là tel que tu le décris ton architecture semble bien complexe pour pas grand chose.

          -
          Edité par nohar 27 février 2013 à 18:44:13

          • Partager sur Facebook
          • Partager sur Twitter
          Zeste de Savoir, le site qui en a dans le citron !
            28 février 2013 à 9:08:04

            Effectivement, elle est complexe et j'ai oublié de préciser quelques trucs. Alors, j'ai une appli client (C#) qui souhaite lancer le script (python). Du coup je créé une application serveur en (python) qui va s'occuper de lancer du script à chaque fois qu'il reçoit des informations du client. Pourquoi choisir cette architecture? Parce que je souhaite que plusieurs clients différents puissent lancer le script, du coup il me faut un serveur qui gère tout cela et qui fait l'intermédiaire. Ce n'ai pas la seule raison, mais l'architecture est bonne et j'ai pas le choix, c'est la meilleure solution ^^ C'est assez pour comprendre ce que je souhaite :p

            Or il peut arriver que le script demande quelques informations. J'ai codé un raw_input(), mais je ne pense pas que ce soit la bonne solution. Comment puis-je faire pour que mon application client envoie des informations au script en passant par le serveur en sachant que plusieurs scripts pourrait être lancé.

            Merci d'avance

            • Partager sur Facebook
            • Partager sur Twitter
              28 février 2013 à 9:40:03

              C'est bien ce que je pensais.

              Tu ne devrais pas séparer le serveur du script. Ensuite, sans code on ne peut pas te dire grand chose de plus. Simplement au lieu de faire des input() sur l'entrée standard, ton script ferait mieux de dualiguer avec les clients directement via le reseau.

              • Partager sur Facebook
              • Partager sur Twitter
              Zeste de Savoir, le site qui en a dans le citron !
                28 février 2013 à 9:53:50

                Ce que j'appelle script, c'est une énorme Class que j'ai créé. Du coup pour créer un serveur, je créé une autre Class? Je ne vais pas mélanger la Class qui fait du traitement et la Class qui dialogue avec le client. Je ne trouve pas ça très propre.

                Et si j'ai 2 Class différentes, c'est 2 choses bien séparées du coup, et la problématique est identique. J'ai fait en sorte que mon script fait tout le traitement en créant la Class avec les bon arguments, et tout déroule. Sauf s'il demande une information :/

                Tu n'es pas d'accord avec moi?

                • Partager sur Facebook
                • Partager sur Twitter
                  28 février 2013 à 10:18:26

                  NiReaS a écrit:

                  Ce que j'appelle script, c'est une énorme Class que j'ai créé. Du coup pour créer un serveur, je créé une autre Class? Je ne vais pas mélanger la Class qui fait du traitement et la Class qui dialogue avec le client. Je ne trouve pas ça très propre.

                  Importer une classe métier (celle de ton script) pour que celle chargée du dialogue interagisse avec, c'est "pas très propre" ? o_O Que dire alors du fait d'ouvrir des pipes dans tous les sens ?

                  Je ne te parle pas de "qui remplit quel rôle" (ça, quelle que soit la technique employée, ça ne change pas), mais simplement de la façon dont la communication se fait. Et ce faisant, tu ne gagnes absolument rien à exécuter ton script métier dans un processus séparé, si ce n'est que tu dois gérer la communication entre les deux via des pipes, et que d'expérience, quand tu commences à faire dialoguer des processus programmatiquement de cette façon (ou via des sockets, le problème est le même), tu t'exposes gratuitement à des bugs à tous les niveaux, alors qu'il est trivial de passer des arguments à une méthode.

                  Pire encore, si ton script "demande optionnellement des infos complémentaires avec un raw_input()", le seul moyen que tu aies de gérer ça fonctionnellement est de lire la sortie standard du script (pour savoir ce qu'il demande), puis écrire sur son entrée standard. Ça va bien plus loin qu'une affaire de pipes : ça se gère à base de Expect (en Python, pexpect), et bien que cette solution soit surpuissante puisqu'elle permet de tout automatiser, elle est aussi élégante et propre qu'un coït entre deux hippopotames en pleine saison des pluies, et donc à réserver en dernier recours lorsqu'il n'existe aucune autre solution, ce qui n'est pas du tout ton cas.

                  Dans ton cas, tu peux simplement importer ta classe dans ton script serveur, et en appeler les méthodes qui vont bien lorsque tu reçois des entrées de la part du client. Ce n'est ni sale ni inélégant : ton serveur sert simplement de couche de communication entre ce qu'il reçoit via le réseau et la classe métier.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Zeste de Savoir, le site qui en a dans le citron !
                    28 février 2013 à 10:52:55

                    Nous sommes donc bien d'accord. Garder les 2 classes où j'importe ma classe métier dans ma classe serveur.

                    nohar a écrit:

                    Dans ton cas, tu peux simplement importer ta classe dans ton script serveur, et en appeler les méthodes qui vont bien lorsque tu reçois des entrées de la part du client. Ce n'est ni sale ni inélégant : ton serveur sert simplement de couche de communication entre ce qu'il reçoit via le réseau et la classe métier.


                    Voilà où je bloque justement. Remplacer mon raw_input() par une méthode qui sera appelé par mon serveur. Mais comment faire pour que ma classe métier attende l'appel de la fonction que je ferai sur le serveur?

                    Sinon laissez mon raw_input() et créer une méthode dans ma classe métier qui va inscrire dans la console à l'appel d'une fonction dans mon serveur, non?

                    EDIT: du coup, comme la méthode est propre à la classe métier directement, il n'y aura aucun soucis de synchronisation, s'il est appelé par plusieurs clients

                    -
                    Edité par NiReaS 28 février 2013 à 10:56:58

                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 février 2013 à 11:22:20

                      Tu es obligé de demander des infos complémentaires ? Tu ne peux pas déterminer dès le départ qu'il manque des infos au code métier, et faire en sorte que le serveur appelle le code métier directement avec toutes les infos nécessaires ?

                      Par exemple : le code métier lève une exception s'il n'a pas assez d'info. Le serveur rattrape l'exception, demande au client plus d'info, récupère les infos, et rappelle le code métier avec cette fois toutes les infos.

                      Sinon laissez mon raw_input() et créer une méthode dans ma classe métier qui va inscrire dans la console à l'appel d'une fonction dans mon serveur, non?

                      Non, trop crade.

                      -
                      Edité par nohar 28 février 2013 à 11:23:18

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Zeste de Savoir, le site qui en a dans le citron !
                        28 février 2013 à 11:49:22

                        nohar a écrit:

                        Tu es obligé de demander des infos complémentaires ?
                        Tu ne peux pas déterminer dès le départ qu'il manque des infos au code métier, et faire en sorte que le serveur appelle le code métier directement avec toutes les infos nécessaires ?


                        Si seulement c'était aussi simple :) J'ai 2 raw_input(). Pour un effectivement, je pourrais. Malheureusement l'autre est impossible. Il doit se faire après le lancement de la classe métier. Du coup en plein milieu il peut demander une interaction avec le client. Et pour ce cas là, je ne peux pas. Il faut que le client puisse envoyer une commande à ma classe métier.

                        Et imaginons qu'il y en ait plusieurs en même temps qui demande une interaction, il faut pouvoir gérer ça correctement. Le client doit communiquer avec la classe métier qu'il a créé

                        nohar a écrit:

                        Sinon laissez mon raw_input() et créer une méthode dans ma classe métier qui va inscrire dans la console à l'appel d'une fonction dans mon serveur, non?

                        Non, trop crade.

                        Et même niveau sécurité, c'est pas terrible d'attendre un raw_input() au final

                        -
                        Edité par NiReaS 28 février 2013 à 11:50:28

                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 février 2013 à 11:56:44

                          Tu pourrais détailler un peu la façon dont est faite ta classe métier, avec un code d'exemple, ou même le code de cette classe s'il n'est pas trop lourd ?

                          -
                          Edité par nohar 28 février 2013 à 11:57:05

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Zeste de Savoir, le site qui en a dans le citron !
                            28 février 2013 à 14:14:28

                            Ma classe est lourde, mais ça se passe dans le __init__. Rien de spécial, ça fait des traitements et dès s'il trouve un truc, c'est qu'il a besoin que l'utilisateur lui communique un code reçu par mail. C'est rare mais je dois pouvoir le gérer ^^ Et si je relance, un autre code sera envoyé. Du coup ça doit se faire tout de suite.

                            Donc comment puis-je faire pour que le client envoie une donnée à ma classe métier ? Dois-je mélanger Serveur et classe métier? Une seule classe et le _init_ de ma classe métier est tout simplement une autre fonction de ma classe. Et au lieu d'avoir un raw_input(), il sera en attente d'un receive. C'est la seule solution que j'ai pour le moment, mais ça me plaît que moyennement.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              28 février 2013 à 14:18:05

                              Pourquoi ne pas séparer ton traitement en plusieurs parties logiques ?

                              La première envoie le mail au mec, la seconde (que tu peux appeler plus tard) prend en argument le code et continue le boulot. Le serveur, dans ce cas, appelle la première partie, interroge l'objet pour savoir s'il faut continuer avec un code ou non, le cas échéant demande le code et appelle la suite avec le code retourné par le client.

                              Le problème vient de la conception du code métier que tu as agglutiné dans une seule fonction.

                              -
                              Edité par nohar 28 février 2013 à 14:22:58

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Zeste de Savoir, le site qui en a dans le citron !
                                28 février 2013 à 14:23:37

                                C'est juste, mais j'ai oublié de préciser que ce n'ai pas moi qui gère l'envoie du mail. Sinon évidemment je n'aurai cette problématique.

                                Séparé en deux parties quand même ? Heu pourquoi pas, mais la problématique est identique, la classe métier doit être en attente, et elle attend le code à lui transmettre pour continuer. Je ne peux pas arrêter le traitement de ma classe métier. Elle doit resté en attente malheureusement :/

                                -
                                Edité par NiReaS 28 février 2013 à 14:24:05

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  28 février 2013 à 14:27:45

                                  NiReaS a écrit:

                                  C'est juste, mais j'ai oublié de préciser que ce n'ai pas moi qui gère l'envoie du mail. Sinon évidemment je n'aurai cette problématique.

                                  Séparé en deux parties quand même ? Heu pourquoi pas, mais la problématique est identique, la classe métier doit être en attente, et elle attend le code à lui transmettre pour continuer. Je ne peux pas arrêter le traitement de ma classe métier. Elle doit resté en attente malheureusement :/

                                  Pourquoi ? Le principe d'un objet c'est qu'il a un état interne, ce qui lui permet de reprendre le travail qu'il a commencé plus tôt, à moins qu'il ait été conçu de façon bancale…

                                  Sinon, sérieusement, montre-nous ton code, ça nous évitera de jouer aux charades et on gagnera du temps. C'est impossible de t'aider sans plus de précisions.

                                  -
                                  Edité par nohar 28 février 2013 à 14:31:12

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Zeste de Savoir, le site qui en a dans le citron !
                                    28 février 2013 à 14:41:21

                                    Mais c'est évident !!!! Mais je fais exprès c'est pas possible :p La base de la POO !!! Honte à moi :p

                                    Rien ne m'empêche de créer des états et que tant qu'il n'est pas modifié, il ne continu pas. Et le seul moyen de le changer est d'appeler une fonction avec les paramètres souhaités.

                                    Merci ;)

                                    EDIT: ce n'est pas un soucis de code, mais de conception, d'architecture... Ou plutôt de logique

                                    -
                                    Edité par NiReaS 28 février 2013 à 14:46:36

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Remplir un raw_input() via un autre 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