2 Stimmen

Lesen von stdout aus einem Programm in einem anderen Programm

Ich habe ein Problem mit dem Lesen von stdout in Python. Ich habe ein bisschen zu erklären, was ich versuche zu tun.

Ich habe ein Python-Programm ( foo ); dies ruft ein zweites Python-Programm ( bar ). bar gibt Statusdetails und andere zu protokollierende Informationen an stdout zurück. Der foo muss dies nun lesen. Im Prinzip funktioniert es. Ich kann die Ausgabe von bar und ohne Probleme an eine Protokolldatei senden. Die Probleme beginnen, wenn ich versuche, nach bestimmten Ausdrücken in der Ausgabe von bar (der Statusbericht).

Ich lese die Ausgabe mit os.read(fn, n) aus dem stdout von bar . Das Problem ist, dass os.read liest n Bytes, aber nicht eine Zeile; es kann mehr oder weniger sein. Ich möchte, dass jede Zeile gelesen wird, die auf stdout geschrieben wird von bar enden diese Zeilen mit \n und werden entweder mit drucken oder mit sys.stdout.write gefolgt von einer sys.stdout.flush() .

foo ruft auf. bar usando:

bar= subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
fd_in[0] = bar.stdout.fileno()
fd_in[1] = bar.stderr.fileno()

Mein Code sieht im Moment wie folgt aus. bar schreibt:

print 'TAG INFO1 INFO2 INFO3'
#or
sys.stdout.write('TAG INFO1 INFO2 INFO3\n')
sys.stdout.flush()

Ich lese gerade in foo mit

buf = os.read(fd_in[0], 256)

Wenn ich dies in eine Protokolldatei mit schreibe:

int_logFile.write(buf)
int_logFile.flush()

ist alles in Ordnung. Aber wenn ich das erste Wort der Ausgabezeile wie folgt erfassen möchte:

tokens = buf.strip('\n').split(' ')

Ich lande in der Patsche, weil ich keinen TAG bekomme, aber vielleicht habe ich INFOx oder etwas von einer früheren Ausgabe, das nichts mit meinen Statusmeldungen zu tun hat.

Um es zusammenzufassen, muss ich also die Ausgabe von bar Zeile für Zeile in foo . Irgendwelche Ideen???

2voto

Cat Plus Plus Punkte 119072

Er, bar.stdout.readline() ? Es ist selten notwendig, bis zu den Dateideskriptoren vorzudringen.

0voto

Aphex Punkte 7220

Wie wäre es mit Popen.kommunizieren ? Damit können Sie auch Eingaben an den Prozess senden, wenn Sie das möchten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X