[PERL]- Tester si un module est installé
Fermé
blux
Messages postés
26556
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
29 décembre 2024
-
12 juin 2007 à 14:39
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 21 juin 2007 à 12:47
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 21 juin 2007 à 12:47
A voir également:
- [PERL]- Tester si un module est installé
- Flash drive tester - Télécharger - Divers Utilitaires
- Tester son pc - Guide
- Hkcmd module ✓ - Forum Virus
- Tester composant pc - Guide
- Manque cam module - Forum TNT / Satellite / Réception
17 réponses
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
12 juin 2007 à 15:09
12 juin 2007 à 15:09
Salut,
tu peux utiliser le bloc BEGIN
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>
blux
Messages postés
26556
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
29 décembre 2024
3 319
12 juin 2007 à 15:30
12 juin 2007 à 15:30
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 :
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...
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
12 juin 2007 à 15:36
12 juin 2007 à 15:36
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
déjà il faut faire un print $toto pour voir s'il est vraiment différent de 1
blux
Messages postés
26556
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
29 décembre 2024
3 319
12 juin 2007 à 15:49
12 juin 2007 à 15:49
Ben il est égal à 0...
Donc il semble ne pas passer dans le unless (j'ai mis le use lib en commentaire...)
???
Donc il semble ne pas passer dans le unless (j'ai mis le use lib en commentaire...)
???
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
12 juin 2007 à 16:07
12 juin 2007 à 16:07
je vais vérifier à la maison
tu as quelle version de Perl?
tu as quelle version de Perl?
blux
Messages postés
26556
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
29 décembre 2024
3 319
12 juin 2007 à 16:11
12 juin 2007 à 16:11
This is perl, v5.8.0 built for aix-thread-multiMerci de ton aide :-)
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
12 juin 2007 à 22:24
12 juin 2007 à 22:24
Salut,
Cas1
Exécution
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
Exécution
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
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
blux
Messages postés
26556
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
29 décembre 2024
3 319
12 juin 2007 à 22:39
12 juin 2007 à 22:39
Donc, ça me va, s'il charge le module, je positionne mon flag et je joue avec ensuite...
Je teste ça dès demain...
Je teste ça dès demain...
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
12 juin 2007 à 22:43
12 juin 2007 à 22:43
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
blux
Messages postés
26556
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
29 décembre 2024
3 319
12 juin 2007 à 22:54
12 juin 2007 à 22:54
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' ?
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
12 juin 2007 à 22:59
12 juin 2007 à 22:59
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
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
12 juin 2007 à 23:02
12 juin 2007 à 23:02
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 () { } :-)))
Et, pourquoi pas?
D'ailleurs avec le flag tu le mets dans un if () { } :-)))
blux
Messages postés
26556
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
29 décembre 2024
3 319
13 juin 2007 à 08:59
13 juin 2007 à 08:59
Je me penche sur ton code, j'ai pas tout compris, mais ça doit être normal, moi jeune padawan, pas encore jedi...
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
13 juin 2007 à 09:04
13 juin 2007 à 09:04
pas encore jedi...
Ben forcément, aujourd'hui c'est mercredi ;-DDD
=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Avec plaisir, il fait beau, 20° déjà ;-))
Ben forcément, aujourd'hui c'est mercredi ;-DDD
=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Avec plaisir, il fait beau, 20° déjà ;-))
blux
Messages postés
26556
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
29 décembre 2024
3 319
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
13 juin 2007 à 09:48
13 juin 2007 à 09:48
J'y ai pensé en l'écrivant, pis je me suis dit que j'allais pas la faire, histoire de tenir ma réputation... :-)
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
13 juin 2007 à 18:24
13 juin 2007 à 18:24
Salut à vous,
blux celui là fonctionne, mais ne demande pas pourquoi :-))
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__
blux
Messages postés
26556
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
29 décembre 2024
3 319
21 juin 2007 à 09:34
21 juin 2007 à 09:34
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...
# 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' :-)
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
21 juin 2007 à 12:08
21 juin 2007 à 12:08
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.
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.
blux
Messages postés
26556
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
29 décembre 2024
3 319
21 juin 2007 à 12:40
21 juin 2007 à 12:40
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 ?
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 ?
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
21 juin 2007 à 12:47
21 juin 2007 à 12:47
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
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