Posté(e) le 26 mars 200718 a 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
Posté(e) le 27 mars 200718 a 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
Posté(e) le 4 avril 200718 a 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"
Posté(e) le 5 avril 200718 a 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) [...]
Posté(e) le 11 mai 200718 a Auteur 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 ...
Posté(e) le 17 mai 200718 a Ç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 ?
Posté(e) le 17 mai 200718 a 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 )
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.