Sto usando questo codice per ottenere l'output standard da un programma esterno:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
Il metodo communic () restituisce una matrice di byte:
>>> 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'
Tuttavia, mi piacerebbe lavorare con l'output come una normale stringa Python. Per poterlo stampare in questo modo:
>>> 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
Ho pensato che fosse per questo il metodo binascii.b2a_qp () , ma quando l'ho provato ho ottenuto di nuovo lo stesso array di byte:
>>> 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'
Come riconvertire il valore dei byte in stringa? Voglio dire, usando le "batterie" invece di farlo manualmente. E vorrei che andasse bene con Python 3.
str(text_bytes)
non è possibile specificare la codifica. A seconda di cosa c'è in text_bytes, text_bytes.decode('cp1250
) `potrebbe risultare in una stringa molto diversa da text_bytes.decode('utf-8')
.
str
funzione non si converte più in una stringa reale. Uno DEVE dire esplicitamente una codifica per qualche motivo che sono pigro a leggere perché. Basta convertirlo in utf-8
e vedere se il codice ur funziona. ad es.var = var.decode('utf-8')
unicode_text = str(bytestring, character_encoding)
funziona come previsto su Python 3. Anche se unicode_text = bytestring.decode(character_encoding)
è preferibile evitare confusione con str(bytes_obj)
ciò che produce una rappresentazione testuale bytes_obj
anziché decodificarla in testo: str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'
estr(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
str(text_bytes)
funziona? Questo mi sembra strano.