[Python-de] subprocess: Python 2 <> 3

Peter Otten __peter__ at web.de
So Nov 6 19:34:13 CET 2011


Stefan Behnel wrote:

> 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.

Oder die Bytes unverändert weiterreichen:

import sys
from subprocess import Popen, PIPE

filename = sys.argv[1]
cmd = ["flac", "-t", filename]
proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
stdout, stderr = proc.communicate()
sys.stdout.buffer.write(stderr)




Mehr Informationen über die Mailingliste python-de