os.popen4 direkte Ausgabe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
BartSimpson
User
Beiträge: 9
Registriert: Donnerstag 4. Januar 2007, 15:15

os.popen4 direkte Ausgabe

Beitragvon BartSimpson » Sonntag 7. Januar 2007, 14:49

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?
BlackJack

Beitragvon BlackJack » Sonntag 7. Januar 2007, 16:07

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.
BartSimpson
User
Beiträge: 9
Registriert: Donnerstag 4. Januar 2007, 15:15

Beitragvon BartSimpson » Sonntag 7. Januar 2007, 16:49

Und wie soll ich das machen(das mit dem Zeilen weisen auslesen)?
nmake patchen geht schlecht, es das ein MS Programm ist.
BlackJack

Beitragvon BlackJack » Sonntag 7. Januar 2007, 18:41

`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()
BartSimpson
User
Beiträge: 9
Registriert: Donnerstag 4. Januar 2007, 15:15

Beitragvon BartSimpson » Sonntag 7. Januar 2007, 19:11

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:(
BartSimpson
User
Beiträge: 9
Registriert: Donnerstag 4. Januar 2007, 15:15

Beitragvon BartSimpson » Sonntag 7. Januar 2007, 20:04

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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]