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.
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