Entrada / salida interactiva utilizando python

Tengo un programa que interactúa con el usuario (actúa como un shell) y quiero ejecutarlo de forma interactiva utilizando el módulo de subproceso de Python. Eso significa que quiero la posibilidad de escribir en stdin e inmediatamente obtener la salida de stdout. Intenté muchas soluciones ofrecidas aquí, pero ninguna de ellas parece funcionar para mis necesidades.

El código que he escrito basado enEjecutando un comando interactivo desde 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)

El problema es que la cola permanece vacía, como si no hubiera salida. Solo si escribo en stdin todas las entradas que el programa necesita para ejecutar y terminar, obtengo la salida (que no es lo que quiero). Por ejemplo si hago algo como:

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

¿Hay alguna manera de hacer lo que quiero hacer?

EDITAR: El script se ejecutará en una máquina Linux. Cambié mi script y eliminé universal_newlines = True + configuré bufsize a 1 y borré la entrada estándar inmediatamente después de wrtie. Todavía no tengo salida.

Segundo intento: He intentado esta solución y funciona para mí:

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()

Respuestas a la pregunta(3)

Su respuesta a la pregunta