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

Langage Perl Discussion :

interagir en saisie avec un programme externe ?


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut interagir en saisie avec un programme externe ?
    Bonjour,

    Je fais appel dans un script Perl à un script Python préexistant.

    Mon problème est que ce script Python demande de saisir 4 valeurs, les commandes system et exec ne peuvent intéragir avec le programme appelé.

    Je suis en train de décortiquer la doc du module Expect mais je ne trouve pas comment faire ceci.

    Sauriez-vous comment intéragir de cette manière avec un programme extérieur (par module Expect ou autre) ?

    En vous remerciant.

    C. Tobini

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu spawn() ta commande Python, tu expect() le prompt pour la première valeur, que tu send(), etc... Je ne vois pas le problème, a priori c'est le cas le plus simple d'emploi de Expect que je puisse imaginer.

    --
    Jedaï

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    J'ai bien compris la manière générale dont fonctionne Expect, mais mon problème c'est la manière de l'utiliser :

    Côté Python, si j'ai un script simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    print 'Saisir nombre 1'
    nb1 = input()
    print 'Saisir nombre 2'
    nb2 = input()
    Côté perl, j'utilise
    my $exp = Expect->spawn(./script.py);
    my $line = $exp->expect me renvoie chaque ligne

    Si j'ai bien compris, c'est au moment où Python demande nb1 = input() qu'il faudrait effectuer le $line->send() et là je ne sais pas comment le lui indiquer.

    C. Tobini

    Balises codes ajoutées par GLDavid, merci d'y penser la prochaine fois

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu fait un truc comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my $exp = Expect->spawn(./script.py);
    my $line = $exp->expect( 100, qr/Saisir nombre 1/ );
    $exp->send( "48\n" );
    Il faut spécifier ce que doit "attendre" expect pour que ça marche !

    --
    Jedaï

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Justement, si le code Python est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    print 'Saisir :'
    n = input()
    C'est possible d'appliquer un regex pour 'Saisir', mais comment faire comprendre à Expect que c'est au moment de l'input qu'il faut envoyer du texte ?

    C. Tobini

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Citation Envoyé par ctobini
    Côté Python, si j'ai un script simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    print 'Saisir nombre 1'
    nb1 = input()
    print 'Saisir nombre 2'
    nb2 = input()
    Est-ce qu'il t'es possible de modifier le script Python afin qu'il reçoive les 4 valeurs à saisir en tant qu'arguments fournis à son lancement en tant que paramètres ?

    J'ignore comment Python gère les arguments fournis en paramètres mais en Perl, les arguments vont dans la liste @ARGV

    En imaginant que ce soit un script Perl (et non Python) qui était exécuté, cela donnerait par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ($nb1, $nb2, $nb3, $nb4) = @ARGV;
    Et le script Perl serait lancé comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mon_script.pl argv1 argv2 argv3 argv4
    Si ça peut t'aider ?

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par ctobini
    Justement, si le code Python est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    print 'Saisir :'
    n = input()
    C'est possible d'appliquer un regex pour 'Saisir', mais comment faire comprendre à Expect que c'est au moment de l'input qu'il faut envoyer du texte ?

    C. Tobini
    Tu n'essaie jamais de tester les choses par toi-même ? Si tu utilise expect() avec la bonne regex ça attends que la regex ait bien été matché. Donc si tu fait un send() après, ça sera bien envoyé au input...

    --
    Jedaï

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Et tu crois que j'ai fait un post sauvage sans tourner le expect et le send dans tous les sens ?

    L'input renvoie un timeout car le send essaie d'envoyer la chaîne sur le regex, ce qui me semble normal puisque le send ne s'applique pas à la ligne de sortie traitée par le regex mais sur l'input.

  9. #9
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Dans tous les sens ? Pas assez en tout cas, car les deux programmes suivants marchent parfaitement ensemble :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #! /usr/bin/perl
    use strict; use warnings;
     
    use Expect;
     
    my $exp = Expect->spawn( "python test_expect.py" );
     
    $exp->expect( 300, "Saisir : " );
    $exp->send( "32\n" );
     
    $exp->expect( undef );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #! /usr/bin/python
     
    print "Saisir : "
    truc = input();
    print "##" , truc , "##"
    ...

    --
    Jedaï

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Bon, ben c'est parfait, ça marche ! Merci beaucoup !

    Vu que tu es expérimenté, que tu sembles connaître expect et que j'ai envoyé un code simplissime, pourquoi ne pas m'avoir mis dans ton premier post qu'il fallait ajouter

    pour indiquer qu'il n'y a plus d'entrée, au lieu de me laisser patauger ?

    C. Tobini

  11. #11
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Je ne connais rien à Expect, ne l'ai jamais utilisé, et je me suis spécialement plongé dans sa doc pour t'aider... (je note que tu n'as jamais envoyé de code Perl que j'aurais pu facilement corriger...)
    Quant au expect(undef), il sert simplement à attendre indéfiniment, de façon à laisser le script Python tourner.

    De rien !

    --
    Jedaï

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    OK, je t'en remercie sincérement, inutile d'être agressif dans tous tes posts, je ne t'agresse pas !

    Pour ce qui est du code Perl, ça ne va pas plus loin que les 4 lignes que j'ai donné en exemple, tu vois bien qu'il ne manquait que le 'undef' pour que ça fonctionne, ce que je n'avais pas assimilé en lisant la doc.

    En tout cas merci encore, ça m'enlève une sérieuse épine du pied.

    C. Tobini

  13. #13
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Calmez les esprits les amis!!! Pas la peine de s'enerver, tel n'est pas le but du forum.
    Si le probleme est résolu ctobini, oublie pas de mettre un tag resolu. (bas de page, à gauche)
    Merci de votre compréhension,
    Djibril

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ouvrir des fichiers avec des programmes externes
    Par julie_lab dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 25/10/2010, 06h05
  2. Réponses: 3
    Dernier message: 07/08/2008, 10h00
  3. saisie automatique avec un programme
    Par k_boy dans le forum Sécurité
    Réponses: 10
    Dernier message: 29/05/2008, 08h29
  4. [Runtime] probleme avec l'execution d'un programme externe
    Par Jérémy Lefevre dans le forum API standards et tierces
    Réponses: 18
    Dernier message: 21/06/2007, 12h57
  5. [C#] Comment interagir avec un EXE externe ?
    Par therock dans le forum C#
    Réponses: 2
    Dernier message: 16/08/2006, 18h56

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