[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