Aller au contenu

problème en python : os.popen


hachcoco

Messages recommandés

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 :-D

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

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

  • 2 semaines après...

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

  • 1 mois après...

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

Ç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 ? :incline:

Lien vers le commentaire
Partager sur d’autres sites

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...