Python – Wie verwende ich zwei Threads für Stdin und Stdout in Subprocess.Popen?

Ich habe ein Kommandozeilenprogramm ausgeführt, das jede Texteingabe aufnehmen kann, die mit "Enter" -Taste von stdin endet und eine Textantwort sofort zu stdout gibt. Jetzt habe ich eine Datei, die Tausende von Sätzen und einen Satz pro Zeile enthält. Kann ich zwei Threads verwenden, eine für das Lesen dieser Datei Zeile für Zeile und senden Sie es an stdin, wenn ich das Kommandozeilenprogramm ausführen, und der andere Thread für das Fangen der Antwort und schreiben Sie in eine andere Datei?

Für "sending to stdin" thread:

def readSentence(inpipe, senlines): for sen in senlines: inpipe.write(sen.strip()+'\n') inpipe.close() 

Für "aus stdout" Thread:

 def queueResult(outpipe, queue): for res in iter(outpipe.readlines()): queue.put(res) outpipe.close() 

Der Hauptthread, in dem das Kommandozeilenprogramm aufgerufen wird:

 def testSubprocess(): ee = open('sentences.txt', 'r') ff = open('result.txt', 'w') lines = ee.readlines() cmd = ['java', '-cp', 'someUsefulTools.jar', 'fooClassThatReadSentenceAndOutputResponse', '-stdin',] # take input from stdin proc = Popen(cmd, stdout=PIPE, stdin=PIPE) q = Queue() readThread = Thread(target=readSentence, args=(proc.stdin, lines)) queueThread = Thread(target=queueResult, args=(proc.stdout, q)) readThread.daemon = True queueThread.daemon = True readThread.start() queueThread.start() result = [] try: while not q.empty(): result = result.append(q.get_nowait()) except Empty: print 'No results!' 

Ich drucke Input und Output in der for-Schleife in readSentence () und queueResult () (nicht im obigen Code gezeigt). Ich fand am Ende, die Eingangssätze sind nicht vollständig gelesen, und die Ausgabe ist nichts. Was könnte in meinem Code schief gehen? Wie kann man die Synchronisation zwischen "stdin" -thread und "stdout" -thread erreichen, damit sie im Paar arbeiten können? Dh "stdin" -thread legte einen Satz auf die Pfeife, und dann "stdout" -thread erhalten das Ergebnis aus der Pfeife.

Ps Ich verweise diesen Artikel für non-blocking lesen: Non-blocking lesen auf einem subprocess.PIPE in python

    Python ist die beste Programmiersprache der Welt.