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 communicate() 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, j’aimerais travailler avec la sortie comme une chaîne Python normale. Ainsi, je pourrais 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'était à cela que servait la méthode [binascii.b2a_qp()][1], mais lorsque j'ai essayé, j'ai obtenu à nouveau 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 de caractères ? Je veux dire, en utilisant les "batteries" ; au lieu de le faire manuellement. Et j'aimerais que cela soit compatible avec Python 3.
[1] : http://docs.python.org/3.0/library/binascii.html?highlight=b2a#binascii.b2a_qp
Vous devez décoder l'objet bytes pour produire une chaîne de caractères :
>>> b"abcde"
b'abcde'
# utf-8 is used here because it is a very common encoding, but you
# need to use the encoding your data is actually in.
>>> b"abcde".decode("utf-8")
'abcde'
Vous devez décoder la chaîne d'octets et la transformer en une chaîne de caractères (Unicode).
Sur Python 2
encoding = 'utf-8'
'hello'.decode(encoding)
ou
unicode('hello', encoding)
Sur Python 3
encoding = 'utf-8'
b'hello'.decode(encoding)
ou
str(b'hello', encoding)
Je pense que tu veux vraiment ça :
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
>>> command_text = command_stdout.decode(encoding='windows-1252')
La réponse d'Aaron était correcte, sauf que vous devez savoir quel encodage utiliser. Et je crois que Windows utilise 'windows-1252'. Cela n'aura d'importance que si votre contenu contient des caractères inhabituels (non ASCII), mais dans ce cas, cela fera une différence.
D'ailleurs, le fait que cela soit important est la raison pour laquelle Python a décidé d'utiliser deux types différents pour les données binaires et textuelles : il ne peut pas faire de conversion magique entre les deux, car il ne connaît pas l'encodage si vous ne lui dites pas ! La seule façon pour VOUS de le savoir est de lire la documentation de Windows (ou de la lire ici).