hachcoco Posté(e) le 26 mars 2007 Partager Posté(e) le 26 mars 2007 Bonjour ! J'ai un problème avec un script que j'ai fait en python : Comme il doit aller chercher des infos sur le net j'ai fais une fonction pour tester la présence d'une connection, ce qui est indispensable chez moi :-( La voila : def testConnectionNet() : ping=os.popen("ping 72.14.253.104 -c 1","r") lignes=ping.readlines() for ligne in lignes : print ligne net = re.search("(1 received)",ligne) if net : print "verification de la presence d'une connection internet...OK" ping = "" return 1 ping = "" print "verification de la presence d'une connection internet...ERROR" return 0 l'addresse ip , c'est google.com, je ne prend pas trop de risques Donc, il fait le test à chaque erreur qu'il trouve, Et au bout d'un certian temps il me sort : ping=os.popen("ping 72.14.253.104 -c 1","r") OSError: [Errno 24] Too many open files Voila, j'aimerais donc savoir si je fais quelque chose mal (le test de la présence d'internet est indispensable dans ce cas là). Sinon avez vous une autre méthode pour tester ça ? Merci beaucoups et bonne journée ! PS : je suis sous linux Lien vers le commentaire Partager sur d’autres sites More sharing options...
windu.2b Posté(e) le 27 mars 2007 Partager Posté(e) le 27 mars 2007 Salut, Je ne m'y connais pas en Python, mais vu ton erreur j'en déduis que tu ne refermes jamais ta connexion faite via: ping=os.popen("ping 72.14.253.104 -c 1","r") Car même si tu vides ping, ca ne ferme pas pour autant la connexion, non? donc un os.close (enfin je suppose, car je ne connais pas le nom des méthodes) devrait être nécessaire quelque part Lien vers le commentaire Partager sur d’autres sites More sharing options...
savory Posté(e) le 4 avril 2007 Partager Posté(e) le 4 avril 2007 oublie pas le -w pour le timeout import os,sre print sre.findall("1 received",os.popen("ping -c1 -w1 72.14.253.104 ","r").read()) and "OK" or "ERROR" Lien vers le commentaire Partager sur d’autres sites More sharing options...
beuhbeuh Posté(e) le 4 avril 2007 Partager Posté(e) le 4 avril 2007 un petit ping.close() plutôt que ping ="" me semblerait opportun Lien vers le commentaire Partager sur d’autres sites More sharing options...
savory Posté(e) le 5 avril 2007 Partager Posté(e) le 5 avril 2007 Oula tu m'as filé le doute :) Donc apres vérifications la vm python ferme bien son fd après le read() strace python -c 'import os,sre;print sre.findall("1 received",os.popen("ping -c1 -w1 72.14.253.104 ","r").read()) and "OK" or "ERROR"' 2>&1|less [...] clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7d496f8) = 11197 close(4) = 0 fstat64(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0 fstat64(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0 _llseek(3, 0, 0xbfe242d0, SEEK_CUR) = -1 ESPIPE (Illegal seek) fstat64(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7c84000 read(3, "PING 72.14.253.104 (72.14.253.10"..., 1024) = 272 --- SIGCHLD (Child exited) @ 0 (0) --- read(3, "", 1024) = 0 close(3) [...] Lien vers le commentaire Partager sur d’autres sites More sharing options...
hachcoco Posté(e) le 11 mai 2007 Auteur Partager Posté(e) le 11 mai 2007 Merci à tous pour vos réponses ! Alors j'ai essayé la solution de savory après avoir essayé toute les solutions de .close() possible, et il me re-sort le même genre de message d'erreur ! while testConnectionNet()==0 : File "projet.py", line 751, in testConnectionNet if (sre.findall("1 received",os.popen("ping -c1 -w1 72.14.253.104 ","r").read()) and "OK" or "ERROR")=="OK" : OSError: [Errno 24] Too many open files Je comprend plus trop ce qui se passe ... Lien vers le commentaire Partager sur d’autres sites More sharing options...
savory Posté(e) le 17 mai 2007 Partager Posté(e) le 17 mai 2007 Ça veut juste dire que tu fais trop de popen à la suite, tu dois avoir un gros probleme de sémantique dans ton programme ^^" que fait testConnectionNet() ? Je pense que tu dois faire une boucle de popen et que l'os ne peut plus assurer les exec au bout d'un moment, tu devrais attendre le résultat de ton popen avant d'en ouvrir un autre non ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
tsubasaleguedin Posté(e) le 17 mai 2007 Partager Posté(e) le 17 mai 2007 Oula tu m'as filé le doute :)Donc apres vérifications la vm python ferme bien son fd après le read() strace python -c 'import os,sre;print sre.findall("1 received",os.popen("ping -c1 -w1 72.14.253.104 ","r").read()) and "OK" or "ERROR"' 2>&1|less [...] clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7d496f8) = 11197 close(4) = 0 fstat64(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0 fstat64(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0 _llseek(3, 0, 0xbfe242d0, SEEK_CUR) = -1 ESPIPE (Illegal seek) fstat64(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7c84000 read(3, "PING 72.14.253.104 (72.14.253.10"..., 1024) = 272 --- SIGCHLD (Child exited) @ 0 (0) --- read(3, "", 1024) = 0 close(3) [...] Tu le vois comment ? C'est la terminaison du processus fils qui suit le read ? ( SIGCHLD ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
playstation.2.fg Posté(e) le 17 mai 2007 Partager Posté(e) le 17 mai 2007 Tu peux toujours essayer ça sinon : p = os.system("commande") print p Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.