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 :

script Perl incompatible de Windows 2000 à XP


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut script Perl incompatible de Windows 2000 à XP
    Salut, c'est encore moi

    Un script Perl conçu il y a quelques années et qui fonctionne très bien sur un poste équipé de Windows 2000 ne marche plus sous Windows XP.

    Versions Perl installées :
    - Windows 2000 : v5.6.1 build 635
    - Windows XP : v5.8.8 build 822
    Les deux versions proviennent d'ActiveState.

    Le script en question ne fait strictement rien de méchant : il fait un chdir() pour accéder à un fichier d'entrée qu'il ouvre pour le lire. Pour les besoins du log, la fonction localtime() est utilisée au lancement du programme pour indiquer la date et l'heure du jour. Ensuite, le script se contente de faire du warn dans le log ou du print dans un fichier de sortie ou sur la console Ms-Dos. Rien de bien sorcier !

    Dans les deux cas (2000 et XP), tout va bien : la fonction localtime fonctionne, tout ce qui doit être écrit dans le log l'est parfaitement. Le truc qui ne fonctionne pas, c'est qu'avant d'écrire dans un fichier de sortie non encore ouvert, j'affiche un bête print sur la console :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print "Ecriture dans fichier de sortie\n";
    open(SORTIE, etc etc.........);
    Ce print là s'affiche bien sous 2000 et le programme ouvre bien le fichier de sortie et va jusqu'à son terme normal. Sous XP, ce print là ne s'affiche pas !!!

    Encore plus fort : sous XP, si je rajoute ça dans le code ci-dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    print "AVANT print\n";
    print "Ecriture dans fichier de sortie\n";
    print "APRES print\n";
    open(SORTIE, etc etc.........);
    Sur la console Ms-Dos, j'ai ça qui s'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AVANT print
    APRES print
    Comme vous le voyez, le print niché au milieu ne s'affiche pas et bien entendu, le programme n'écrit rien dans le fichier de sortie. Il tourne en boucle, tel un zombi de base.

    J'ai testé de paramétrer l'execution de perl.exe sur le poste XP avec une compatibilité d'exécution en mode Windows 2000. Pas efficace du tout.

    Question : quelqu'un sait ce qui se passe ???

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Voici le code. Par soucis de confidentialité, j'ai renommé des noms de variables en POUET ou TOTO mais je n'ai touché à rien d'autre.

    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    #!C:perl/bin/perl -w
    use strict;
    use warnings;
     
    # VARIABLES
    my $PROGRAMME = "POUET.pl";
    my $VERSION = "1.0.1";
    my $AnneeMois = 0;
    my $Annee = 0;
    my $DateTraitement = 0;
    my $Log = "";
    my %Rep;
    my $FicTOTO;
    my $i = 0;
     
    # initialisation
    $DateTraitement = DonneDate();
    if ($DateTraitement =~ /^([0-9]{4})([0-9]{2}).+$/)
    {
    	$AnneeMois = "$1$2";
    	$Annee = $1;
    	$Log = "POUET$DateTraitement.log";
    	$Rep{IN} = "M:/Export/TOTO/$Annee";
    	$Rep{OUT} = "M:/Export/POUET/$AnneeMois";
    }
    else
    {
    	print "Erreur de fonctionnement du programme lors du traitement de la date du jour !!!\n";
    	print "Appuyez sur ENTREE pour fermer cette fenetre\n";
    	<STDIN>;
    	exit();
    }
     
    # ouverture du log
    open(STDERR, ">$Log") or die();
    warn "$PROGRAMME v$VERSION\n";
    warn "Traitement lancé le $DateTraitement à ", DonneHeure(), "\n";
    warn "Répertoire d'entrée  : $Rep{IN}\n";
    warn "Répertoire de sortie : $Rep{OUT}\n";
    warn "Période concernée    : $AnneeMois\n";
    warn "------------------------------------------------------------------------------------\n";
     
    # création des fichiers de sortie pour les PDF à extraire (projets et normes) + fichier de sortie biblio
    open (POUET, ">biblio.txt") or die("Création du fichier biblio.txt erreur : $!\n");
    open (PDF_NORME, ">pdf_norme.txt") or die("Création du fichier pdf_norme.txt erreur : $!\n");
    open (PDF_PROJET, ">pdf_projet.txt") or die("Création du fichier pdf_projet.txt erreur : $!\n");
    warn "Fichiers biblio.txt, pdf_norme.txt et pdf_projet.txt créés dans $Rep{OUT}\n";
     
    # recherche du dernier fichier TOTO
    chdir($Rep{IN}) or die("Impossible d'accéder aux fichiers de données de TOTO dans $Rep{IN} : $!\n");
    my @Temp = <*>;
    foreach(@Temp)
    {
    	push(@_, $_) if ($_ =~ /^TOTO_ACCENTS_GENIE.+/);
    }
    warn scalar(@_), " fichier(s) de données TOTO trouvé(s) dans $Rep{IN}\n\n";
    $FicTOTO = $_[scalar(@_)-1];
    warn "Le fichier qui est utilisé est $FicTOTO\n\n";
     
    # lecture du fichier TOTO
    warn DonneHeure(), ", début du traitement du fichier $FicTOTO\n";
     
     
    < *** le script lancé par un poste XP se bloque ICI *** >
     
     
    print "Lecture du fichier $FicTOTO en cours";
    open(DATA, $FicTOTO) or die("Lecture du fichier $FicTOTO erreur : $!\n");
    my $Numdos;
    my $compteur = 0;
    while(<DATA>){
        foreach my $tuple (split(/\|/, $_))
    	{
            # le temps de lecture du fichier étant assez long, on affiche qq chose à l'écran pour dire qu'il se
    		# passe quelque chose ;o)
    		++$compteur;
    		print "." if ($compteur == 1000);
    		$compteur = 0 if ($compteur == 1000);
     
    		# récup des données
    		if ($tuple =~ /^AC=FA/ && !($tuple =~ /\@IF=\d/) )
    		{
                $i++;
                print POUET "$tuple|";
                if ($tuple =~ /\@UP=N/)
    			{
                    if ($tuple =~ /^AC=FA(\d\d\d\d\d\d)/)
    				{
                        $Numdos = "FA$1";
                        if($tuple =~ /\@TS=DC/)
    					{
                            print PDF_PROJET "$Numdos\n";
                        }
    					else
    					{
                            print PDF_NORME "$Numdos\n";
                        }
                    }
                }
            }
        }
    }
    close(DATA);
    close(POUET);
    close(PDF_NORME);
    close(PDF_PROJET);
    warn "\t$i documents traités\n";
    warn DonneHeure(), ", fin du traitement du fichier $FicTOTO\n\n";
     
    # création des dossiers dans le répertoire de sortie s'ils n'existent pas
    if (! -d $Rep{OUT})
    {
    	mkdir($Rep{OUT}, 0777) or die("Création du dossier $Rep{OUT} erreur : $!\n");
    }
    if (! -d "$Rep{OUT}/PDF")
    {
    	mkdir("$Rep{OUT}/PDF", 0777) or die("Création du dossier $Rep{OUT}/PDF erreur : $!\n");
    }
     
    # fin de traitement
    warn DonneHeure(), ", FIN DU PROGRAMME\n\n\n\n";
     
     
    =pod
        FONCTION    DonneDate()
        RECOIT      rien.
        RENVOI      une chaîne.
        FAIT        retourne la date du jour au format AAAAMMJJ.
    =cut
    sub DonneDate
    {
        my (undef,undef,undef,$Mjour,$Mois,$Annee,undef,undef,undef) = localtime(time);
        $Annee += 1900;
        $Mois += 1;
        $Mois = 1 if ($Mois == 13);
        $Mois = '0' . $Mois if ($Mois < 10);
        $Mjour = '0' . $Mjour if ($Mjour < 10);
        return "$Annee$Mois$Mjour";
    }
     
    =pod
        FONCTION    DonneHeure()
        RECOIT      rien.
        RENVOI      une chaîne.
        FAIT        retourne l'heure actuelle au format HH:MM:SS.
    =cut
    sub DonneHeure {
        my ($Sec,$Min,$Heure,undef,undef,undef,undef,undef,undef) = localtime(time);
        $Sec = '0' . $Sec if ($Sec < 10);
        $Min = '0' . $Min if ($Min < 10);
        $Heure = '0' . $Heure if ($Heure < 10);
        return "$Heure:$Min:$Sec";
    }
    Hum, et le code ne vient pas de moi

  3. #3
    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
    rajoute peut etre un

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    En rajoutant ta ligne, le print qui ne s'affichait pas s'affiche désormais.

    MAIS le script bloque juste après. Il bloque là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open(DATA, $FicTOTO) or die("Lecture du fichier $FicTOTO erreur : $!\n");
    On ne sait pas ce qu'il fait puisque le die n'est pas testé.

  5. #5
    Membre Expert Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Par défaut
    Citation Envoyé par Arioch Voir le message
    En rajoutant ta ligne, le print qui ne s'affichait pas s'affiche désormais.

    MAIS le script bloque juste après. Il bloque là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open(DATA, $FicTOTO) or die("Lecture du fichier $FicTOTO erreur : $!\n");
    On ne sait pas ce qu'il fait puisque le die n'est pas testé.
    Tu trouveras peut-être des infos dans ton fichier "POUET$DateTraitement.log", vu que tu y as redirigé STDERR...

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Citation Envoyé par MarneusCalgarXP Voir le message
    Tu trouveras peut-être des infos dans ton fichier "POUET$DateTraitement.log", vu que tu y as redirigé STDERR...
    Et non, aucune info autre que les lignes que je warn()

  7. #7
    Membre Expert Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Par défaut
    Citation Envoyé par Arioch Voir le message
    Un script Perl conçu il y a quelques années et qui fonctionne très bien sur un poste équipé de Windows 2000 ne marche plus sous Windows XP.

    Versions Perl installées :
    - Windows 2000 : v5.6.1 build 635
    - Windows XP : v5.8.8 build 822
    Les deux versions proviennent d'ActiveState.
    As-tu testé le même script sous Windows 2000 mais en upgradant ta version de Perl à la v5.8.8 build 822 ? Ca n'a peut-être rien à voir avec la migration à XP...

  8. #8
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Citation Envoyé par MarneusCalgarXP Voir le message
    As-tu testé le même script sous Windows 2000 mais en upgradant ta version de Perl à la v5.8.8 build 822 ? Ca n'a peut-être rien à voir avec la migration à XP...
    Impossible de le savoir car nos postes 2000 et XP sont fortement verrouillés côté utilisateurs.

    On n'a le droit de rien installer ni désinstaller.

  9. #9
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Je viens de tester un autre programme qui, habituellement, fonctionne fort bien lui aussi.

    C'est une appli Tk dans laquelle on doit lui indiquer (dans une zone d'entrée) le chemin d'accès d'un répertoire. Ensuite, l'appli fait un test -d pour s'assurer que le répertoire est bien un répertoire et qu'il existe.

    Je vous le donne en mille : ça ne fonctionne plus sous XP !!! Le test du -d renvoie faux au lieu de vrai. Bien sûr, ça marche sous 2000

    Alors question : comment bien faire cohabiter 2 versions Perl sur le même PC ? J'ignore si ça vient de Perl v5.8.8 mais vu que ça marche avec une version en 5.6...

  10. #10
    Membre Expert Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Par défaut
    Tu peux faire cohabiter 2 versions de perl en les installant dans 2 répertoires différents, tout simplement.

    Sinon, je viens de tester, sous windows XP et perl 5.8.8, le -d fonctionne très bien...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    use strict;
    use warnings;
     
    my $windir = $ENV{'WINDIR'};
     
    if ( -d $windir ) {
    	print "ok : $windir existe\n";
    } else {
    	print "ko : $windir n'existe pas\n";
    }
    Autre question : utilises-tu cygwin par hasard ?

  11. #11
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Citation Envoyé par MarneusCalgarXP Voir le message
    Tu peux faire cohabiter 2 versions de perl en les installant dans 2 répertoires différents, tout simplement.

    Sinon, je viens de tester, sous windows XP et perl 5.8.8, le -d fonctionne très bien...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    use strict;
    use warnings;
     
    my $windir = $ENV{'WINDIR'};
     
    if ( -d $windir ) {
    	print "ok : $windir existe\n";
    } else {
    	print "ko : $windir n'existe pas\n";
    }
    Autre question : utilises-tu cygwin par hasard ?
    Ton bout de code donne chez moi (sous XP bien sûr) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >perl -w Document.pl
    ok : C:\WINDOWS existe
    >Exit code: 0
    Et je n'utilise pas Cygwin.

  12. #12
    Membre Expert Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Par défaut
    Ok, donc si le problème ne vient pas du "-d", il vient probablement d'ailleurs dans le code

    (pour cygwin, je posais la question, parce que la version installée avec cygwin est buggée, et il faut virer l'executable "perl.exe" dans le répertoire bin de cygwin pour avoir accès au perl de activestate)

  13. #13
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Citation Envoyé par MarneusCalgarXP Voir le message
    Ok, donc si le problème ne vient pas du "-d", il vient probablement d'ailleurs dans le code

    (pour cygwin, je posais la question, parce que la version installée avec cygwin est buggée, et il faut virer l'executable "perl.exe" dans le répertoire bin de cygwin pour avoir accès au perl de activestate)
    J'ai un collègue qui va voir sa bécane passer de 2000 à XP. Les gars du service info viennent de passer, on leur a demandé de mettre une v5.6.1 sur le futur poste au lieu de la 5.8.8.

    On verra bien si ça vient de la version de Perl ou si c'est l'environnement XP qui est bizarre.

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

Discussions similaires

  1. Mettre un script Perl en service Windows ?
    Par spax dans le forum Windows
    Réponses: 6
    Dernier message: 14/11/2008, 11h07
  2. Réponses: 37
    Dernier message: 10/09/2008, 15h16
  3. probleme script perl sous windows
    Par wirgilus dans le forum Langage
    Réponses: 4
    Dernier message: 05/06/2008, 11h34
  4. Utiliser un script Perl comme commande windows
    Par mquentin dans le forum Langage
    Réponses: 2
    Dernier message: 12/03/2007, 15h39
  5. Script de redemarrage de windows server 2000
    Par perturabo dans le forum Windows
    Réponses: 2
    Dernier message: 20/01/2006, 08h20

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