Ich habe folgenden Python 2 Beispiel-Code, den ich mit Python kompatibel machen will 3:Python 2 bis 3 Umwandlung: Iterieren über die Leitungen in subprocess stdout
call = 'for i in {1..5}; do sleep 1; echo "Hello $i"; done'
p = subprocess.Popen(call, stdout=subprocess.PIPE, shell=True)
for line in iter(p.stdout.readline, ''):
print(line, end='')
Das funktioniert gut in Python 2, aber in Python 3 p.stdout
erlaubt mir nicht, eine Codierung anzugeben und das Lesen wird Byte-Zeichenfolgen anstelle von Unicode zurückgeben, so dass der Vergleich mit ''
immer false zurückgibt und iter
wird nicht gestoppt. This issue scheint zu implizieren, dass es in Python 3.6 eine Möglichkeit gibt, diese Kodierung zu definieren.
Für jetzt habe ich den iter
Aufruf geändert, um zu stoppen, wenn es eine leere Bytezeichenfolge iter(p.stdout.readline, b'')
findet, die in 2 und 3 zu funktionieren scheint. Meine Fragen sind: Ist das sicher in beiden 2 und 3? Gibt es eine bessere Möglichkeit, die Kompatibilität sicherzustellen?
Hinweis: Ich verwende nicht for line in p.stdout:
, da ich jede Zeile gedruckt werden muss, wie es generiert wird und this answerp.stdout
einen zu großen Puffer hat.
FYI. Ich habe Ihren Code in Ubuntu gegen Python 2 ausprobiert, ich bekomme: 'Hallo {1..5}' –
Hinzufügen 'executable = '/ bin/bash' zum' Popen' Aufruf wird helfen, die richtige Ausgabe zu bekommen. Ich untersuche noch, warum der Fehler in Python 3. –
Dank @HaiVu, lief ich es auf einem Mac und in CentOS, beide mit bash, und es funktionierte ohne Notwendigkeit, die ausführbare Datei anzugeben. Wenn ich es in Ubuntu versuche, sehe ich das gleiche wie du, keine Ahnung warum. – foglerit