Rechercher : dans
Par :

[PERL]- Tester si un module est installé

Dernière réponse le 21 jun 2007 à 12:47:15 blux, le 12 jun 2007 à 14:39:30 
 Signaler ce message aux modérateurs

Bonjour,

je cherche à savoir si l'on peut intercepter une erreur dans le cas où un module CPAN n'est pas accessible dans un script perl :

Ex :

use lib"/mod/Date-Calc-5.4/lib/site_perl/5.8.0/aix-thread-multi";
use Date::Calc qw(:all);
Si le module Date n'est pas accessible sur cette machine, comment le savoir ?

Faut-il tester un répertoire ou ne suffit-il pas d'intercepter l'erreur lors du 'use lib', et dans ce cas, comment faire ?

Merci d'avance
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"

Meilleures réponses pour « [PERL] Tester si un module est installé » dans :
[Linux] Débuter sous Linux VoirDÉBUTER SOUS LINUX Qu'est-ce que Linux ? Si vous venez de Windows I - LES LIVE-CDS I-1 Quelles distributions choisir ? I-2 Utilisation II - INSTALLER LINUX II-1 Partitionner son disque dur II-2 Multiboot Windows/Linux II-3 Quelles...
[Shell] Tester une variable numérique VoirTester une variable numérique    Préambule Dans un environnement "shell", les variables sont, par défaut, de type "chaîne de caractères". De ce fait il n'est pas possible de déclarer une variable de type "entier" (enfin, ceci n'est pas tout à...
Comment vérifier si mon antivirus est actif ? VoirLe test Si vous avez des doutes sur le fait que votre antivirus soit actif, il vous suffit de télécharger le fichier suivant Si votre antivirus bloque le téléchargement et vous affiche une alerte, tout va bien. Votre antivirus est actif. Si...
Perl - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle? On appelle structure conditonnelle les instructions qui permettent de tester si une condition est vraie ou non. Ces structures conditionnelles peuvent être associées à des structures qui se répètent...
Java: Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle? On appelle structure conditonnelle les instructions qui permettent de tester si une condition est vraie ou non. Ces structures conditionnelles peuvent être associées à des structures qui se répètent...
Langage C++ - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle ? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non. Ces structures conditionnelles peuvent être associées à des structures qui se répètent...

1

lami20j, le 12 jun 2007 à 15:09:49

Salut,

tu peux utiliser le bloc BEGIN

BEGIN {
    unless (eval "require $m") {
        warn "le module $m ne peux pas être chargé : $@";
    }
}
ou
<code>BEGIN {
    unless (eval "use $m") {
        warn "le module $m ne peux pas être chargé : $@";
    }
}
</code> lami20j

Répondre à lami20j

2

blux, le 12 jun 2007 à 15:30:04

On progresse :-)

En fait, je voudrais savoir si le module est présent et positionner un flag dans ce cas, pour traiter ensuite des cas particuliers et charger mon module date :

#use lib"/mod/Date-Calc-5.4/lib/site_perl/5.8.0/aix-thread-multi";
$toto = 0;
BEGIN {
    unless (eval "require Date::Calc") {
        $toto = 1;
        #warn "le module Date ne peut pas être chargé : $@";
    }
}
if ($toto != 1) {use Date::Calc qw(:all);}
Mais ça plante à la dernière ligne (if ... use date), on dirait qu'il le charge avec ou sans test...
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"

Répondre à blux

3

lami20j, le 12 jun 2007 à 15:36:55

Mais ça plante à la dernière ligne (if ... use date), on dirait qu'il le charge avec ou sans test...

déjà il faut faire un print $toto pour voir s'il est vraiment différent de 1
lami20j

Répondre à lami20j

4

blux, le 12 jun 2007 à 15:49:54

Ben il est égal à 0...
Donc il semble ne pas passer dans le unless (j'ai mis le use lib en commentaire...)
???
A+ Blux

 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"

Répondre à blux

5

lami20j, le 12 jun 2007 à 16:07:08

Je vais vérifier à la maison
tu as quelle version de Perl? lami20j

Répondre à lami20j

6

blux, le 12 jun 2007 à 16:11:56

This is perl, v5.8.0 built for aix-thread-multi
Merci de ton aide :-)
A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"

Répondre à blux

7

lami20j, le 12 jun 2007 à 22:24:50

Salut,

Cas1

#!/usr/bin/perl
use strict;use warnings;
our $toto;
BEGIN {
   $toto = 0;
  print "avant $toto\n";
  unless (eval "require Date::Calc") {
    $toto = 1;
    warn "***le module Date ne peut pas être chargé***\n";
  }
print "après $toto\n";
}
if ($toto != 1) {use Date::Calc qw(:all);}
print "ok, je continue\n"
__END__

Exécution
lami20j@debian:~/trash$ perl ccm.pl
avant 0
***le module Date ne peut pas être chargé***
après 1
Can't locate Date/Calc.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl /usr/local/lib/perl/5.8.4 /usr/local/share/perl/5.8.4 .) at ccm.pl line 13.
BEGIN failed--compilation aborted at ccm.pl line 13.

Explication

C'est normal d'avoir toujours le message d'erreur
use charge le module à la compilation et pas à l'exécution, donc même si ta variable de teste change le compilateur s'en fiche complètement.

Cas2
#!/usr/bin/perl
use strict;use warnings;
our $toto;
BEGIN {
   $toto = 0;
  print "avant $toto\n";
  unless (eval "use Date::Calc") {
    $toto = 1;
    warn "***le module Date ne peut pas être chargé***\n";
  }

print "après $toto\n";
}
print "ok, je continue\n"
__END__
_

Exécution
lami20j@debian:~/trash$ perl ccm.pl
avant 0
***le module Date ne peut pas être chargé***
après 1
ok, je continue

Explication
La variable $toto ne sers à rien, c'est juste pour te montrer qu'elle change.
Si eval réussi alors le module est chargé sinon un message de warning est affiché et le script continue




lami20j

Répondre à lami20j

8

blux, le 12 jun 2007 à 22:39:01

Donc, ça me va, s'il charge le module, je positionne mon flag et je joue avec ensuite...
Je teste ça dès demain...
A+ Blux

 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"

Répondre à blux

9

lami20j, le 12 jun 2007 à 22:43:58

Regarde un exemple

#!/usr/bin/perl

BEGIN {
  unless (eval "use Date::Calc") {
    warn "***le module $module ne peut pas être chargé***\n";
  }else {
    @f = (2007, 1, 1);      # 1 Jan 2007
    @d = (2000, 10, 20);    # 20 Oct 1973
    $diff = Delta_Days(@d, @f);
    print "Difference $diff jours entre d et f\n";
  }
}
print "ok, je continue\n"
__END__
je n'ai pas installé Date::Calc et voilà le résultat chez moi
lami20j@debian:~/trash$ perl ccm.pl
***le module  ne peut pas être chargé***
ok, je continue
lami20j

Répondre à lami20j

10

blux, le 12 jun 2007 à 22:54:40

Ok, j'avais pas bien vu, alors comment positionner un flag quand le module n'est pas chargé, car je ne veux pas mettre tout mon code dans le 'else' ?
A+ Blux

 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"

Répondre à blux

11

lami20j, le 12 jun 2007 à 22:59:44

Voilà, en fait j'ai anticipé ta question et j'étais en train de préparer le code :-))

lami20j@debian:~/trash$ cat ccm.pl
#!/usr/bin/perl
use strict; use warnings;
my $toto; # variable locale au paquetage
BEGIN {
  my $val = \$toto; # j'utilise une référence vers $toto
  unless (eval "use Date::Calc") {
    $$val=1; # j'attribue 1 à $toto
    warn "***le module Date::Calc ne peut pas être chargé***\n";
  }else {
    $$val=0; # j'attribue 0 a $toto
  }
}

print "ok, je continue \$toto vaut $toto\n";

if ($toto != 1){ # ici ton flag (si $toto différent de 1, donc module chargé)
  my @f = (2007, 1, 1);     # 1 Jan 2007
  my @d  = (2000, 10, 20);  # 20 Oct 1973
  my $diff = Delta_Days(@d, @f);
  print "Difference $diff jours entre d et f\n";

}
__END__

lami20j@debian:~/trash$ perl ccm.pl
***le module Date::Calc ne peut pas être chargé***
ok, je continue $toto vaut 1
à testé avec module installé, je l'ai testé sans avoir le module installé lami20j

Répondre à lami20j

12

lami20j, le 12 jun 2007 à 23:02:25

car je ne veux pas mettre tout mon code dans le 'else' ?

Et, pourquoi pas?
D'ailleurs avec le flag tu le mets dans un if () { } :-))) lami20j

Répondre à lami20j

13

blux, le 13 jun 2007 à 08:59:22

Je me penche sur ton code, j'ai pas tout compris, mais ça doit être normal, moi jeune padawan, pas encore jedi...
A+ Blux

 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"

Répondre à blux

14

jipicy, le 13 jun 2007 à 09:04:32

pas encore jedi...
Ben forcément, aujourd'hui c'est mercredi ;-DDD




























=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Avec plaisir, il fait beau, 20° déjà ;-)) Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

15

blux, le 13 jun 2007 à 09:48:09

J'y ai pensé en l'écrivant, pis je me suis dit que j'allais pas la faire, histoire de tenir ma réputation... :-)
A+ Blux

 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"

Répondre à blux

16

lami20j, le 13 jun 2007 à 18:24:08

Salut à vous,

blux celui là fonctionne, mais ne demande pas pourquoi :-))

#!/usr/bin/perl
use strict; use warnings;
my $toto; # variable locale au paquetage
BEGIN {
  my $val = \$toto; # j'utilise une rérérence vers $toto
  if (eval "use Date::Calc qw/Delta_Days/") {
    $$val=1; # j'attribue 1 Ã|  $toto
    warn "***le module Date::Calc ne peut pas étre chargé***\n";
  }else {
    $$val=0; # j'attribue 0 a $toto
  }
}

print "ok, je continue \$toto vaut $toto\n";

if ($toto != 1){ # ici ton flag (si $toto différent de 1, donc module chargé)
  my @f = (2007, 1, 1);     # 1 Jan 2007
  my @d  = (2000, 10, 20);  # 20 Oct 1973
  my $diff = Delta_Days(@d, @f);
  print "Difference $diff jours entre d et f\n";

}
__END__
lami20j

Répondre à lami20j

17

blux, le 21 jun 2007 à 09:34:32

Bon j'ai refait un test, ça ne marche pas chez moi :

# test1.pl
ok, je continue $toto vaut 0
Undefined subroutine &main::Delta_Days called at test1.pl line 19.
#

C'est sans doute dû au fait que mon module est appelé dans le script et non à l'extérieur...

#!/usr/bin/perl
#use lib"/nsr/tools/eject/Date-Calc-5.4/lib/site_perl/5.8.0/aix-thread-multi";
my $toto; # variable locale au paquetage
BEGIN {
  my $val = \$toto; # j'utilise une rérérence vers $toto
  if (eval "use Date::Calc qw/Delta_Days/") {
    $$val=1; # j'attribue 1 Ã|  $toto
    warn "***le module Date::Calc ne peut pas étre chargé***\n";
  }else {
    $$val=0; # j'attribue 0 a $toto
  }
}

print "ok, je continue \$toto vaut $toto\n";

if ($toto != 1){ # ici ton flag (si $toto différent de 1, donc module chargé)
  my @f = (2007, 1, 1);     # 1 Jan 2007
  my @d  = (2000, 10, 20);  # 20 Oct 1973
  my $diff = Delta_Days(@d, @f);
  print "Difference $diff jours entre d et f\n";

}
__END__
Du coup, je coince un peu et je ne peux pas installer le module 'officiellement' :-) A+ Blux
 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"

Répondre à blux

18

lami20j, le 21 jun 2007 à 12:08:04

Salut,

C'est sans doute dû au fait que mon module est appelé dans le script et non à l'extérieur...
Ben, ce n'est pas comme ça qu'il faut voir?

Le bloc BEGIN s'exécute avant tout, c'est à dire aussi avant la compilation.
Tu peux tester une divizion avec zéro dans un bloc BEGIN et tu verras.

Comme tu n'as pas donner un signe, je croyais que c'est bon.
Je vais prendre ton code et je vais le tester dans plusieurs environnements.
lami20j

Répondre à lami20j

19

blux, le 21 jun 2007 à 12:40:30

Ben j'ai eu des gros soucis boulot (toujours pas résolus, d'ailleurs, donc j'avais un peu laissé tomber...)

C'est sans doute dû au fait que mon module est appelé dans le script et non à l'extérieur...
Ben, ce n'est pas comme ça qu'il faut voir?

Je me suis mal exprimé, je voulais dire : j'appelle le module de façon explicite et non en disant à Perl d'aller voir dans @INC...
Parce que c'est la seule différence que j'ai trouvée entre ton code et le mien...

Le qw(/.../), c'est pour donner la liste des modules que l'on appelle ?
A+ Blux

 "Les cons, ça ose tout.
C'est même à ça qu'on les reconnait"

Répondre à blux

20

 lami20j, le 21 jun 2007 à 12:47:15

Le qw(/.../), c'est pour donner la liste des modules que l'on appelle ?

Non, c'est pour spécifier à la demande une fonction ou variable à utilisier

En général on les trouve dans le tableau @EXPORT_OK du module
lami20j

Répondre à lami20j