Codage entre Python 3.2 et MacOs X.6.7. [Résolut]

Codage entre Python 3.2 et MacOs X.6.7. [Résolut] - Python - Programmation

Marsh Posté le 25-05-2011 à 13:39:20    

Bonjour,  
J'ai écrit une boucle récursive pour récupérer les informations Unix d'éléments des répertoires à l'aide du module subprocess.check_output(). Ce qui me permet de récupérer les lignes à traiter.  
La commande qui me pose un problème est :

subprocess.check_output(["ls", lsOption, rep]).decode("Utf-8" ).split('\n'))


Ça fonctionne très bien en ligne de commande. Mais quand le script est lancé de manière automatique par le biais de launchd, j'obtient :  

subprocess.CalledProcessError: Command '['ls', '-TaeblO@', '/Re\314\247pertoireAvecDesAccents/']' returned non-zero exit status 1


Je précise que quand les répertoires n'ont pas d'accent, ça fonctionne. Je pensais à une erreur de codage, mais après de multiple tests (macroman, Utf-8, ascii…), j'ai toujours cette erreur avec un lancement automatique...  
Y compris en faisant rep.encode("macroman" ) par exemple.  
 
Une solution, explication, un lien d'information...
 
Python version : 3.2 (r32:88452, Feb 20 2011, 10:19:59)  
[GCC 4.0.1 (Apple Inc. build 5493)]  
supports_unicode_filenames = True


Message édité par Bidouil06 le 22-06-2011 à 15:22:14
Reply

Marsh Posté le 25-05-2011 à 13:39:20   

Reply

Marsh Posté le 26-05-2011 à 17:01:22    

Je verrais 2 possibilités:
 
1. Essaies de passer par le shell, voir si il a le bon encodage (encode en utf-8 et passe shell=true à subprocess.check_output)
 
2. Si ça tape directement dans HFS+ sans transcodage, l'encodage des noms est en UTF-16, pas en UTF-8. Essaies d'encoder ton nom de fichier en UTF-16
 
Autres idées:  

  • récupère le stderr de ls, histoire de savoir quel est son message d'erreur (pour avoir un truc un peu plus utile que just status 1), tu peux rediriger avec stderr= comme dans Popen (genre stderr=subprocess.STDOUT)
  • utilise les modules de la stdlib pour récupérer les infos dont tu as besoin, plutôt que ls


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 27-05-2011 à 15:08:29    

Merci pour ta réponse Masklinn.
 
En fait j'utilise 'ls' pour récupérer les informations des éléments : les ACLs, les autorisations (user, group), la date (de modification), le nom (réel, avec espace etc), le type (lien, etc), le poids etc. Sur une ligne, que je trie après.
Çà en une seule passe. Je n'ai pas trouver comment récupérer de telles infos dans les modules, d'ou 'ls'.
 
Quand je tappe :
from os.path import supports_unicode_filenames
print(supports_unicode_filenames)
J'obtiens :
US-ASCII  ???
Mais j'essaie avec Utf-16, je suis passé à côté…
 
Pas trouvé stdlib ??? os, io, sys ?

Reply

Marsh Posté le 27-05-2011 à 15:19:56    

Bidouil06 a écrit :

Merci pour ta réponse Masklinn.
 
En fait j'utilise 'ls' pour récupérer les informations des éléments : les ACLs, les autorisations (user, group), la date (de modification), le nom (réel, avec espace etc), le type (lien, etc), le poids etc. Sur une ligne, que je trie après.
Çà en une seule passe. Je n'ai pas trouver comment récupérer de telles infos dans les modules, d'ou 'ls'.
 
Quand je tappe :
from os.path import supports_unicode_filenames
print(supports_unicode_filenames)


Aucun rapport, ça c'est à propos de l'utilisation de noms de fichiers unicode (type str en Python 3) quand tu appelles une commande.

Bidouil06 a écrit :

Mais j'essaie avec Utf-16, je suis passé à côté…


Après avoir testé, ça semble être de l'UTF-8 décomposé en fait.

Bidouil06 a écrit :

Pas trouvé stdlib ??? os, io, sys ?


os.stat avec stat.* je dirais.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 17-06-2011 à 16:34:43    

Voilà une fonction pour remédier au blèm...
Pour les principaux caractères.
 

def codeT(texte):
 '''\nAdapte le codage des caractères Apple.
 codeT(texte)
 '''
 
 # Tables.
 cars={'e\\314\\200': 'è', \
 'e\\314\\201': 'é', \
 'e\\314\\202': 'ê', \
 'e\\314\\210': 'ë', \
 'E\\314\\200': 'È', \
 'E\\314\\201': 'É', \
 'E\\314\\202': 'Ê', \
 'E\\314\\210': 'Ë', \
 'a\\314\\200': 'à', \
 'a\\314\\201': 'á', \
 'a\\314\\202': 'â', \
 'a\\314\\210': 'ä', \
 'A\\314\\200': 'À', \
 'A\\314\\201': 'Á', \
 'A\\314\\202': 'Â', \
 'A\\314\\210': 'Ä', \
 'o\\314\\200': 'ò', \
 'o\\314\\201': 'ó', \
 'o\\314\\202': 'ô', \
 'o\\314\\210': 'ö', \
 'O\\314\\200': 'Ò', \
 'A\\314\\201': 'Ó', \
 'O\\314\\202': 'Ô', \
 'O\\314\\210': 'Ö', \
 'c\\314\\247': 'ç', \
 'C\\314\\247': 'Ç', \
 '\\302\\230': 'Ø', \
 '\\302\\240': '»', \
 '\\302\\241': '¡', \
 '\\302\\242': '¢', \
 '\\302\\245': '¥', \
 '\\302\\247': '§', \
 '\\302\\250': '¨', \
 '\\302\\251': '©', \
 '\\302\\252': 'ª', \
 '\\302\\253': '«', \
 '\\302\\254': '¬', \
 '\\302\\256': '®', \
 '\\302\\260': '°', \
 '\\302\\261': '±', \
 '\\302\\264': '´', \
 '\\302\\265': 'µ', \
 '\\302\\266': '¶', \
 '\\302\\267': '·', \
 '\\302\\272': 'º', \
 '\\302\\273': '»', \
 '\\302\\277': '¿', \
 '\\303\\230': '∆', \
 '\\303\\237': 'ß', \
 '\\303\\246': 'æ', \
 '\\303\\270': 'ø', \
 '\\304\\261': 'ı', \
 '\\305\\223': 'œ', \
 '\\306\\222': 'ƒ', \
 '\\316\\251': 'Ω', \
 '\\317\\200': 'π', \
 '\\342\\200\\224': '—', \
 '\\342\\200\\230': '‘', \
 '\\342\\200\\231': '’', \
 '\\342\\200\\234': '“', \
 '\\342\\200\\235': '”', \
 '\\342\\200\\236': '„', \
 '\\342\\200\\240': '†', \
 '\\342\\200\\241': '‡', \
 '\\342\\200\\242': '•', \
 '\\342\\200\\246': '…', \
 '\\342\\200\\260': '‰', \
 '\\342\\200\\271': '‹', \
 '\\342\\201\\204': '⁄', \
 '\\342\\202\\254': '€', \
 '\\342\\204\\242': '™', \
 '\\342\\210\\202': '∂', \
 '\\342\\210\\206': 'Ø', \
 '\\342\\210\\217': '∏', \
 '\\342\\210\\221': '∑', \
 '\\342\\210\\232': '√', \
 '\\342\\210\\236': '∞', \
 '\\342\\210\\253': '∫', \
 '\\342\\211\\210': '≈', \
 '\\342\\211\\240': '≠', \
 '\\342\\211\\244': '≤', \
 '\\342\\211\\245': '≥', \
 '\\342\\227\\212': '◊', \
 '\\r': "\x0d"}
 
 # Lecture de la table.
 for i in cars.keys():
  texte=texte.replace(i, cars[i])
 
 return texte


 
A fignoler, j'attend vos suggestions...


Message édité par Bidouil06 le 23-07-2011 à 19:37:57
Reply

Marsh Posté le 17-06-2011 à 16:51:59    

'tin tu portes bien ton pseudo toi [:petrus75]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed