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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 67
    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 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822

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

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 67
    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 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    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 confirmé
    Inscrit en
    Avril 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 67
    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 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    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 confirmé
    Inscrit en
    Avril 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 67
    Par défaut
    Ca fonctionne bien en effet!
    Merci beaucoup.

    Bonne journée.

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

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