Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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 ?
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
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
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.
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
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
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")
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
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
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.
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
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
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.
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.