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

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

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

Und wie soll ich das machen(das mit dem Zeilen weisen auslesen)?
nmake patchen geht schlecht, es das ein MS Programm ist.
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()
BartSimpson
User
Beiträge: 9
Registriert: Donnerstag 4. Januar 2007, 15:15

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

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