Lecture/écriture à un Popen() sous-processus
Je suis en train de parler à un enfant de processus à l'aide de python sous-processus.Popen (). Dans mon code, je me suis mise en œuvre d'un type de l'IPC, donc je veux écrire des données, lire la réponse, écrire un peu plus de données, de lire la réponse, et ainsi de suite. De ce fait, je ne peux pas utiliser Popen.communiquer(), qui fonctionne bien pour les cas les plus simples.
Ce code montre mon problème. Il n'a jamais obtient la première réponse, se bloque lors de la première "Lecture de résultat". Pourquoi? Comment puis-je faire ce travail que je m'attendre?
import subprocess
p = subprocess.Popen(["sed", 's/a/x/g'],
stdout = subprocess.PIPE,
stdin = subprocess.PIPE)
p.stdin.write("abc\n")
print "Reading result:"
print p.stdout.readline()
p.stdin.write("cat\n")
print "Reading result:"
print p.stdout.readline()
OriginalL'auteur Mats Ekberg | 2012-04-28
Vous devez vous connecter pour publier un commentaire.
Je voudrais essayer d'utiliser
Popen().communicate()
si vous le pouvez car il fait beaucoup de belles choses pour vous, mais si vous avez besoin d'utiliserPopen()
exactement comme vous l'avez décrit, vous aurez besoin de mettre en sed pour vider sa mémoire tampon après les retours à la ligne avec le-l
option:et votre code devrait fonctionner correctement
Yup, le problème est résolu. Le problème a été le tampon de sortie de la suite. Faisant une simple sortie standard (stdout).flush() dans mon sous-processus résolu le problème. Merci!
OriginalL'auteur gnr
sed
's de sortie est mis en mémoire tampon et sorties seulement ses données jusqu'à ce que suffisamment a été cumulées ou le flux d'entrée est épuisé et fermé.Essayez ceci:
Être conscient que cela ne peut être fait de façon fiable qui énorme de données comme wriring à
stdin
blocs une fois que le tampon est plein. La meilleure façon de le faire est d'utilisercommuniquer()
.Ah, vous avez eu raison, de mise en mémoire tampon a été en effet le problème.
OriginalL'auteur glglgl