IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Accents Command Line depuis un script Python


Sujet :

Python

  1. #1
    Membre régulier Avatar de nicou50
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 131
    Points : 80
    Points
    80
    Par défaut Accents Command Line depuis un script Python
    Comment faire pour afficher les accents au command line en appelant un script python. J'ai essayé d'utiliser le module locale (genre sellocale(LC_ALL,'cp1252')...mais ça ne marche plus.
    Je suis donc obligé de marquer du code directement:
    ex:pour afficher Spéficification.odt, je dois faire print "Sp\202cification.odt", ce qui n'est pas pratique quand on a plein de messages d'erreurs. Est-ce qu'on peut m'aider?

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 508
    Points
    5 508
    Par défaut
    ASCII est l'encodage par défaut utilisé par python. Il est possible de définir l'encodage du code source en utilisant une ligne de commentaire spéciale placée en 1ere ou 2eme ligne du fichier source:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    L:1#! /usr/bin/env python
    L&#58;2# -*- coding&#58; <encoding name> -*-
    L&#58;3
    L&#58;4# ...suite du code ...
    L&#58;5
    <encoding name> peut être utf-8 si ton éditeur est configurer pour générer un encodage utf-8 ou Latin-1 (qui est la version ASCII utilisée pour reconnaitre les accents et autre spécificités de la langue française) si ton éditeur utilise un encodage du type ISO-8859-1 ou ISO-8859-15.

    Meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre régulier Avatar de nicou50
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 131
    Points : 80
    Points
    80
    Par défaut Merci Thierry mais...
    Salut Thierry.
    j'utiliser déjà la ligne -*- coding:cp1252 -*- dans mon script. Je vais essayer Latin-1 comme tu me dis, mais le problème vient du command line de windows.
    Lorsque je fais un print "ééé" dans mon éditeur, il l'affiche comme il faut.
    c'est lorsque j'appelle mon script depuis le terminal dos de windows que mon "ééé" n'est pas affiché correctement(caractère nowhere). Seulement, il faudrait que je me déclare à chaque fois une classe dans chacune de mes fonctions pour que cela fonctionne.
    Dis moi si tu trouve un moyen de comprendre ce .py et de le rendre plus simple... Merci

  4. #4
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    et si tu écris
    ?, cela fonctionne (le u devant un string indique que ton string est un unicode

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 508
    Points
    5 508
    Par défaut
    Salut,

    Le fond du problème est que Windows (ANSI) et Dos (OEM) n'utilisent pas la même table de caractères. La table de caractère Windows/ANSI (CP 1252) inclus pas mal de caractères accentués qui n'existent pas dans OEM (CP 850).


    Solution n°1: The hard way


    Tu peux changer le code de la page (CP) en console avec la commande DOS (définit la table de caractères utilisés):

    Il est possible de changer le CP directement depuis ton code en utilisant une fonction de l'API Win32:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from win32console import SetConsoleOutputCP
    SetConsoleOutputCP&#40;1252&#41;
    print "éééééééé"
    A ce stade, les caractères ne s'affichent toujours pas correctement pour la raison suivante: seul le CP correspondant à la table de caractère originale (OEM: Original Equipment Manufacturer) s'affiche correctement avec la police Raster (Raster Fonts) définie par défaut en mode console (pour changer la police de la console: click bouton droite sur la console -> properties -> Font). Pour utiliser correctement CP 1252, il faut changer la police de la console et utiliser Lucida Console (TrueType Font). Voir les remarques à la page : http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/chcp.mspx . Je ne sais pas si l'API Win32 définit également une fonction te permettant de changer cette police directement depuis le code.

    Une fois la police de la console définie comme Lucida Console, le code ci-dessus s'exécute parfaitement au prix d'une fonction de l'API Win32 et un changement manuel de la police utilisée par la console. C'est l'approche utilisée lorsqu'on écrit un programme console en C ou en C++ (également possibilité de conversion d'un caractère Char ANSI vers OEM). BEAUCOUP TROP COMPLIQUE POUR MOI et PEU PORTABLE (même pas portable du tout)!

    Solution n°2: The Python/Unicode way

    La solution proposée par Guigui_ fonctionne dans tous les cas de figure que j'ai testé sans avoir besoin de 1) changer la page de code de la console (CP) ni 2) modifier la police de la console (Raster Fonts par défaut):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    # -*- coding&#58; cp1252 -*-
    print u"éééééé"
    En plus, c'est portable, pas d'API Win32! A utiliser sans crainte et sans modération.

    Meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 508
    Points
    5 508
    Par défaut
    Dans le contexte de ce que j'ai décrit plus haut, le module Printiso.py réalise une conversion des caractère vers la table de caractère DOS/OEM CP850, permettant ainsi:

    1) d'éviter l'appel de win32console.SetConsoleOutputCP(1252)
    2) d'éviter de devoir changer la police par défaut de la console (Raster Fonts) en Lucida Console (TrueType Font)

    Toutefois, l'utilisation de ce module n'est pas portable et je préfère de loin la solution proposée par l'utilisation d'une chaînes de caractère unicode (voir intervention de Guigui_ plus haut).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # -*- coding: utf-8 -*-
    print u"éééééé"
    s'exécute parfaitement sous Linux et dans une console DOS. Du moins, c'est le cas chez moi. A+ et bonne chance

    Pour te former : les Cours et tutoriels pour apprendre la programmation Python , en particulier celui la est génial : Apprendre à programmer avec Python 3 par Gérard Swinnen



    Meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Hello,

    Je relance ce thread, car ce problème m'agace.

    Il n'y a donc aucun moyen d'éviter de se trimbaler des préfixes (u) en mode UTF-8, et d'utiliser du Latin-1 ? C'est pourtant bien fait pour ça...

    Surtout que le u semble ne pas fonctionner dans une expression telle que


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lancer un script shell depuis un script python
    Par freestyler dans le forum Général Python
    Réponses: 18
    Dernier message: 04/10/2011, 10h59
  2. comment re-sourcer mon .bashrc depuis un script python?
    Par Krishna dans le forum Général Python
    Réponses: 1
    Dernier message: 02/10/2010, 21h40
  3. Démarrer command-line depuis VB.Net
    Par ovcrash dans le forum VB.NET
    Réponses: 2
    Dernier message: 15/02/2010, 16h23
  4. Sauter vers le mode interactif depuis un script Python
    Par bahamut00 dans le forum Général Python
    Réponses: 5
    Dernier message: 21/07/2006, 17h33
  5. lancer un .bat depuis un script python
    Par manu.c dans le forum Général Python
    Réponses: 9
    Dernier message: 02/05/2006, 15h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo