Seite 1 von 1
os.popen4 direkte Ausgabe
Verfasst: Sonntag 7. Januar 2007, 14:49
von BartSimpson
Hallo,
Ich habe versuche hiermit ein externes Programm laufen zu lassen, und desssen Ausgabe auszugeben. Dazu nutzte ich:
Code: Alles auswählen
Muell,Ausgabe=os.popen4("nmake")
print "Ausgabe:",Ausgabe.read()
Das externe Programm gibt ziemlich viel aus. Doch wenn ich mein Kode laufen lasse erhalte ich nur dies:
Ausgabe:
und erst wenn das externen Programm fertig ist kommt dessen Ausgabe. Aber nur die letzten paar Zeilen. Ich möchte, das immer wenn das externe Programm was nach stdout oder stderr schreibt, das das sofort ausgegeben wird. Wie kann ich das lösen?
Verfasst: Sonntag 7. Januar 2007, 16:07
von BlackJack
Indem Du statt alles zu lesen und dann auszugeben, zeilenweise liesst und zeilenweise ausgibst. Am besten über `sys.stdout` und nach jeder Zeile die `flush()`-Methode aufrufen, damit sie auch wirklich sofort rausgeschrieben wird.
Für den Fall, das dann die Zeilen immer noch nicht wie erwartet einzeln kommen, puffert `nmake`. Also entweder `nmake` patchen oder dem Programm vorspielen es wäre mit einem Terminal verbunden und nicht über eine Pipe mit einem anderen Programm. Das wird dann aber aufwendiger.
Verfasst: Sonntag 7. Januar 2007, 16:49
von BartSimpson
Und wie soll ich das machen(das mit dem Zeilen weisen auslesen)?
nmake patchen geht schlecht, es das ein MS Programm ist.
Verfasst: Sonntag 7. Januar 2007, 18:41
von BlackJack
`os.popen4()` gibt zwei Dateiobjekte zurück. Das zweite ist zum lesen geöffnet. Zeilenweise geht man über Dateien indem man einfach über das Objekt iteriert:
Code: Alles auswählen
In [26]: dummy, f = os.popen4('ls')
In [27]: for line in f:
....: sys.stdout.write(line)
....: sys.stdout.flush()
....:
# Viele Zeilen...
In [28]: dummy.close()
In [29]: f.close()
Verfasst: Sonntag 7. Januar 2007, 19:11
von BartSimpson
Nee das klappt leider nicht.

Es kommt alles nur nur sehr abgehackt.
Ich hatte es mal mit
Code: Alles auswählen
Muell,Ausgabe = os.popen4("nmake")
while not Ausgabe.closed:
Meldung = Ausgabe.readline()
if len(Meldung) != 0:
print Ausgabe.readline().rstrip("\n")
else:
Ausgabe.close()
Da kommt es zwar flüssig nur leider fliegt man mittendrin raus, da die Ausgabe aus leer Zeilen enthält:(
Verfasst: Sonntag 7. Januar 2007, 20:04
von BartSimpson
So jetzte geht es damit:
Code: Alles auswählen
if os.name == "nt":
Muell,Ausgabe = os.popen4("nmake")
else:
Muell,Ausgabe = os.popen4("nmake")
Lehrzaehler = 0
while not Ausgabe.closed:
Meldung = Ausgabe.readline()
if len(Meldung) != 0:
sys.stdout.write(Meldung)
sys.stdout.flush()
else:
Lehrzaehler +=1
if Lehrzaehler == 10:
Ausgabe.close()
nicht schön aber es geht:)