Seite 1 von 1

subprocess Rückgabe zeilenweise auslesen

Verfasst: Montag 30. Juni 2008, 20:54
von Nikolas
Hallo

Bei meinem traceRoute-Programm mit Ortsangabe rufe ich intern ein traceroute auf und parse dessen Rückgabe werte. Bisher warte ich per process.wait() auf das Ende der Ausführung, lese dann die Rückgabe, verarbeite sie weiter und zeige alles an.
Beim traceRoute tröpflen die Ergebnisse aber eher einzeln herrein, so dass mein Programm erst mal nichts von sich gibt und danach alles ausgibt. Wenn das traceroute aber nicht terminiert, oder eine Minute auf einen Router wartet, bekomme ich davon nichts mit und sehe auch nicht, welche Router schon durchlaufen wurden, und wo es hängt.

Jetzt würde ich also gerne eine Zeile sofort verarbeiten. Mein Ansatz war jetzt, auf das process.wait() zu verzichten und alle halbe Sekunde per communicate auf die Ausgabe zuzugreifen. Komischerweise bekomme ich trotzdem alle Zeilen auf einmal oder eben gar nicht.
Vielleicht werden die Daten zwischengespeichert, aber ein process.strout.flush() liefert einen IOError: Bad File descriptor.

Das ist mein erster Kontakt mit subprocess und so langsam gehen mir die Ideen aus.

Nikolas

Verfasst: Montag 30. Juni 2008, 21:00
von BlackJack
`communicate()` kannst Du nur einmal Aufrufen, dann läuft das gesamte Programm ab.

Wenn Dir einfaches Iterieren über die Ausgabe des Prozesses nicht ausreicht, dann kämpfst Du vermutlich dagegen, dass das aufgerufene Programm seine Ausgabe puffert. Wogegen man mit `subprocess` nichts machen kann. Da müsste man dann zu `pexpect` greifen.

Verfasst: Dienstag 1. Juli 2008, 09:13
von Nikolas
Schade. Das ganze war eigentlich nur eine kleine Idee für nebenbei und für eine neue Bibliothek habe ich leider keine Zeit.

Wenn ich mich mal wieder dransetze, werde ich mir pexpect mal anschauen, wahrscheinlich kann ich es dann häufiger einsetzen.

Bis dahin werde ich wohl ein einfaches traceroute durchführen und danach noch mein tracePlus durchlaufen lassen und mir die Städte anschauen.

Teilweise sind die Wege wirklich komisch....