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 :

modifier STDOUT afin d'écrire dans un fichier


Sujet :

Langage Perl

  1. #1
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut modifier STDOUT afin d'écrire dans un fichier
    Bonjour,

    J'ai un script qui fait appel à un software : ClustalW. Ce dernier renvoie les valeurs de ses calculs à l'écran. J'aimerais savoir si il est possible de les récupérer dans un fichier. Le STDOUT de sortie est l'écran comment puis-je le modifier? Je n'ai pas trouvé de réponse dans la FAQ's.

    J'ai trouvé sur le net cette explication
    http://www.dil.univ-mrs.fr/~chris/Perl/Fichiers.htm
    La procédure écrit une ligne sur le périphérique standard de sortie <STDOUT>.
    Avant l'instruction "select (FICHIER);", le message apparait bien sur l'écran qui est toujours le périphérique de sortie standard.
    Par contre, l'exécution de cette instruction effectue une redirection de <STDOUT> vers le fichier explicitement spécifié. La seconde écriture se fait sur le fichier en question.
    Voici le script dans lequel j'aimerais modifier STDOUT
    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
    use strict;
    use Bio::Tools::Run::Alignment::Clustalw;
     
    open (FICHIER,">value.txt");
    select (FICHIER);
     
    my @fichiers = qw(P:/.../test.txt);
     
     
    foreach my $fich (@fichiers){
        &ClustalW2 ($fich);
     
    }
     
    close (FICHIER);
    Mais le fichier reste vide et les scores de ClustalW apparaissent à l'écran.


    Merci pour votre aide,
    -- Jasmine --

  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
    C'est sans doute parce que ClustalW n'écrit pas sur STDOUT mais sur STDERR, pour rediriger STDERR, il suffit de le rouvrir sur le bon fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    close STDERR;
    open STDERR, '>', "fichier"
      or die "...";
    D'un autre côté, as-tu conscience qu'il te suffit de lancer ton script avec les bonnes redirections pour obtenir le même effet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl tonScript.pl 2>fichier
    ??

    --
    Jedaï

  3. #3
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    D'un autre côté, as-tu conscience qu'il te suffit de lancer ton script avec les bonnes redirections pour obtenir le même effet
    J'avais vu cela au cours de linux, il y a trois ans à la fac. Je préfère lancer directement mon script via l'éditeur car mes scripts sont écrits sur un disque virtuel (dans une très grande arborescence de fichiers) alors que Perl est installé sur un des disques durs.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl tonScript.pl 2>fichier
    A quoi sert le 2?


    Pour ce qui est de STDERR, c'est étrange car les scores sont toujours écrit à l'écran par contre les messages d'erreurs sont écrits dans le fichier.
    Par exemple, le message d'erreur quand je n'envoie qu'une seule séquence dans l'alignement.
    ------------- EXCEPTION -------------
    MSG: Bad input data (sequences need an id ) or less than 2 sequences in ARRAY(0x20c74ac) !
    STACK Bio::Tools::Run::Alignment::Clustalw::align C:/Perl/site/lib/Bio/Tools/Run/Alignment/Clustalw.pm:484
    STACK main::ClustalW2 P:\Perl\scripts2\PCR_BA~1\SUB_CL~1.PL:57
    STACK toplevel P:\Perl\scripts2\PCR_BA~1\SUB_CL~1.PL:15

    --------------------------------------
    Les messages 'courant' de perl (comme l'oubli d'une déclaration) apparaissent toujours à l'écran.

    On dirait qu'il y a trois flux
    - les messages d'erreur de Perl
    - les scores de ClustalW
    - les messages d'erreur en relation avec ClustalW qui doivent provenir du module de Bio



    Maintenant au sujet de la console

    J'ai testé le script via la console (Windows). J'ai copié le script.pl dans le répertoire Perl/bin, j'y ai crée un fichier ClustalW_values.txt vide. Ensuite, je me suis placée dans le répertoire de Perl et j'ai effectué la commande
    c:\Perl> perl sub_ClustalW.pl 2>ClustalW_values.txt
    Et là, rien du tout même pas un message d'erreur et le fichier texte est toujours vide.



    Merci pour ton aide,
    -- Jasmine --

  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
    Essaie de rouvrir STDOUT comme je l'ai fait pour STDERR, il est possible que ClustalW écrive directement sur STDOUT plutôt que d'utiliser simplement print.

    A quoi sert le 2?
    Le 2 est le numéro du flux à rediriger (1 est le STDOUT, 2 le STDERR)

    --
    Jedaï

  5. #5
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Essaie de rouvrir STDOUT comme je l'ai fait pour STDERR, il est possible que ClustalW écrive directement sur STDOUT plutôt que d'utiliser simplement print.
    Oui, cela fonctionne. Un grand merci pour ton aide.
    -- Jasmine --

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

Discussions similaires

  1. Créer et écrire dans un fichier.txt
    Par Furius dans le forum VBScript
    Réponses: 11
    Dernier message: 16/05/2016, 12h27
  2. Ouvrir et écrire dans un fichier .txt en T-SQL
    Par joul's dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 27/10/2008, 21h04
  3. [FTP] Lire et écrire dans un fichier
    Par dj-julio dans le forum Langage
    Réponses: 49
    Dernier message: 12/01/2006, 11h59
  4. [Rech. Comp.] Lire et écrire dans des fichiers XML
    Par Rodrigue dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/08/2005, 20h48
  5. [JAR] Comment écrire dans un fichier properties dans un jar
    Par Alec6 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 05/10/2004, 15h16

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