Interaktive Eingabe - /Ausgabe mit python

Ich habe ein Programm, mit dem Benutzer interagiert (verhält sich wie eine shell), und ich will das es läuft mit python-subprocess-Modul interaktiv.
Das bedeutet, dass ich die Möglichkeit zum schreiben auf stdin und sofort bekommen Sie die Ausgabe von stdout. Ich habe versucht, viele Lösungen, die hier angeboten werden, aber keiner von Ihnen scheint zu funktionieren für meine Bedürfnisse.

Den code, den ich geschrieben habe, basiert auf Ausführen einer interaktiven Befehl 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 bleibt leer, als wenn es gibt keine Ausgabe.
Nur wenn ich die schreiben von stdin, alle Eingaben, die das Programm benötigt zum ausführen und beenden, dann bekomme ich die Ausgabe (das ist nicht das, was ich will). Zum Beispiel, wenn ich etwas tun wie:

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

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

EDIT:
Das script läuft auf einem Linux-Rechner.
Ich änderte mein script gelöscht und die universal_newlines=True + gesetzt, die bufsize, 1 und gespült stdin sofort nach wrtie. Trotzdem bekomme ich keine Ausgabe.

Zweiten Versuch:
Ich habe versucht, diese Lösung 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()

InformationsquelleAutor Talor Abramovich | 2013-11-09

Schreibe einen Kommentar