Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème encodage python 2.7

    7 août 2015 à 17:27:52

    Bonjour à toutes et à tous.

    Je commence tout juste la programmation que j'essaie d'apprendre seul dans mon coin. J'ai donc actuellement un niveau abyssal comme vous pouvez vous en douter ; je n'ai commencé le cours sur le site que depuis 3 jours à peu près et je tente de suivre les tutoriels pas à pas pour y comprendre quelque chose.

    Pour information : je suis sur Windows 7 32-bit et j'utilise python 2.7.10.

    Pourquoi pas python 3.x? Mon objectif à terme est de créer des (petits) jeux type roguelikes en utilisant une librairie graphique appelée libtcod qui est spécialement faite pour ces jeux. Le guide sur internet est axé sur python (j'aurais de toute façon choisi le langage le plus accessible) mais précise que cette libraire n'est pas encore compatible avec python 3.x et il conseille d'utiliser donc python 2.7. Voilà la raison.

    Mon problème est que je ne comprends pas très bien comment encoder correctement un programme et quoique je fasse, la console affiche des caractères différents pour les accents. Je précise que j'utilise Notepad++. Exemple, l'exercice sur les années bissextiles du cours que j'ai recopié bêtement:

    # -*- coding: Latin-1 -*
    
    import os
    
    annee = input("Saisissez une année : ") 
    annee = int(annee)
    
    if annee % 400 == 0 or (annee % 4 == 0 and annee % 100 !=0):
        print "L\'an", annee, "est bissextile"
    else:
        print "L\'an", annee, "n\'est pas bissextile"
        
    os.system("pause")

    Je l'enregistre, puis je double-clique et ça m'affiche :



    Mais sinon, quand je l'édite avec IDLE et que je le lance à partir de ça, l'encodage semble bon :

    Sur notepad++, j'ai pourtant sélectionné "encodage" > "codage de caractères" > "langues d'Europe occidentale" > "iso 8859-1" qui est latin-1 donc.

    Voilà donc, pourriez-vous m'aider? Le problème n'est pas immense bien sûr, mais je ne comprends juste pas.

    ps : Évidemment, ça risque de ne pas être la seule question que je pose sur ce forum...

    • Partager sur Facebook
    • Partager sur Twitter
      7 août 2015 à 18:16:49

      Vu que tu es débutant, laisse-moi te féliciter sur la manière dont tu poses la question! Le code est dans les balises ad-hocs, et ton problème est expliqué clairement. Bravo!

      Pour ton problème, c'est Microsoft qui en est responsable. :) Ta console (la fenêtre noire) n'a pas le même encodage que ton script Python et c'est ça qui cause ce problème d'affichage.

      Mais tout d'abord, laisse-moi te conseiller de ne pas exécuter tes scripts python en double-cliquant sur le fichier de ton script. Lance le programme cmd (Clique sur le bouton Windows, tape cmd puis enter). Te voilà dans la console, et plus particulièrement dans un répertoire donné (prbablement C:\Users\Ton Nom. Avec les commandes cd tu vas naviguer pour aller dans le dossier contenant ton script python. Mettons que ton script se trouve dans le C:\scripts_python alors tu fais

      cd \scripts_python
      Petit truc au passage... Tu ne dois pas taper tout le nom du dossier. Une fois que tu as mis 3 ou 4 lettres, essaies de pousser sur la touche TAB. Un nom te sera proposé. Si c'est pas le bon, continue d'appuyer sur Tab jusqu'à avoir le bon.

      Te voilà au bon endroit donc. Alors pour exécuter ton script, tu appelles python.exe et tu lui passes en argument le nom de ton fichier. Si ton fichier s'appelle annee_bissextile.py, tu feras

      python annee_bissextile.py
      Note que tu n'es pas obligé d'écrire le .exe derrière python.

      S'il t'insulte avec un message du style 'python' n'est pas reconnu en tant que commande interne... ça veut dire que le programme python n'est pas dans ton system path. C'est quoi? C'est juste une liste de répertoires qui dit à Windows où regarder par défaut quand tu tapes le nom d'un programme. Comment ajouter python à cette liste?

      • Clic sur le bouton Windows
      • Clic droit sur Ordinateur
      • Clic gauche sur Propriétés
      • Dans la liste à gauche, clic sur Paramètres système avancés
      • Une fenêtre s'ouvre, va dans l'onglet "Paramètres système avancés" normalement t'y es déjà
      • Clic gauche sur le bouton "Variables d'environnement..."
      • Dans la partie "Variables système", chercher dans la liste Path, clic gauche dessus
      • Clic-gauche sur le bouton "Modifier..."
      • Là se trouve la liste des dossiers mentionnés plus haut. Tu ajoutes python en ajoutant derrière ce qui se trouve déjà : ;C:\Python27. Evidemment je pars du principe que tu as mis python dans ce dossier (par défaut). Attention à ne pas mettre d'espaces, et à séparer le dernier élément par un ;. Et je répète: aucun espaces! :)

      Tu clic sur Ok partout et tu relances la console avec cmd. Il se pourrait que tu doives redémarrer ton ordinateur pour que ces changements soient pris en compte.

      Maintenant on revient à notre problème d'encodage. Donc dans la console, avant de lancer python, si tu écris chcp, Windows va t'indiquer quel Code Page est utilisée. Pour du latin-1, il faut alors lui dire d'utiliser le code page 1252, ce qui se fait en écrivant chcp 1252. Une fois ce changement effectué, tu fais juste python annee_bissextiles.py et voilà !

      Conseil: ne met pas d'espaces ni de caractères non ascii (accentués etc) dans les noms de tes fichiers / dossier. Conseil 2: N'utilise pas l'encodage latin-1 mais utf-8. Donc dans ton code tu places le # -*- coding: utf-8 -*-. Tu enregistres ton fichier en UTF-8 avec Notepad++. Et pour le chcp le code est 65001. Voir https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx

      -
      Edité par Dan737 7 août 2015 à 18:29:41

      • Partager sur Facebook
      • Partager sur Twitter
        7 août 2015 à 19:04:51

        Une autre possibilité, probablement beaucoup plus élégante:

        Enregistre ton script en UTF-8. Fais l'import suivant

        from future import unicode_literals
        
        Ceci aura pour effet que toutes les chaînes de caractères écrites dans ton code, comme "à l'étranger" sera considéré comme de l'unicode et sera transformé dans le code page de ta console.

        Essaie ceci:

        from future import unicode_literals
        print "L'anée bissextile"
        

        -
        Edité par Dan737 7 août 2015 à 19:05:32

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          7 août 2015 à 19:10:17

          Salut,

          Je vais revenir sur un conseil de Dan737 :

          Concernant la cmd, je sais que cette astuce a l'air très peu connue (en tout cas jamais donnée), mais plutôt que de lancer cmd et ensuite chercher le bon répertoire avec cd etc tu peux directement lancer cmd dans le dossier cible en utilisant shift + clic droit, et cliquer sur ouvrir une fenêtre de commande ici. Je trouve ça plus rapide ^^

          Sinon puisque tu débutes, je trouve ça dommage de se lancer dans python 2.7 juste à cause d'une librairie (qui d'ailleurs est un peu floue, c'est pas du python à la base).

          De plus à ce que j'ai pu voir (faudra quand même vérifier), il existe tdl 1.1.6r84 qui permet de rendre libtcod plus proche de python et qui fonctionne sous python 3, https://pypi.python.org/pypi/tdl/1.1.6r84

          Et puis tu trouverais plus de ressource sur une librairie comme Pygame, qui elle fonctionne bien sous python 3, enfin à toi de voir mais je te propose ces choix au cas où tu ne savais pas.

          -
          Edité par Anonyme 7 août 2015 à 19:11:58

          • Partager sur Facebook
          • Partager sur Twitter
            7 août 2015 à 20:20:09


            Dan737 a écrit:

            Vu que tu es débutant, laisse-moi te féliciter sur la manière dont tu poses la question! Le code est dans les balises ad-hocs, et ton problème est expliqué clairement. Bravo!

            Merci ! Mais c'est normal quand même :lol: C'est logique d'être clair quand on veut être aidé :)

            En tout cas, je te remercie pour cette réponse claire et expansive !

            Alors d'une j'ai inséré python dans le "path" (car il m'a insulté) donc maintenant quand je fais "python annee_bissextile.py" dans la console, effectivement ça va me lancer le script, donc une victoire!

            Ensuite, pour l'encodage... ça marche pas très bien o_O Comme tu peux le voir ici :

            Pourtant j'ai activé chcp 1252 et j'ai évidemment changé entre-temps la ligne d'encodage :

            # -*- coding: utf-8 -*-
            
            import os
            
            annee = input("Saisissez une annꥠ: ") 
            annee = int(annee)
            
            if annee % 400 == 0 or (annee % 4 == 0 and annee % 100 !=0):
                print "L\'an", annee, "est bissextile"
            else:
                print "L\'an", annee, "n\'est pas bissextile"
                
            os.system ("pause")

            Et dans la foulée changé l'encodage de Notepad ++, le problème étant que si je sélectionne "Encodage" > "Encoder en UTF-8", ça me donne ça dans le code:

            Et cela se traduit par le même résultat dans la console qu'avant.  Peut-être y a t-il quelque chose que j'ai mal fait à ce niveau là ou un menu que j'ai manqué. La guerre de l'encodage est lancée !

            Aussi pourquoi me conseilles-tu de ne pas lancer mes scripts par un simple double-clic? C'est ce genre de choses parfois qui m'échappent :euh: Et il y en a énormément !

            -
            Edité par Kasaris 7 août 2015 à 20:29:38

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              7 août 2015 à 20:35:26

              Tu as mis le code chcp de latin-1 pas celui de utf-8 :p

              Relis le message de Dan737 tu as inversé.

              Latin-1 : Chcp 1252

              UTF-8 : Chcp 65001

              • Partager sur Facebook
              • Partager sur Twitter
                7 août 2015 à 20:41:25

                Malgré tout, je te conseille de suivre mon deuxième post. Tu ne touches pas à l'encodage de ta console. Contente-toi d'ajouter en haut de tes scripts from __future__ import unicode_literals et enregistre ton fichier en UTF-8.

                Si NotePad++ te donne de drôles de caractères, je te conseille de simplement les effacer et les remplacer par les caractères que tu veux utiliser.

                Pourquoi ne pas faire le double-clic sur le fichier directement? Car la fenêtre de la console va se fermer directement une fois le programme terminé. Et s'il y avait des messages d'erreurs, tu n'auras pas le temps de les voir.

                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  7 août 2015 à 20:44:50

                  Il fallait convertir en UTF-8, là tu as demandé à N++ de lire le fichier comme s'il était encodé en UTF-8 alors qu'il est encore encodé en cp-1252 (ou en ANSI ou en ISO-8859-1, ce sont tous les même, presque).

                  Aussi pourquoi me conseilles-tu de ne pas lancer mes scripts par un simple double-clic? C'est ce genre de choses parfois qui m'échappent :euh: Et il y en a énormément !

                  C'est un problème en faite très simple : un programme console est conçu pour fonctionner en console, il doit donc être exécuté depuis une console préalablement ouverte, et il est totalement inutile de le mettre en pause. Aussi en exécutant tes scripts console en double-cliquant sur ton fichier depuis l'explorateur ne te permettra pas de voir les éventuels messages d'erreurs que pourrait rencontrer l'interpréteur Python, même avec une pause. L'erreur aura lieu avant et mettra un terme au processus Python, et puisque la console aura été ouverte par Python elle se fermera avec lui.

                  -
                  Edité par Anonyme 7 août 2015 à 20:45:53

                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 août 2015 à 21:00:04

                    EDIT ; posté par erreur, désolé je vois pas comment supprimer un poste préalablement envoyé

                    -
                    Edité par Kasaris 7 août 2015 à 21:01:56

                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 août 2015 à 21:46:57

                      Alors basé sur vos conseils, j'ai fait "convertir en UTF-8" sur notepad++, sauvegardé, enlevé "import os" et "os.system "pause"" du code et rajouté from __future__ import unicode_literals :

                      # -*- coding: utf-8 -*-
                      
                      from __future__ import unicode_literals
                      
                      annee = input("Saisissez une année : ") 
                      annee = int(annee)
                      
                      if annee % 400 == 0 or (annee % 4 == 0 and annee % 100 !=0):
                          print "L\'an", annee, "est bissextile"
                      else:
                          print "L\'an", annee, "n\'est pas bissextile"

                      J'ai donc lancé la console (vraiment pratique le shift+ clic droit) et lancé :

                      :waw:

                      La déception est grande ahah.

                      "Sinon puisque tu débutes, je trouve ça dommage de se lancer dans python 2.7 juste à cause d'une librairie (qui d'ailleurs est un peu floue, c'est pas du python à la base)."

                      De plus à ce que j'ai pu voir (faudra quand même vérifier), il existe tdl 1.1.6r84 qui permet de rendre libtcod plus proche de python et qui fonctionne sous python 3"

                      EDIT : Mince, je sais pas comment faire des citations bien fichue >_<

                      Je comprends, mais c'est vrai que dès que j'aurai compris les bases de python, je voudrais suivre pas à pas ce guide :http://www.roguebasin.com/index.php?title=Complete_Roguelike_Tutorial,_using_python%2Blibtcod, et il est rédigé pour python 2.7 car ils expliquent qu'il peut exister des incompatibilités si cela est fait en python 3 :euh: Déjà que je vais galérer pour acquérir des bases de langage, si en plus la version que j'utilise est pas compatible avec ce que je veux faire pour le moment, ça sera difficile... Je veux vraiment le suivre pas à pas sans me soucier de détails de compatibilité, pour comprendre "comment on fait" dans un premier temps ! :D

                      -
                      Edité par Kasaris 7 août 2015 à 22:00:25

                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 août 2015 à 22:31:52

                        Rhaaaa ... C'est pour ça que Python 3 est vraiment mieux. :D

                        Bon ce qui se passe, c'est que print encode bien ta chaîne de caractère unicode en dans l'encodage de ta console sans que tu ne doives rien faire, mais c'est pas le cas de input ou raw_input. http://bugs.python.org/issue7768

                        Franchement, pour un débutant, c'est un gros morceau à avaler, tout ce qui est encodage, unicode, etc... Si tu étais anglophone, tu ne te poserais bien entendu pas la question, puisque tu te limiterais à des caractères ASCIIs. :)

                        Bon pour résoudre ton problème, voici ce que tu dois rajouter dans ton code:

                        -- coding: utf-8 --

                        from future import unicode_literals import sys

                        annee = raw_input("Saisissez une année : ".encode(sys.stdout.encoding)) annee = int(annee)

                        if annee % 400 == 0 or (annee % 4 == 0 and annee % 100 !=0):

                        print "L'an", annee, "est bissextile"
                        

                        else:

                        print "L'an", annee, "n'est pas bissextile"
                        
                        </pre> Note que tu ne dois pas échapper les ' dans une chaîne de caractère que tu as ouvert avec des "".

                        -
                        Edité par Dan737 7 août 2015 à 22:34:21

                        • Partager sur Facebook
                        • Partager sur Twitter
                          7 août 2015 à 23:09:32

                          Eerrrr... Ce code obscur :D

                          Ok, t'as peut-être raison, je devrais attendre avant de me préoccuper de ça. Déjà apprendre la base de la base, ça me semble bien, l'encodage on verra après... ça ne me dérange pas d'écrire en anglais de toute façon :) Merci pour toutes ces réponses en tout cas !

                          EDIT : Comme dirais l'autre: I'll be back.

                          -
                          Edité par Kasaris 7 août 2015 à 23:49:17

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Problème encodage python 2.7

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown