Ich verwende diesen Code, um die Standardausgabe eines externen Programms zu erhalten:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
Die Methode communic () gibt ein Array von Bytes zurück:
>>> command_stdout
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file2\n'
Ich möchte jedoch mit der Ausgabe als normaler Python-String arbeiten. Damit ich es so ausdrucken kann:
>>> print(command_stdout)
-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file1
-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file2
Ich dachte, dafür ist die binascii.b2a_qp () -Methode gedacht , aber als ich es versuchte, bekam ich wieder das gleiche Byte-Array:
>>> binascii.b2a_qp(command_stdout)
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar 3 07:03 file2\n'
Wie konvertiere ich den Bytewert zurück in einen String? Ich meine, die "Batterien" zu verwenden, anstatt es manuell zu tun. Und ich möchte, dass Python 3 in Ordnung ist.
str(text_bytes)
die Codierung nicht angegeben werden kann. Abhängig davon, was in text_bytes enthalten ist, kann text_bytes.decode('cp1250
) `zu einer ganz anderen Zeichenfolge führen als text_bytes.decode('utf-8')
.
str
Funktion wird also nicht mehr in eine echte Zeichenfolge konvertiert. Man muss aus irgendeinem Grund explizit eine Kodierung sagen. Ich bin zu faul, um durchzulesen, warum. Konvertieren Sie es einfach in utf-8
und prüfen Sie, ob Ihr Code funktioniert. zBvar = var.decode('utf-8')
unicode_text = str(bytestring, character_encoding)
wie erwartet unter Python 3. Es unicode_text = bytestring.decode(character_encoding)
ist jedoch vorzuziehen, Verwechslungen zu vermeiden, da nur str(bytes_obj)
eine Textdarstellung erstellt wird, bytes_obj
anstatt sie in Text zu dekodieren: str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'
undstr(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
str(text_bytes)
funktioniert? Das kommt mir bizarr vor.