Python-Unterprozess Popen readline vor dem Schließen von 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())
Dieser Code funktioniert wie erwartet (Katze gibt den Standard wieder, und wir können den Standard lesen)
Wenn wir das auskommentieren p.stdin.close(), werden die .readline()Blöcke auf unbestimmte Zeit. Dies verhält sich .read(1)stattdessen genauso . Gibt es eine Möglichkeit, das Subprozessmodul neu zu lesen, ohne EOF an stdin zu senden?
Ich bin mir bewusst, dass es andere Bibliotheken gibt, die mein Problem lösen könnten, und untersuche sie auch. Bei dieser Frage bin ich nur neugierig, ob subprocessdiese Fähigkeit vorhanden ist und wie sie erreicht werden kann subprocess.
Antworten
Das Problem liegt in der Pufferung. Sie können verwenden, bufsize=1wenn Sie auch verwenden universal_newlines=True(obwohl Sie dann Zeichenfolgen anstelle von Bytes schreiben würden):
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())
Das Obige wird in Python 3.5.2 getestet. Hinweis - Ich habe gerade eine Antwort auf eine nicht verwandte Frage separat gelesen, die darauf hinweist, dass neuere Python-Versionen text=Truegleichwertig sind universal_newlines=True, aber zum Zeitpunkt des Schreibens keine neuere Installation zum Ausprobieren haben.