2010-05-14 2 views
2

Je ce code:Python subprocess.Popen se bloque dans 'pour l dans p.stdout' jusqu'à ce que p se termine, pourquoi?

#!/usr/bin/python -u 

localport = 9876 

import sys, re, os 
from subprocess import * 

tun = Popen(["./newtunnel", "22", str(localport)], stdout=PIPE, stderr=STDOUT) 

print "** Started tunnel, waiting to be ready ..." 
for l in tun.stdout: 
     sys.stdout.write(l) 
     if re.search("Waiting for connection", l): 
       print "** Ready for SSH !" 
       break 

Le « ./newtunnel » ne quittera pas, il sera constamment sortie de plus en plus de données à stdout. Cependant, ce code ne donnera aucune sortie et continuera à attendre dans le fichier tun.stdout.

Lorsque je supprime le processus newtunnel de manière externe, il vide toutes les données dans tun.stdout. Donc, il semble que je ne peux pas obtenir de données à partir du tun.stdout alors qu'il est encore en cours d'exécution.

Pourquoi est-ce? Comment puis-je obtenir l'information?

Notez que la taille par défaut pour Popen est 0 (non tamponné). Je peux aussi spécifier bufsize = 0 mais cela ne change rien.

+0

Copie possible de http://stackoverflow.com/questions/874815/how-do-i-get-real-time-information-back-from-a-subprocess-popen-in-python-2-5 – eswald

Répondre

2

Ok, il semble que ce bogue dans Python: http://bugs.python.org/issue3907

Si je remplace la ligne

for l in tun.stdout: 

par

while True: 
    l = tun.stdout.readline() 

il fonctionne exactement comme je le veux.

Questions connexes