J'utilise ce code pour obtenir la sortie standard d'un programme externe:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
La méthode communic () renvoie un tableau d'octets:
>>> 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'
Cependant, je voudrais travailler avec la sortie comme une chaîne Python normale. Pour que je puisse l'imprimer comme ceci:
>>> 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
Je pensais que c'est à cela que sert la méthode binascii.b2a_qp () , mais quand je l'ai essayée, j'ai de nouveau obtenu le même tableau d'octets:
>>> 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'
Comment puis-je reconvertir la valeur des octets en chaîne? Je veux dire, en utilisant les "batteries" au lieu de le faire manuellement. Et je voudrais que ce soit OK avec Python 3.
str(text_bytes)
ne peut pas spécifier l'encodage. Selon ce qui se trouve dans text_bytes, text_bytes.decode('cp1250
) `peut entraîner une chaîne très différente de text_bytes.decode('utf-8')
.
str
fonction ne se convertit plus en une vraie chaîne. On DOIT dire explicitement un encodage pour une raison quelconque, je suis trop paresseux pour lire pourquoi. Il suffit de le convertir utf-8
et de voir si votre code fonctionne. par exemplevar = var.decode('utf-8')
unicode_text = str(bytestring, character_encoding)
fonctionne comme prévu sur Python 3. Bien qu'il unicode_text = bytestring.decode(character_encoding)
soit plus préférable d'éviter la confusion avec juste ce str(bytes_obj)
qui produit une représentation textuelle au bytes_obj
lieu de la décoder en texte: str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'
etstr(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
str(text_bytes)
marche pas ? Cela me semble bizarre.