Aide - Recherche - Membres - Calendrier
Version complète : problème en python : os.popen
Forum PC INpact > Systèmes, logiciels et lignes de codes > Programmation et Création web > Programmation (C, Perl, Python, Java...)
hachcoco
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 langue.gif
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
windu.2b
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:
CITATION
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
savory
oublie pas le -w pour le timeout clindoeil.gif
[codebox]import os,sre
print sre.findall("1 received",os.popen("ping -c1 -w1 72.14.253.104 ","r").read()) and "OK" or "ERROR"
[/codebox]
beuhbeuh
un petit ping.close() plutôt que ping ="" me semblerait opportun clindoeil.gif
savory
Oula tu m'as filé le doute :)
Donc apres vérifications la vm python ferme bien son fd après le read()
[codebox]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)
[...]

[/codebox]
hachcoco
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 !

[codebox] 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[/codebox]

Je comprend plus trop ce qui se passe ...
savory
Ç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 ? clindoeil.gif
tsubasaleguedin
QUOTE(savory @ 05-04-2007 10:34:43) [snapback]1814117[/snapback]
Oula tu m'as filé le doute :)
Donc apres vérifications la vm python ferme bien son fd après le read()
[codebox]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)
[...]

[/codebox]


Tu le vois comment ? C'est la terminaison du processus fils qui suit le read ? ( SIGCHLD )
playstation.2.fg
Tu peux toujours essayer ça sinon :
CODE
p = os.system("commande")
print p
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2010 Invision Power Services, Inc.