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 :

exécuter un script perl depuis un autre programme perl


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Points : 12
    Points
    12
    Par défaut exécuter un script perl depuis un autre programme perl
    Bonjour,

    débutant en perl, j'aimerais svp, que quelqu'un me débloque sur comment exécuter un script perl depuis un autre script. ds le programme perl ci-dessous, j'appelle Test.pl entre ` `et Test.pl ne s'exécute pas dans ce programme alors que j'arrive à l'exécuter tout seul en ligne de commande(pas besoin d'arguments). Quelqu'un pourrait il m'aider sur la question afin que j'avance car je suis vraiment buté à ce niveau.
    merci d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    my @ligne;
    open (USER_RECORDS , "toto.txt") || die ;
    sub function{
    $i=0;
    while (<USER_RECORDS>) {   # parcours fichier
       $i ++; 
       $lignecomplete=$_; #j'affecte chaque ligne à lignecomplete 
       (@maligne) = split(/,/,$lignecomplete); 
        `perl Test.pl `; #avec ou sans pointvirgule, ça marche pas
     }
    }
    function();

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Points : 12
    Points
    12
    Par défaut exécuter un script perl depuis un autre script perl
    C'est encore moi!!

    Pour la question posée là haut, je ne veux pas appeler une à une les fonctions ou procédures de Test.pl, ce que je veux, c'est exécuter tout le fichier systématiquement. c'est vraiment très urgent. je vous remercie d'avance.

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Comment sais-tu qu'il ne s'exécute pas ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  4. #4
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Bonjour,

    Aucun message d'erreur ?
    Qu'est censé faire ton script ? Est-il placé dans le même répertoire que ton script d'appel ?
    Es-tu sûr qu'il ne s'exécute pas parce que si tu ne récupères pas une sortie éventuelle de ton script Test.pl tu ne le verras pas s'exécuter (encore faut-il qu'il renvoie quelque chose).
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $sortie = `perl Test.pl`;
    print $sortie."\n";

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je pensais à la même chose que toi beniou

    Une autre alternative est d'utiliser system("perl Test.pl") (plus besoin de print).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    S'lut.

    Le script est censé exécuté Test.pl. Seulement, je me suis rendu compte après qu'il faut passer des params aux scripts, donc la ligne d'appel sera plutôt comme suit:
    `perl Test.pl -user $maligne[0]`;
    le reste du script que je vous ai passé avant restant inchangé. Et dans Test.pl, on retrouve: GetOptions('user=s' => \$user); avec $user qui est une variable string à Test.pl. j'ai bien ds Test.pl la librairie use Getopt::Long;

    je suis obligé de passer des params au script parce que je veux que @maligne soit visible de l'extérieur (option de cmd).

    Laisser moi vous dire que Test.pl appelle lui même un autre fichier toto.pm.

    j'arrive à exécuter Test.pl qui utilise toto.pm mais dans le programme actuel que je vous ai envoyé, ça bloque au niveau `perl Test.pl -user $maligne[0]`.
    j'ai essayé ce que vous m'avez dit mais ça pas marché.
    je peux me rendre effectivement compte du blocage en faisant des print de temps en temps pour controler son déroulement à l'exec.

    merci d'en tenir compte et de me venir en aide.

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je ne vois toujours pas en quoi "ça bloque"... qu'est-ce qui t'indique que le script Test.pl ne fonctionne pas ?
    Je rappelle que si tu fais des print dans Test.pl, pour les voir à l'écran si tu appelles ce script depuis un autre, il faut impérativement écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    system("perl Test.pl -user $maligne[0]");
    Et qui plus est, il est préférable d'activer l'autoflush dans Test.pl en ajoutant une ligne en début de script :
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Points : 12
    Points
    12
    Par défaut partiellement resolu
    Je vous remercie d'abord pour vos réponses.
    J'ai finalement pu entrer dans Test.pl en écrivant dans le prog que je vous ai envoyé: system ("perl Test.pl -users $maligne[0] -users $maligne[1] -users $maligne[2]") et dans Test.pl, j'ai une portion de code comme ceci:
    .............................
    my @values;
    @values=($user,$pwd,$Home);
    GetOptions('users=s' => \@values);
    printf ("je t'observe\n");
    printf("$values[0]");print("$values[1]");print("$values[2]");
    printf ("je t'observe\n");
    ..........................
    Le problème maintenant est que j'ai envie de m'assurer maintenant que les params ont bien été passés à Test.pl: c'est pourquoi j'ai fais printf("$values[0]");print("$values[1]");print("$values[2]"); mais il ne l'exécute pas puique j'observe sur la console l'affichage des print qui l'encadrent:
    je t'observe
    je t'observe
    Et je me demande bien pourquoi ces valeurs n'ont pas été passés ou bien ont elles été passées et pourquoi alors les print ne s'affiche pas sur la console?

    c'est assez urgent et merci une fois de plus de votre attention et de votre réponse

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Points : 12
    Points
    12
    Par défaut
    oui Philou,
    j'ai rajouté l'instruction perl que tu m'as conseillé.
    ma dernière question intitulé "partiellement résolu" reste toujours d'actualité.
    je te remercie de ton intervention qui me permet de creuser davantage sur le langage.

    Je suis encore et toujours en attente bloquante. Merci

  10. #10
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Pensez à utiliser aussi le module IPC::Run

  11. #11
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Si tu ne vois pas les print c'est que tes valeurs sont nulles ou alors une chaîne vide. Ca doit venir donc de ton split ou de ton fichier toto.txt qui n'est pas au bon format.

    Tu peux déjà regarder si ta commande fonctionne avec un appel direct à ton script avec des arguments définis (function1 dans mon exemple)
    J'ai essayé de créer un exemple de fichier toto.txt basé sur ton script.

    fichier exec.pl :
    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
    26
     
    use strict;
     
     
    sub function{
     
      system("perl Test.pl -users toto -users tata -users titi");
     
    }
     
    sub function2{
      open (USER_RECORDS , "toto.txt") || die "$!\n";
      while (my $line = <USER_RECORDS>) {
        if($line !~ /^\s+$/){# parcours fichier
          chomp($line);
          my ($arg1,$arg2,$arg3) = split(/,/,$line);
          my $commande = "perl Test.pl -users $arg1 -users $arg2 -users $arg3\n";
          system($commande);
        }
      }
      close(USER_RECORDS);
    }
     
     
    function();
    function2();
    fichier Test.pl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    use strict;
    use Getopt::Long;
     
    my @values;
     
    GetOptions('users=s' => \@values);
    printf("je t'observe\n");
    printf("$values[0]\t$values[1]\t$values[2]\n");
    printf("je t'observe\n");
    fichier toto.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    toto1,toto2,toto3
    titi1,titi2,titi3
    tatat1,tata2,tata3

    Cet exemple chez moi fonctionne

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Points : 12
    Points
    12
    Par défaut probleme de chaine composé
    Oui Beniou, merci pour cet exemple, il fonctionne chez moi aussi sauf que si dans ton fichier toto.txt, tu as une ligne du genre:
    tata,toto,titi marie
    le truc est qu'on a une chaine composée, ça nous fait par éclatement avec le split 3 sous chaines qu'on passe alors que sur la console, 'marie' n'apparait pas du tout;pourtant on devrait avoir 'titi marie' dans $values[2]. on a bien 'titi marie' dans $arg3, j'ai vérifié et pas dans $values[2], il jette l'autre partie.

    1) comment faire dans ce cas pour qu'on ait $values[2]="titi marie"?

    2) Juste pour comprendre ton truc: l'intruction
    if($line !~ /^\s+$/){# parcours fichier
    veut -elle dire que le modèle doit commencer en début de ligne sans contenir un caractère d'espacement (pour que le "if" soit vrai)? ou stp explique moi si cela traduit autre chose?

    Merci encore d'avance.

  13. #13
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par ngouagme Voir le message
    1) comment faire dans ce cas pour qu'on ait $values[2]="titi marie"?
    Pour obtenir 3 paramètres au maximum, il faut utiliser la forme à 3 paramètres de split (voir perldoc -f split) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          my ($arg1,$arg2,$arg3) = split(/,/,$line, 3);
    PS : pense à utiliser la balise [code] ... [/code] ou l'icône pour entourer le code perl que tu postes ici.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Points : 12
    Points
    12
    Par défaut re-iteration du probleme precedent
    slut,

    1) En ce qui concerne la question précédente, la réponse que tu m'as donnée (philou) ne marche pas, il m'affiche "titi" et pas "titi marie" comme troisième argument. Le problème est que quand il voit l'espace, il ignore l'autre partie de la chaine i.e., "marie"; pourtant je veux qu'il m'affiche "titi marie" comme troisième argument.

    2) soit les instructions perl ci-dessous qui utilise une librairie sélénium de perl. la "ème instruction prend en paramètre une instruction xpath. ce que je veux obtenir, c'est "Page personnelle de superuser" i.e., $msg[1]="superuser" (puisque je récupère superuser dans $msg[1] Sauf que mon formatage n'est pas bon puisqu'il m'affiche une erreur à la compilation. Comment pourrais je régler ce problème?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $message="User login ok, superuser";
    @msg = split(/,/,$message);
     $sel->is_element_present_ok("//td[\@class='headline']/a[\@title="Page personnelle de " . "$msg[1]"]");
    Merci de bien vouloir me répondre!

  15. #15
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Pour que ton script Test.pl prenne tous les arguments il faut que le premier script exec.pl passe les arguments avec des doubles quotes (qu'il faut protéger avec un /)

    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $commande = "perl Test.pl -users \"$arg1\" -users \"$arg2\" -users \"$arg3\"";
    system($commande);
    Ca devrait fonctionner. Sinon, tu devrais quand même regarder le module IPC::Run donné par Djibril : ce serait plus propre.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Points : 12
    Points
    12
    Par défaut probleme d'arguments resolu et formatage non résolu
    Merci Beniou pour cette précision; ça marche!

    j'ai galéré le week end dernier là dessus, et ça me soulage beaucoup.

    j'ai encore un problème de formatage de chaine qui concerne la dernière instruction du petit bout de code que je viens d'envoyer.
    et c'est encore galère. je pense qu'avec ça, je pourrai bien repartir.

    Merci encore!

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Points : 12
    Points
    12
    Par défaut erreur sur la console
    Pour l'instruction ci dessous avec les deux premières qui précèdent (voir message précédent,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sel->is_element_present_ok("//td[\@class='headline']/a[\@title="Page personnelle de" . " " . "$msg[1]"]")
    Voici les erreurs que la console Dos affiche:

    Missing operator before "."?
    Missing operator before $msg?
    missing operator before "]"?

    merci!

  18. #18
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    A première vue ce que tu veux faire c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sel->is_element_present_ok("//td[\@class='headline']/a[\@title=\"Page personnelle de $msg[1]\"]");
    Il faut protéger la double quote avec un \ pour ne pas fermer la chaîne de caractères. De plus, tu peux utiliser directement ta variable msg dans ta chaîne sans avoir à concaténer avec un .

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Points : 12
    Points
    12
    Par défaut resolu
    slut!
    merci, ça marche bien. en fait la var me permet de rendre mon code modulaire.
    Merci encore

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Points : 12
    Points
    12
    Par défaut erreur de compilation perl: variable indéfini
    Slut,
    j'ai une fonction InRdvDtata qui me dit que je n'ai pas initialisé $df[0] (on le constate en faisant un print comme fait ci-dessous. Cependant, la variable analogue $dd[0] marche bien! on dirait que le premier tableau en paramètre masque le second. Quelqu'un pourrait il m'aider à faire fonctionner ce bout de code?
    je veux récupérer avec les deux dernières instruction la date sous la forme 8-13-2015 et 15-13-2015.

    Merci d'avance!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub InRdvData {
        my ($mytxt, @dd, @df, $lieu) = @_;
        # Insert here the implementation
    	print ("mon text= $mytxt\t toto= $df[0]\t titi= $dd[1]\n");
    	my $d=$dd[0]."-".$dd[1]."-".$dd[2];
    	my $f=$df[0]."-".$df[1]."-".$df[2];
    }
    InRdvData("bidule", (8, 13, 2015),(15, 13, 2015),"Bureau");

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Exécuter script php depuis un autre serveur ?
    Par truser dans le forum Langage
    Réponses: 2
    Dernier message: 25/04/2014, 12h57
  2. Lancer un script cmd depuis un autre programme
    Par raffa dans le forum VBScript
    Réponses: 0
    Dernier message: 19/12/2012, 11h56
  3. lancement script perl depuis un autre script perl
    Par danathane dans le forum Langage
    Réponses: 4
    Dernier message: 19/01/2010, 14h54
  4. Réponses: 5
    Dernier message: 25/03/2009, 11h49
  5. Réponses: 5
    Dernier message: 23/02/2009, 10h21

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