[Python-de] subprocess: Python 2 <> 3
Stefan Behnel
python-de at behnel.de
So Nov 6 18:49:51 CET 2011
Florian Lindner, 06.11.2011 18:37:
> ich habe ein Programm, welches ich in Python 3 neu schreiben will (2to3 ist
> bekannt, es soll aber auch eine neuimplementierung werden).
>
> Dabei wird ein Programm ausgeführt, welches seine Konsolenausgabe
> kontinuierlich aktualisiert:
>
> cmd = "flac -t '%s'"
> proc = Popen(shlex.split(cmd % f), stdout=PIPE, stderr=PIPE)
Warum baust du den Befehl nicht gleich als Liste zusammen? Ist dann auch
gleich viel sicherer.
> ret_code = proc.wait()
> print(proc.stderr.read())
>
> wird das Programm in Python 2 ausgeführt wird, läuft es so wie soll: Die
> Bildschirmausgabe wird nicht aktualisiert, nur das letzte Ausgabe des
> Programmes erscheint.
>
> Mit Python 3 jedoch wird anscheinend bei jeder aktualisierung eine neue Zeile
> nach stderr geschrieben, die Ausgabe schaut dann so aus:
>
> [...]
> ting, 79% complete\rDream Theater - Light Fuse And Get Away.flac: testing, 80%
> complete\rDream Theater - Light Fuse And Get Away.flac: testing, 82%
> complete\rDream Theater - Light Fuse And Get Away.flac: testing, 83%
> complete\rDream Theater - Light Fuse And Get Away.flac: testing, 84%
> complete\rDream Theater - Light Fuse And Get Away.flac: testing, 86%
> complete\rDream Theater - Light Fuse And Get Away.flac: testing, 87%
> complete\rDream Theater - Light Fuse And Get Away.flac: testing, 88%
> complete\rDream Theater - Light Fuse And Get Away.flac: testing, 90%
> complete\rDream Theater - Light Fuse And Get Away.flac: testing, 91%
> complete\rDream Theater - Light Fuse And Get Away.flac: testing, 92%
> complete\rDream Theater - Light Fuse And Get Away.flac: testing, 94% comp
> [...]
>
> Bei der Ausgabe eigentlich sogar noch ohne Zeilenumbrüche.
Den interessanten Teil hast du abgeschnitten. Die Ausgabe fängt doch
bestimmt mit einem "b'" an, oder? Das Problem ist, dass subprocess dir
einen Byte-String zurückliefert. Wenn du den in print() reinwirfst, wird er
anders interpretiert als unter Python 2.
Lösung: die Rückgabe von proc.stderr.read() dekodieren und dann ausgeben.
Stefan
Mehr Informationen über die Mailingliste python-de