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 :

Fichiers temporaires - créer et utiliser ?


Sujet :

Langage Perl

  1. #1
    Membre habitué Avatar de Leishmaniose
    Homme Profil pro
    Ingénieur Bio-industries
    Inscrit en
    Novembre 2003
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur Bio-industries
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2003
    Messages : 145
    Points : 141
    Points
    141
    Par défaut Fichiers temporaires - créer et utiliser ?
    Salut,

    J'arrive pas à trouver de solution à mon problème et ça commence à durer...

    Mon script Perl doit créer deux fichiers temporaires pour y faire circuler temporairement des données : un temp_input ($input_query) et un temp_output ($output). Ces fichier seront utiliser ensuite dans un processus faisant appel à un autre programme à travers la commande 'system'. Pour résumer, je vous communique la totalité de mon code sachant que ça n'a pas voulu marché
    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
     
    #!/engine/perl/bin/perl.exe
     
    use strict;
    use warnings;
    use CGI;
    use IO::File;
     
    print "Content-type: text/html\n\n";
     
    my $form = new CGI;
     
    my $program = $form->param('program');
    my $datalib = $form->param('datalib');
    my $sequence = $form->param('sequence');
    my $path = $form->param('fichierseq');
    my $matrix = $form->param('matrix');
    my $evalue = $form->param('evalue');
    my $filter = $form->param('filter');
     
    $ARGV[0]=' -p ';
    $ARGV[1]=' -i ';
    $ARGV[2]=' -d ';
    $ARGV[3]=' -o ';
    $ARGV[4]=' -T ';
    $ARGV[5]=' -e ';
    $ARGV[6]=' -M ';
    $ARGV[7]=' -F ';
     
    my $input_query = IO::File->new_tmpfile()||die "Unable to make new bl_input temporary file: $!";
    my $blastall = "\\Blast\\blastall.exe";
    my $DB = "\\Blast\\$datalib";
    my $output = IO::File->new_tmpfile()||die "Unable to make new bl_output temporary file: $!";
     
    if ($path eq '') {
      if ($sequence ne '') {
        open (FQ, ">$input_query") || die("Problème avec le fichier $input_query : $!");
        print FQ $sequence;
        close (FQ);
        system($blastall.$ARGV[0].$program.$ARGV[7].$filter.$ARGV[1].$input_query.$ARGV[2].$DB.$ARGV[3].$output.$ARGV[5].$evalue.$ARGV[6].$matrix.$ARGV[4]);
        wait;
      }
      else {
        open (OUT, ">$output") || die("Problème avec le fichier $output : $!");
        print OUT "<html>
    <head>
    <title>ERROR_#bl001</title>
    </head>
    <body>
    <p><strong><font color=\"#A800000\" size=\"3\" face=\"Verdana, Arial, Helvetica, sans-serif\">ERROR<font color=\"#666666\"> &#91;#bl001&#93;</font><br><br>
    <font color=\"#000000\">Input sequence was not sized...</font></font></strong></p>
    </body>
    </html>";
        close &#40;OUT&#41;;
      &#125;
    &#125;
    else &#123;
      if &#40;$sequence eq ''&#41; &#123;
        open &#40;FS, $path&#41; || die&#40;"Can not open $path &#58; $!"&#41;;
        my @seq = <FS>;
        close &#40;FS&#41;;
        open &#40;F, ">$input_query"&#41; || die&#40;"Problème avec le fichier $input_query &#58; $!"&#41;;
        print F @seq;
        close &#40;F&#41;;
        system&#40;$blastall.$ARGV&#91;0&#93;.$program.$ARGV&#91;7&#93;.$filter.$ARGV&#91;1&#93;.$input_query.$ARGV&#91;2&#93;.$DB.$ARGV&#91;3&#93;.$output.$ARGV&#91;5&#93;.$evalue.$ARGV&#91;6&#93;.$matrix.$ARGV&#91;4&#93;&#41;;
        wait;
      &#125;
      else &#123;
        open &#40;OUT, ">$output"&#41; || die&#40;"Problème avec le fichier $output &#58; $!"&#41;;
        print "<html>
    <head>
    <title>ERROR_#bl002</title>
    </head>
    <body>
    <p><strong><font color=\"#A800000\" size=\"3\" face=\"Verdana, Arial, Helvetica, sans-serif\">ERROR<font color=\"#666666\"> &#91;#bl002&#93;</font><br><br>
    <font color=\"#000000\">The text area and the browse menu can not be both used for seizure...</font></font></strong></p>
    </body>
    </html>";
        close &#40;OUT&#41;;
      &#125;
    &#125;
     
    open&#40;OUT,$output&#41; || die&#40;"Problème avec le fichier $output &#58; $!"&#41;;
    while&#40;<OUT>&#41; &#123;
          print;
    &#125;
    close&#40;OUT&#41;;
     
    exit;
    De l'aide SVP.

    Merci

  2. #2
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Déjà, je t'inviterais à utiliser autre chose que @ARGV pour passer des paramètres à ta commande système (c'est un tableau réservé à un usage spécifique). Ensuite je ferais un print de celle-ci pour voir ce que tu envoies réellement. Essaie par exemple de la taper juste comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    my $exec = `$blastall -p $program -F $filter -i $input_query -d $DB -o $output -e $evalue -M $matrix -T`;
     
    ou
     
    my $exec = system&#40;"$blastall -p $program -F $filter -i $input_query -d $DB -o $output -e $evalue -M $matrix -T"&#41;;
    $exec te dira ce qu'il pense de ta commande...

    A part ca, dis nous si tu as un message d'erreur

  3. #3
    Membre habitué Avatar de Leishmaniose
    Homme Profil pro
    Ingénieur Bio-industries
    Inscrit en
    Novembre 2003
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur Bio-industries
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2003
    Messages : 145
    Points : 141
    Points
    141
    Par défaut
    salut,

    J'ai fais exactement comme vous me l'avez dis et voici mon nouveau 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
    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
    #!C&#58;/PROGRA~1/EasyPHP1-7/perl/bin/perl.exe
     
    use strict;
    use warnings;
    use CGI;
    use IO&#58;&#58;File;
     
    print "Content-type&#58; text/html\n\n";
     
    my $form = new CGI;
     
    my $program = $form->param&#40;'program'&#41;;
    my $datalib = $form->param&#40;'datalib'&#41;;
    my $sequence = $form->param&#40;'sequence'&#41;;
    my $path = $form->param&#40;'fichierseq'&#41;;
    my $matrix = $form->param&#40;'matrix'&#41;;
    my $evalue = $form->param&#40;'evalue'&#41;;
    my $filter = $form->param&#40;'filter'&#41;;
     
    my $input_query = IO&#58;&#58;File->new_tmpfile&#40;&#41;||die "Unable to make new bl_input temporary file&#58; $!";
    my $blastall = "\\DWebPro\\deploy\\www\\Blast\\blastall.exe";
    my $DB = "\\DWebPro\\deploy\\www\\Blast\\$datalib";
    my $output = IO&#58;&#58;File->new_tmpfile&#40;&#41;||die "Unable to make new bl_output temporary file&#58; $!";
     
    if &#40;$path eq ''&#41; &#123;
      if &#40;$sequence ne ''&#41; &#123;
        open &#40;FQ, ">$input_query"&#41; || die&#40;"Problème avec le fichier $input_query &#58; $!"&#41;;
        print FQ $sequence;
        close &#40;FQ&#41;;
        my $exec = system&#40;"$blastall -p $program -F $filter -i $input_query -d $DB -o $output -e $evalue -M $matrix -T"&#41;;
        wait;
      &#125;
      else &#123;
        open &#40;OUT, ">$output"&#41; || die&#40;"Problème avec le fichier $output &#58; $!"&#41;;
        print OUT "<html>
    <head>
    <title>ERROR_#bl001</title>
    </head>
    <body>
    <p><strong><font color=\"#A800000\" size=\"3\" face=\"Verdana, Arial, Helvetica, sans-serif\">ERROR<font color=\"#666666\"> &#91;#bl001&#93;</font><br><br>
    <font color=\"#000000\">Input sequence was not sized...</font></font></strong></p>
    </body>
    </html>";
        close &#40;OUT&#41;;
      &#125;
    &#125;
    else &#123;
      if &#40;$sequence eq ''&#41; &#123;
        open &#40;FS, $path&#41; || die&#40;"Can not open $path &#58; $!"&#41;;
        my @seq = <FS>;
        close &#40;FS&#41;;
        open &#40;F, ">$input_query"&#41; || die&#40;"Problème avec le fichier $input_query &#58; $!"&#41;;
        print F @seq;
        close &#40;F&#41;;
        my $exec = system&#40;"$blastall -p $program -F $filter -i $input_query -d $DB -o $output -e $evalue -M $matrix -T"&#41;;
        wait;
      &#125;
      else &#123;
        open &#40;OUT, ">$output"&#41; || die&#40;"Problème avec le fichier $output &#58; $!"&#41;;
        print "<html>
    <head>
    <title>ERROR_#bl002</title>
    </head>
    <body>
    <p><strong><font color=\"#A800000\" size=\"3\" face=\"Verdana, Arial, Helvetica, sans-serif\">ERROR<font color=\"#666666\"> &#91;#bl002&#93;</font><br><br>
    <font color=\"#000000\">The text area and the browse menu can not be both used for seizure...</font></font></strong></p>
    </body>
    </html>";
        close &#40;OUT&#41;;
      &#125;
    &#125;
     
    open&#40;OUT,$output&#41; || die&#40;"Problème avec le fichier $output &#58; $!"&#41;;
    while&#40;<OUT>&#41; &#123;
          print;
    &#125;
    close&#40;OUT&#41;;
     
    exit;
    mais je dois vous préciser que mon problème se situe plutôt au niveau de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $input_query = IO&#58;&#58;File->new_tmpfile&#40;&#41;||die "Unable to make new bl_input temporary file&#58; $!";
    my $output = IO&#58;&#58;File->new_tmpfile&#40;&#41;||die "Unable to make new bl_output temporary file&#58; $!";
    D'ailleurs lorsque j'exécute le nouveau code, apache me revoie ce message d'erreur relatif aux fichiers temporaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    &#91;Wed Jan 25 17&#58;39&#58;01 2006&#93; &#91;error&#93; &#91;client 127.0.0.1&#93;
    Problème avec le fichier IO&#58;&#58;File=GLOB&#40;0x1c584ec&#41; &#58; Invalid argument at c&#58;\PROGRA~1\EASYPH~1\cgi-bin\blast.cgi line 27.
    Je précise que la ligne 27 correspond à l'ouverture du 1er fichier tampon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open &#40;FQ, ">$input_query"&#41; || die&#40;"Problème avec le fichier $input_query &#58; $!"&#41;;
    Alors je me demande comment dois je faire pour créer deux fichiers temporaires différents pour les utiliser comme des tampons (l'un d'entrée (saisie) et l'autre de sortie (output du prcessus exec de blast dont le contenu sera afficher)).

    Merci beaucoup pour votre aide.

  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
    C'est simple : "IO::File->new_tmpfile()" te renvoie déjà un handler en écriture/lecture sur un fichier temporaire, tu n'as pas besoin de le rouvrir (en fait ça ne risque pas de marcher puisque le nom de fichier que ça te donne (qui est la stingification d'un objet, donc d'une référence bénie) n'est pas tout à fait acceptable en tant que nom de fichier sur la plupart des systèmes d'exploitation).
    Tu utilises directement $output, dans "print $output "Machin truc !";" ou $input dans "my @lines = <$input>;".

    --
    Jedaï

Discussions similaires

  1. Réponses: 13
    Dernier message: 30/11/2006, 13h01
  2. [c#]Créer un fichier temporaire
    Par chasse dans le forum Windows Forms
    Réponses: 1
    Dernier message: 29/10/2006, 14h26
  3. Réponses: 3
    Dernier message: 28/09/2006, 12h37
  4. Créer un fichier temporaire
    Par duchere dans le forum Langage
    Réponses: 7
    Dernier message: 04/06/2006, 01h57
  5. [Applet] Créer un fichier temporaire
    Par leminipouce dans le forum Applets
    Réponses: 21
    Dernier message: 28/07/2005, 17h16

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