Próbuję rozmawiać z proces potomny przy użyciu wywołania Python subprocess.Popen(). W moim prawdziwym kodzie implementuję typ IPC, więc chcę napisać trochę danych, przeczytać odpowiedź, napisać więcej danych, przeczytać odpowiedź i tak dalej. Z tego powodu nie mogę używać Popen.communicate(), która w przeciwnym razie działa dobrze dla prostego przypadku.Czytanie/pisanie do podprocesu Popen()
Ten kod pokazuje mój problem. Nigdy nie otrzymuje pierwszej odpowiedzi, wisi na pierwszym "wyniku czytania". Czemu? Jak mogę sprawić, aby działało to tak, jak oczekuję?
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()
Rzeczywiście działa! Mój sed z jakiegoś powodu używa -u dla "niebuforowanego", nie -l, ale działa tak samo. To rozwiązuje mój przykładowy kod, ale niestety nie mój prawdziwy kod, ponieważ rzeczywiste polecenie nie jest sed, ale inny program python. Dobra odpowiedź, ale wskazałeś problem. –
Tak, problem został rozwiązany. Problemem było buforowanie wyjścia wyniku. Wykonanie prostego stdout.flush() w moim podprocesie rozwiązało problem. Dzięki! –