Interaktive Ein- / Ausgabe mit Python

Ich habe ein Programm, das mit dem Benutzer interagiert (verhält sich wie eine Shell), und ich möchte es mit dem Python-Subprozessmodul interaktiv ausführen. Das heißt, ich möchte die Möglichkeit haben, in stdin zu schreiben und sofort die Ausgabe von stdout zu erhalten. Ich habe viele der hier angebotenen Lösungen ausprobiert, aber keine scheint für meine Bedürfnisse zu funktionieren.

Der Code, auf dem ich geschrieben habeAusführen eines interaktiven Befehls in Python

import Queue
import threading
import subprocess
def enqueue_output(out, queue):
    for line in iter(out.readline, b''):
        queue.put(line)
    out.close()

def getOutput(outQueue):
    outStr = ''
    try:
        while True: #Adds output from the Queue until it is empty
            outStr+=outQueue.get_nowait()

    except Queue.Empty:
        return outStr

p = subprocess.Popen("./a.out", stdin=subprocess.PIPE, stout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize = 1)
#p = subprocess.Popen("./a.out", stdin=subprocess.PIPE, stout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False, universal_newlines=True)

outQueue = Queue()
errQueue = Queue()

outThread = Thread(target=enqueue_output, args=(p.stdout, outQueue))
errThread = Thread(target=enqueue_output, args=(p.stderr, errQueue))

outThread.daemon = True
errThread.daemon = True

outThread.start()
errThread.start()

p.stdin.write("1\n")
p.stdin.flush()
errors = getOutput(errQueue)
output = getOutput(outQueue)

p.stdin.write("5\n")
p.stdin.flush()
erros = getOutput(errQueue)
output = getOutput(outQueue)

Das Problem ist, dass die Warteschlange leer bleibt, als gäbe es keine Ausgabe. Nur wenn ich alle Eingaben, die das Programm ausführen und beenden muss, in stdin schreibe, erhalte ich die Ausgabe (was nicht das ist, was ich will). Zum Beispiel, wenn ich etwas mache wie:

p.stdin.write("1\n5\n")
errors = getOutput(errQueue)
output = getOutput(outQueue)

Gibt es eine Möglichkeit, das zu tun, was ich tun möchte?

BEARBEITEN: Das Skript wird auf einem Linux-Computer ausgeführt. Ich habe mein Skript geändert und die universal_newlines = True gelöscht + die Bufsize auf 1 gesetzt und stdin sofort nach wrtie gelöscht. Trotzdem bekomme ich keine Ausgabe.

Zweiter Versuch: Ich habe diese Lösung ausprobiert und es funktioniert für mich:

from subprocess import Popen, PIPE

fw = open("tmpout", "wb")
fr = open("tmpout", "r")
p = Popen("./a.out", stdin = PIPE, stdout = fw, stderr = fw, bufsize = 1)
p.stdin.write("1\n")
out = fr.read()
p.stdin.write("5\n")
out = fr.read()
fw.close()
fr.close()

Antworten auf die Frage(3)

Ihre Antwort auf die Frage