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

Interfaces Graphiques Perl Discussion :

Redirection d'un flux de sortie system vers widget text


Sujet :

Interfaces Graphiques Perl

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 67
    Points : 40
    Points
    40
    Par défaut Redirection d'un flux de sortie system vers widget text
    Bonjour,

    J'ai développé un programme perl dans lequel je souhaite intègrer quelques commandes systèmes.
    Ces commandes possède un mode verbeux (-v) qui permet d'afficher le deroulement de l'opération sur la sortie (affichage sur une fenetre shell).
    J'aimerai pouvoir rediriger ma sortie sur un de mes widgets (une zone de texte).

    Est-ce possible?

    Merci d'avance.

  2. #2
    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 : 499 184
    Points
    499 184

  3. #3
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 67
    Points : 40
    Points
    40
    Par défaut
    Merci beaucoup!

  4. #4
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 67
    Points : 40
    Points
    40
    Par défaut Redirection d'un flux de sortie system vers widget text
    Bonjour,

    J'ai mis trop vite résolu dans mon dernier poste...
    La procedure qui m'a été fournie ne permet pas ce que je veux (ou alors je n'ai pas compris ).

    En fait j'aimerais lorsque dans mon programme sont exécutés des commandes systèmes (type linux) que la sortie de cette commande soit redirigée vers mon widget texte.

    Par exemple: si je fais `rm blabla.txt` et que le fichier n'existe pas, je souhaiterai voir le message d'erreurs affiché dans mon widget et non dans mon shell.

    Avez-vous une idée?

    Merci d'avance.

  5. #5
    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 : 499 184
    Points
    499 184
    Par défaut
    Bah c'est exactement ce que le tutoriel t'explique. J'y explique comment rediriger de plusieurs façons différentes les affichages shell de TYPE STDOUT ou STDERR dans un widget Text.

    Montre nous ce que tu as fait comme bout de code.

  6. #6
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 67
    Points : 40
    Points
    40
    Par défaut
    En fait ce sont les print et printf des exemples qui m'ont induit en erreur (je pensai que seul ces commandes etaient redirigées)...
    En revanche j'ai essayer de le faire avec mon rm et cela ne fontionne pas...

    Voici mon code:

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    #!/usr/bin/perl
    use warnings;
    use strict;
    use Tk;   
     
     
    my $fenetre = new MainWindow(
      -title      => "Première fenêtre Tk ",
      -background => "white",
    ); 
     
    # Affichage d'un bouton pour fermer la fenêtre
    my $bouton = $fenetre->Button (
        -text    => "Supprimer fichier", 
    	-command => \&suprfic,
    )->pack();
     
     
    my $texte = $fenetre->Text()->pack; 
     
    $texte->Text(-setgrid => 'true'); 
    my $search_string = ''; 
    my $w_string = $fenetre->Frame()->pack(-side => 'top', -fill => 'x'); 
    my $w_string_label = $w_string->Label(-text => 'Search string:', -width => 13, -anchor => 'w'); 
    my $w_string_entry = $w_string->Entry(-textvariable => \$search_string); 
    my $w_string_button = $w_string->Button(-text => 'Highlight');
     
    tie *STDOUT, ref $texte, $texte;
     
    MainLoop();  
     
    sub suprfic { 
      `rm blal.txt`;
     
      return; 
    }
    Merci pour ton aide.

  7. #7
    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 : 499 184
    Points
    499 184
    Par défaut
    Voici donc une procédure qui peut te permettre de récupérer tout. Je l'ai testé sous Windows et Linux et ça fonctionne correctement.

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    #!/usr/bin/perl
    use warnings;
    use strict;
    use Tk;
     
    my $fenetre = new MainWindow(
      -title      => "Première fenêtre Tk ",
      -background => "white",
    );
     
    # Affichage d'un bouton pour fermer la fenêtre
    my $bouton = $fenetre->Button(
      -text    => "Supprimer fichier",
      -command => \&suprfic,
    )->pack();
     
    my $texte = $fenetre->Text()->pack;
     
    $texte->Text( -setgrid => 'true' );
    my $search_string   = '';
    my $w_string        = $fenetre->Frame()->pack( -side => 'top', -fill => 'x' );
    my $w_string_label  = $w_string->Label( -text => 'Search string:', -width => 13, -anchor => 'w' );
    my $w_string_entry  = $w_string->Entry( -textvariable => \$search_string );
    my $w_string_button = $w_string->Button( -text => 'Highlight' );
     
    # Redirection STDOUT et STDERR
    RedirectionFlux($texte);
     
    MainLoop();
     
    sub suprfic {
      `rm blal.txt`;
     
      return;
    }
     
    #=========================================================================
    # Procedure rediriger le STDOUT STDERR
    #=========================================================================
    sub RedirectionFlux {
      my ($Scrolled) = @_;
     
      require File::Temp;
      my ( $fh_stdout, $FichierSTDOUT ) = File::Temp::tempfile( UNLINK => 1 );
      my ( $fh_stderr, $FichierSTDERR ) = File::Temp::tempfile( UNLINK => 1 );
     
      open( STDOUT, '>', $FichierSTDOUT );
      open( STDERR, '>', $FichierSTDERR );
     
      # Lancement d'une fonctionne qui surveille le STDOUT toutes les 0.5 secondes
      my $TailleOctetLuSTDOUT = 0;
      my $TailleOctetLuSTDERR = 0;
     
      #=========================================================================
      # Procedure pour lire un fichier à partir d'un certain nombre d'octet
      # Et on affiche le contenu dans un widget
      #=========================================================================
      my $SubLectureFichierParOctets = sub {
        my ( $Fichier, $RefTextWidget, $RefTailleOctetsFichierLu ) = @_;
     
        my $buffer;    # Data du fichier à lire
        my $buffer_size = 1000;    # Lecture par 1000 octets
     
        open( FIC, '<', $Fichier )
          or die("Impossible de lire le fichier $Fichier\n");
     
        # On commence la lecture du fichier depuis le début à partir d'un certain
        # nombre d'octets
        seek( FIC, ${$RefTailleOctetsFichierLu}, 0 );
        while ( read( FIC, $buffer, $buffer_size ) != 0 ) {
          $RefTextWidget->insert( 'end', $buffer );
        }
        close(FIC);
     
        # Taille fichier
        ${$RefTailleOctetsFichierLu} = ( stat($Fichier) )[7];
     
        return;
      };
     
      $Scrolled->repeat( 500, [ $SubLectureFichierParOctets, $FichierSTDOUT, $Scrolled, \$TailleOctetLuSTDOUT ] );
      $Scrolled->repeat( 500, [ $SubLectureFichierParOctets, $FichierSTDERR, $Scrolled, \$TailleOctetLuSTDERR ] );
     
      return;
    }

  8. #8
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 67
    Points : 40
    Points
    40
    Par défaut
    Ca fonctionne bien en effet!
    Merci beaucoup.

    Bonne journée.

  9. #9
    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 : 499 184
    Points
    499 184
    Par défaut
    Base toi sur la documentation que j'ai mise à jour. La fonction est encore beaucoup plus simplifiée.

  10. #10
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 67
    Points : 40
    Points
    40
    Par défaut
    Je vais t'embêter encore un peu je crois.
    Je voulais juste savoir si tu avais tester ton programme avec des commandes qui fonctionnent?
    Parce que j'ai vu que les STDERR sont bien redirigés (par ex un rm sur un fichier n'existant pas) mais les STDOUT ne le sont pas (par ex un ls ou un dir)...

  11. #11
    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 : 499 184
    Points
    499 184
    Par défaut
    Pour moi tout fonctionne correctement. Je le dis bien dans la doc, tout ce qui doit être affiché dans la console le sera dans le widget, testé et approuvé par mes soins

  12. #12
    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 : 499 184
    Points
    499 184
    Par défaut
    Peux tu me montrer ton script que tu testes ?
    Merci.

  13. #13
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 67
    Points : 40
    Points
    40
    Par défaut

    En fait j'ai fait le test sur le code que tu m'as proposé un peu plus haut en remplaçant le rm `blal.txt` par un `DIR` (je le test qsous windows)...

    Et il n'y a vraiment aucun affichage... Je l'ai donc testé sous linux et pareil pas d'affichage avec un ls... Je te remet le code au cas ou..

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    #!/usr/bin/perl
    use warnings;
    use strict;
    use Tk;
     
    my $fenetre = new MainWindow(
      -title      => "Première fenêtre Tk ",
      -background => "white",
    );
     
     
    # Affichage d'un bouton pour fermer la fenêtre
    my $bouton = $fenetre->Button(
      -text    => "Supprimer fichier",
      -command => \&suprfic,
    )->pack();
     
    my $texte = $fenetre->Text()->pack;
     
    $texte->Text( -setgrid => 'true' );
     
    #tie *STDOUT, ref $texte, $texte;
     
    my $search_string   = '';
    my $w_string        = $fenetre->Frame()->pack( -side => 'top', -fill => 'x' );
    my $w_string_label  = $w_string->Label( -text => 'Search string:', -width => 13, -anchor => 'w' );
    my $w_string_entry  = $w_string->Entry( -textvariable => \$search_string );
    my $w_string_button = $w_string->Button( -text => 'Highlight' );
     
    # Redirection STDOUT et STDERR
    RedirectionFlux($texte);
     
    MainLoop();
     
    sub suprfic {
     `DIR`;
     
      return;
    }
     
    #=========================================================================
    # Procedure rediriger le STDOUT STDERR
    #=========================================================================
    sub RedirectionFlux {
      my ($Scrolled) = @_;
     
      require File::Temp;
      my ( $fh_stdout, $FichierSTDOUT ) = File::Temp::tempfile( UNLINK => 1 );
      my ( $fh_stderr, $FichierSTDERR ) = File::Temp::tempfile( UNLINK => 1 );
     
      open( STDOUT, '>', $FichierSTDOUT );
      open( STDERR, '>', $FichierSTDERR );
     
      # Lancement d'une fonctionne qui surveille le STDOUT toutes les 0.5 secondes
      my $TailleOctetLuSTDOUT = 0;
      my $TailleOctetLuSTDERR = 0;
     
      #=========================================================================
      # Procedure pour lire un fichier à partir d'un certain nombre d'octet
      # Et on affiche le contenu dans un widget
      #=========================================================================
      my $SubLectureFichierParOctets = sub {
        my ( $Fichier, $RefTextWidget, $RefTailleOctetsFichierLu ) = @_;
     
        my $buffer;    # Data du fichier à lire
        my $buffer_size = 1000;    # Lecture par 1000 octets
     
        open( FIC, '<', $Fichier )
          or die("Impossible de lire le fichier $Fichier\n");
     
        # On commence la lecture du fichier depuis le début à partir d'un certain
        # nombre d'octets
        seek( FIC, ${$RefTailleOctetsFichierLu}, 0 );
        while ( read( FIC, $buffer, $buffer_size ) != 0 ) {
          $RefTextWidget->insert( 'end', $buffer );
        }
        close(FIC);
     
        # Taille fichier
        ${$RefTailleOctetsFichierLu} = ( stat($Fichier) )[7];
     
        return;
      };
     
      $Scrolled->repeat( 500, [ $SubLectureFichierParOctets, $FichierSTDOUT, $Scrolled, \$TailleOctetLuSTDOUT ] );
      $Scrolled->repeat( 500, [ $SubLectureFichierParOctets, $FichierSTDERR, $Scrolled, \$TailleOctetLuSTDERR ] );
     
      return;
    }
    Merci bien en tout cas.

  14. #14
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 67
    Points : 40
    Points
    40
    Par défaut
    En mettant un system("DIR") à la place de `DIR`, ça fonctionne
    Je ne sais pas trop pourquoi mais bon...
    Désolé pour le derangement.

    Et merci infiniment!

  15. #15
    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 : 499 184
    Points
    499 184
    Par défaut
    Je te recommande une fois de plus de prendre le code de l'article qui est plus à jour . Et de plus `DIR` retourne le résultat dans une variable. Donc c'est normal que rien ne s'affiche.

  16. #16
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 67
    Points : 40
    Points
    40
    Par défaut
    Ok je vais prendre le code de l'article.
    Merci.

  17. #17
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Désolé de resortir ce sujet qui date un petit peu, mais je m'amuse un peu sur un script dont j'ai besoin de créer des logs des outputs et donc je me sert du super tuto ici : http://djibril.developpez.com/tutori...kstdoutstderr/

    Je suis interressé par l'affichage progressif ainsi que la sauvegarde dans un fichier. En adaptant la derniere solution au lieu de le faire travaller dans un fichier temp, je lui met un fichier texte. J'ai mon fichier texte et la redirection dans mon widget mais rien de progressif..

    En faite j'ai meme tester l'exemple disponible sur la page et en agrandissant les sub c'est pas progressif et je n'ai pas l'affichage tant que le sub n'est pas terminé...

    par exemple :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #!/usr/bin/perl
    use warnings;
    use strict;
    use Tk;
     
    my $fenetre = new MainWindow(
      -title      => "Redirection progressif",
      -background => "white",
    );
     
    my $Scrolled = $fenetre->Scrolled(
      "Text",
      -height     => 10,
      -wrap       => "none",
      -relief     => "solid",
      -background => "white",
      -scrollbars => "oe",
    )->pack( qw/ -side bottom -pady 15 -padx 15 -fill both -expand 1 / );
     
    # Affichage d'un bouton pour fermer la fenêtre
    $fenetre->Button(
      -text    => "Faire un die",
      -command => sub { die rand(100),"\n\n"; },
    )->pack( qw/ -side left -pady 15 -padx 15 /);
     
    $fenetre->Button(
      -text    => "Dire Bonjour\navec print",
      -command => sub { print "Bonjour print\n\n"; sleep 1;print "Bonjour print\n\n"; sleep 1;print "Bonjour print\n\n"; sleep 1;print "Bonjour print\n\n"; sleep 1; },
    )->pack( qw/ -side left -pady 15 -padx 15 /);
     
    $fenetre->Button(
      -text    => "Dire Bonjour\navec printf",
      -command => sub { printf "%s Bonjour\n\n", "printf"; },
    )->pack( qw/ -side left -pady 15 -padx 15 /);
     
    $fenetre->Button(
      -text    => "Dire Bonjour\navec syswrite",
      -command => sub { syswrite STDOUT, ("Bonjour syswrite\n\n"); },
    )->pack( qw/ -side left -pady 15 -padx 15 /);
     
     
     
    # Redirection STDOUT et STDERR
    RedirectionFlux($Scrolled);
     
    MainLoop();
    quand je click sur le deuxieme bouton je n'aurait la sortie qu'en une seule fois au bout de 4 secondes.

    Je souhaite avoir un systeme qui me fasse le print, la pause d'une sec, le print, etc...

    Une idée si c'est le comportement que devrait avoir le script ou c'est un autre probleme, ou si il faut passer par un autre systeme?

    Merci tout plein!

  18. #18
    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 : 499 184
    Points
    499 184
    Par défaut
    Bonjour,

    Bienvenu sur le forum Perl.

    En faite, le comportement que tu viens de relater est normal car dans ton exemple, tu fais des sleep. Donc tu endors le programme (donc fige l'application). Ce n'est donc pas de cette façon que tu peux tester le programme.

    Ce que tu peux faire, c'est par exemple de rajouter du contenu dans le fichier que tu lit au lieu de faire des sleep, et même pourquoi pas de rajouter des données dans le fichier à la main. normalement, le programme remplira ton widget au fur et à mesure.

  19. #19
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta réponse et ton accueil

    En faite le sleep c'étais pour tester, mais dans mon script c'est principalement des fmove, print, fcopy, print, requette telnet, print, lecture du fichier, print... etc...

    Mais cela s'affiche uniquement quand le sub a fini, c'est a dire plusieur seconde apres sont lancement..

    Pour l'instant j'ai exactement la meme technique que le tuto avec le fichier temporaire, et c'est toujours en bloc que je recois la sortie.. Je tourne sous windows et non sur linux. Cela pourrait il en etre la raison?

    Merci pour ton aide

  20. #20
    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 : 499 184
    Points
    499 184
    Par défaut
    Il faut penser à rafraichir la fenêtre dans ton sub
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $fenetre->Button(
      -text    => "Dire Bonjour\navec print",
      -command => sub {
        for (1..1000000) {
          print "$_\n";
          $fenetre->update;
        }
      },
    )->pack(qw/ -side left -pady 15 -padx 15 /);

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

Discussions similaires

  1. redirection stdout venant d'un autre module vers widget Text (encore)
    Par jaasta dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 16/02/2010, 14h26
  2. Redirection sortie standard vers widget text
    Par issoram dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 23/01/2009, 17h57
  3. Redirection sortie JBoss vers console
    Par Mister Nono dans le forum Wildfly/JBoss
    Réponses: 4
    Dernier message: 23/12/2008, 18h37
  4. redériger la sortie d'un appel system vers un fichier?
    Par foufoulina2007 dans le forum Langage
    Réponses: 5
    Dernier message: 27/07/2007, 08h24

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