Seite 1 von 1

subprocess und newline

Verfasst: Montag 13. Mai 2013, 08:59
von Shadowxy1
Hallo Zusammen,

habe da mal eine Frage zum folgenden Kontext:

Es handelt sich um ein Linuxsystem und Python 2.7.3 ist installiert.
Kleines Beispiel mit partclone.

Code: Alles auswählen

import subprocess

sub = subprocess.Popen(['partclone.chkimg', '-B', '-s', 'sda2.reiserfs'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

for line in iter(sub.stderr.readline, ""):
    print line
Soweit ich weiß gibt "sub.stderr.readline" nur etwas zurück wenn eine "newline" kommt, ansonsten wartet es. Nun gibt es Programme, die den Status aber immer wieder in die selbe Zeile ausgeben und somit kein "newline" kommt. Erst bei Beendigung des Prozesse wird dann der Status ausgegeben. Kann man dieses irgendwie umgehen?


PS: Habe den suprocess editiert

Gruss shadowxy1

Re: subprocess und newline

Verfasst: Montag 13. Mai 2013, 10:53
von BlackJack
@Shadowxy1: Ausser nicht `readline()` zu verwenden, würde sagen Nein.

``shell=True`` sollte man übrigens vermeiden, sonst hat man die gleichen Probleme die man mit `os.system()` auch hat. Und unter anderem um die loszuwerden gibt es ja das `subprocess`-Modul.

Re: subprocess und newline

Verfasst: Montag 13. Mai 2013, 11:57
von Shadowxy1
Was soll ich denn verwenden, wenn nicht readline? Bzw. gibt es vielleicht noch andere Möglichkeiten den Fortschritt zu erfragen?

Re: subprocess und newline

Verfasst: Montag 13. Mai 2013, 12:23
von DasIch
Es gibt ja schon noch ein paar andere Methoden die man nutzen kann, irgendwas sagt mir dass die auch irgendwo dokumentiert sind.

Re: subprocess und newline

Verfasst: Montag 13. Mai 2013, 12:35
von Shadowxy1
Kannst du mir mal ein paar Hinweise geben nach was man da soo gucken kann?!

Re: subprocess und newline

Verfasst: Montag 13. Mai 2013, 14:09
von EyDu
Angeblich gibt es da so eine Dokumentation zu Python ... ;-)

Re: subprocess und newline

Verfasst: Montag 13. Mai 2013, 14:13
von cofi
Och kommt schon, das muss nicht sein.

`stderr` und `stdout` sind File-like Objekte: http://docs.python.org/2/library/stdtyp ... le-objects, ich wuerde es mit `read` versuchen.

Dann gibt es noch ein Problem: Wenn du `stdout` und `stderr` umleitest, solltest du auch beide auslesen, sonst kann es Probleme geben.

Re: subprocess und newline

Verfasst: Montag 13. Mai 2013, 19:31
von Shadowxy1
Erstmal Danke an cofi, dass du mir wenigstens versuchst zu helfen :)

Die Python Doku ist groß und ohne sinnige Hinweise gleicht es einem Suchen der Nadel im Heuhaufen.

Aber zum Thema:

Ich bin mir noch nicht ganz sicher ob ihr genau wisst was ich meine. Also versuch ich es nochmal darzustellen:

Ich habe eine GUI. Diese GUI soll nun den Fortschritt eine Prozesse anzeigen, den ich mit einem subprozess starte.
In dem subprozess wird zum Beispiel ein Image mit Hilfe von partclone erstellt. Es können auch andere Dinge sein, wie ein Image zippen mit 7zip.

Wenn ich zum Beispiel den Befehl "partclone.chkimg -B -s sda2.reiserfs" im Terminal ausführe, wird der Fortschritt den ich haben will immer in der selben Zeile angezeigt, also die Zeile nur refresht.

terminal zeile 100: 0%
terminal zeile 100: 1%

Ich glaube mit Steuerzeichen sieht es dann so aus: \r0%\r1%\r2% usw.

Damit kommt aber readline und ich glaub auch read nicht zurecht, weil immer die selber Zeile refresht wird und nicht eine neue Zeile geschrieben wird.
Wenn die ausgabe Zeilenweise wäre, würde es funktionieren.

terminal zeile 100: 0%
terminal zeile 101: 1%

Irgendwann ist das Erstellen des Images abgeschlossen und dann bekomme ich die die 100% zurück.

terminal zeile 100: 100%
terminal zeile 101: successful

Aber alles was dazwischen passiert, also von 1%-99%, wird nichts zurückgegeben. Und somit kann ich keinen Fortschritt in der GUI anzeigen außer 0% und 100% :)

Die Frage ist eben wie ich an die Zwischenschritte herankomme.

Gruß shadowxy1

Re: subprocess und newline

Verfasst: Montag 13. Mai 2013, 19:47
von BlackJack
@Shadowxy1: Da kommst Du mit der `read()`-Methode dran. Wobei Du entweder byteweise lesen musst, oder in grösseren Blöcken und Du musst Dich um das zerlegen an den '\r'-Zeichen selber kümmern, beziehungsweise um das Zusammensetzen wenn Du byteweise liest.

Re: subprocess und newline

Verfasst: Dienstag 14. Mai 2013, 07:43
von Shadowxy1
Hallo BlackJack,

das war der Hinweis den ich gebraucht habe. Ich habe read() immer ohne das byteweise lesen genutzt, darum hat er immer auf EOF gewartet.

Vielen Dank

Gruß shadowxy1