Sous-processus Python Popen readline avant de fermer stdin
import subprocess as sp
p = sp.Popen("/bin/cat", stdin=sp.PIPE, stdout=sp.PIPE)
p.stdin.write(b"foobaz!\n")
p.stdin.close()
print(p.stdout.readline())
Ce code fonctionne comme prévu (cat fait écho au stdin, et nous pouvons lire le stdout)
Si nous commentons le p.stdin.close(), les .readline()blocs indéfiniment. Cela a le même appel à la .read(1)place. Existe-t-il un moyen de readline en utilisant le module de sous-processus sans envoyer EOF à stdin?
Je sais qu'il existe d'autres bibliothèques qui pourraient résoudre mon problème, et je les examine également. Pour cette question, je suis seulement curieux de savoir si subprocessa cette capacité, et comment y parvenir subprocess.
Réponses
Le problème vient de la mise en mémoire tampon. Vous pouvez utiliser bufsize=1si vous utilisez également universal_newlines=True(bien que vous écririez alors des chaînes au lieu d'octets):
p = sp.Popen("/bin/cat", stdin=sp.PIPE, stdout=sp.PIPE,
bufsize=1, universal_newlines=True)
p.stdin.write("foobaz!\n")
print(p.stdout.readline())
Ce qui précède est testé en Python 3.5.2. Remarque - Je viens de lire séparément une réponse à une question sans rapport qui suggère que dans les versions plus récentes de Python text=Trueéquivaut à universal_newlines=True, mais je n'ai pas d'installation plus récente pour l'essayer au moment de la rédaction.