OVH Cloud OVH Cloud

Pc subprocess, stdout, et unicode

5 réponses
Avatar
Méta-MCI
Bonsoir !


Ce code :
p=subprocess.Popen(chaine, shell=True, stdout=subprocess.PIPE,
stdin=subprocess.PIPE, stderr=subprocess.PIPE)
data=p.stdout.read()

Fonctionne, sauf quand stdout.read() traite des données unicode, avec des
caractères>255 (on récupère alors des "?")

Comment faire, pour récupérer du "vrai" unicode avec stdout.read() ?

Merci d'avance, pour toute réponse.


Michel Claveau

5 réponses

Avatar
Amaury Forgeot d'Arc
Bonsoir !


Ce code :
p=subprocess.Popen(chaine, shell=True, stdout=subprocess.PIPE,
stdin=subprocess.PIPE, stderr=subprocess.PIPE)
data=p.stdout.read()

Fonctionne, sauf quand stdout.read() traite des données unicode, avec des
caractères>255 (on récupère alors des "?")

Comment faire, pour récupérer du "vrai" unicode avec stdout.read() ?

Merci d'avance, pour toute réponse.


Michel Claveau



Après quelques tests, il me semble que p.stdout est un flux fichier, en
mode "rb", qui ramène donc les octets tel quels. Il n'y a pas de
caractère>255 à proprement parler.
Bref, je pense que c'est le process exécuté qui envoie ces "?".

De quel programme s'agit-il ? Qu'est-ce qu'on récupère quand on redirige
la sortie vers un fichier ? Certains programmes essaient d'être
intelligents en devinant qui les appelle, et comment il faut afficher
les données. Peut-être est-on dans ce cas ?

--
Amaury

Avatar
Michel Claveau
Bonsoir !


Merci d'avoir regardé.

Le programme en question, c'est un simple "DIR" (sous windows)

Tant que le directory visé contient des fichiers "courants", ça
fonctionne (il me suffit de décoder du cp850).

Mais, lorsqu'il y a des fichiers avec le nom en cyrillique (par
exemple), ça accroche.

Une idée de solution ?

--
@-salutations

Michel Claveau
Avatar
Amaury Forgeot d'Arc
Bonsoir !


Merci d'avoir regardé.

Le programme en question, c'est un simple "DIR" (sous windows)

Tant que le directory visé contient des fichiers "courants", ça
fonctionne (il me suffit de décoder du cp850).

Mais, lorsqu'il y a des fichiers avec le nom en cyrillique (par
exemple), ça accroche.

Une idée de solution ?



Si la commande DIR envoie du cp850, elle ne pourra pas envoyer les
caractères qui sortent de cp850. C'est pour cela que le cyrillique ne
sort pas.

Si tu veux vraiment utiliser DIR, il y a un moyen pour le faire
fonctionner en "Unicode" (utf16 en fait: le format de fichier unicode
n'existe pas):
cmd /u /c dir ...
(/u pour Unicode, regarde dans l'aide " cmd /? ")

Et là, on récupère une sortie qui se décode bien avec "utf-16",
cyrillique et tout et tout.

Dans mes tests, j'ai tapé:
a=subprocess.Popen("cmd /u /c dir c:temp*", stdout=subprocess.PIPE)
t=a.stdout.read().decode("utf-16")


--
Amaury

Avatar
Méta-MCI
Re !

Oui, évidemment, utiliser CMD /U forcera stdout en Unicode.

Malheureusement, DIR n'était qu'un exemple. Les commandes venant de
l'extérieur, je ne peux pas toujours utiliser cette méthode.

Quand au fait que le DIR standard renvoie du cp850, cela ne l'empêche
nullement de visualiser des noms de fichiers en cyrillique (ou en chinois),
à condition que l'on ait opté pour la police Lucida_Console (clic-droit +
propriétés sur la barre de titre, puis renouveler la commande).
Par contre, je ne sais pas comment windows se débrouille dans ce genre de
cas, mais ça marche. Et le même principe a été repris avec Power-Shell (au
passage, Power-Shell plante subprocess).


Je vais essayer de forcer CMD /U comme valeur par défaut du shell de
windows.


@+

Michel Claveau
Avatar
Méta-MCI
Bonjour !

ça marche !
Merci Amaury !

Il suffit (suffisait) de définir "CMD.exe /U/C" comme console d'exécution
(Command Processor) par défaut, pour que le flux STDOUT soit en utf-16.

Par contre, lorsqu'on lance une invite de commande, avec CMD /U/K, si utf-16
est bien utilisé pour STDOUT, la "console" reste en cp850. Mais, si l'on est
en police "Lucida_Console", windows se débrouille avec les caractères
"exotique". Je ne sais pas comment, mais ça marche, ce qui permet de
visualiser des caractères non-cp850 dans une fenêtre cp-850.

Bref, merci encore à Amaury pour son aiguillage, qui me permet d'avoir une
console IE/Python, traitant correctement l'unicode.

@-salutations

Mochel Claveau