176 votes

Changer l'encodage par défaut de Python ?

J'ai beaucoup de problèmes "impossible de coder" et "impossible de décoder" avec Python lorsque je lance mes applications depuis la console. Mais dans le Eclipse PyDev IDE, le codage des caractères par défaut est fixé à UTF-8 et je vais bien.

J'ai fait des recherches sur le réglage de l'encodage par défaut, et les gens disent que Python supprime le fichier sys.setdefaultencoding au démarrage, et nous ne pouvons pas l'utiliser.

Quelle est donc la meilleure solution ?

1 votes

Voir l'article de blog L'Illusoire setdefaultencoding .

3 votes

The best solution is to learn to use encode and decode correctly instead of using hacks. Cela était certainement possible avec python2 au prix de ne jamais oublier de le faire / d'utiliser systématiquement votre propre interface. D'après mon expérience, cela devient très problématique lorsque vous écrivez du code que vous voulez faire fonctionner à la fois avec python2 et python3.

175voto

EOL Points 24342

Voici une méthode plus simple (hack) qui vous rend la setdefaultencoding() qui a été supprimée de sys :

import sys
# sys.setdefaultencoding() does not exist, here!
reload(sys)  # Reload does the trick!
sys.setdefaultencoding('UTF8')

(Note pour Python 3.4+ : reload() est dans le importlib bibliothèque).

Ce n'est pas une chose sûre à faire Cependant, il s'agit manifestement d'un piratage, puisque sys.setdefaultencoding() est volontairement retiré de sys quand Python commence. Réactivation et modification de l'encodage par défaut peut casser un code qui repose sur le fait que l'ASCII est le code par défaut. (ce code peut être tiers, ce qui rendrait généralement sa correction impossible ou dangereuse).

10 votes

J'ai rétrogradé, car cette réponse n'aide pas à faire fonctionner des applications existantes (ce qui est une façon d'interpréter la question), elle est fausse lorsque vous écrivez/maintenez une application et dangereuse lorsque vous écrivez une bibliothèque. La bonne méthode consiste à définir LC_CTYPE (ou dans une application, vérifier s'il est bien défini et abandonner avec un message d'erreur significatif).

0 votes

@ibotty Je suis d'accord que cette réponse est un hack et qu'il est dangereux de l'utiliser. Elle répond cependant à la question ("Changer l'encodage par défaut de Python ?"). Avez-vous une référence sur l'effet de la variable d'environnement LC_CTYPE sur l'interpréteur Python ?

1 votes

En fait, il n'est pas mentionné qu'il s'agit d'un hack au départ. à part cela, les réponses dangereuses qui ne mentionnent pas qu'elles le sont, ne sont pas utiles.

94voto

iman Points 402

Si vous obtenez cette erreur lorsque vous essayez de pipe/rediriger la sortie de votre script

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)

Il suffit d'exporter PYTHONIOENCODING dans la console et ensuite d'exécuter votre code.

export PYTHONIOENCODING=utf8

3 votes

C'est la seule solution qui ait fait une différence pour moi. - Je suis sous Debian 7, avec des paramètres régionaux défectueux. Merci.

4 votes

Définir LC_CTYPE à quelque chose de sensé à la place. Cela rend tous les autres programmes heureux aussi.

6 votes

Un bogue plus important dans Python3 est, que PYTHONIOENCODING=utf8 n'est pas la valeur par défaut. Cela fait que les scripts se cassent juste parce que LC_ALL=C

53voto

lukmdo Points 3511

A) Pour contrôler sys.getdefaultencoding() sortie :

python -c 'import sys; print(sys.getdefaultencoding())'

ascii

Puis

echo "import sys; sys.setdefaultencoding('utf-16-be')" > sitecustomize.py

et

PYTHONPATH=".:$PYTHONPATH" python -c 'import sys; print(sys.getdefaultencoding())'

utf-16-be

Vous pourriez mettre votre sitecustomize.py plus haut dans votre PYTHONPATH .

Vous pouvez également essayer reload(sys).setdefaultencoding par @EOL

B) Pour contrôler stdin.encoding et stdout.encoding vous voulez régler PYTHONIOENCODING :

python -c 'import sys; print(sys.stdin.encoding, sys.stdout.encoding)'

ascii ascii

Puis

PYTHONIOENCODING="utf-16-be" python -c 'import sys; 
print(sys.stdin.encoding, sys.stdout.encoding)'

utf-16-be utf-16-be

Enfin : vous pouvez utiliser A) ou B) ou les deux !

0 votes

(python2 uniquement) séparé mais intéressant est l'extension de ce qui précède avec from __future__ import unicode_literals voir discussion

18voto

ChristopheD Points 38217

En commençant par PyDev 3.4.1, l'encodage par défaut n'est plus modifié. Voir ce billet pour les détails.

Pour les versions antérieures, une solution consiste à s'assurer que PyDev ne fonctionne pas avec UTF-8 comme encodage par défaut. Sous Eclipse, exécutez les paramètres de dialogue ("run configurations", si je me souviens bien) ; vous pouvez choisir l'encodage par défaut dans l'onglet commun. Changez-le en US-ASCII si vous voulez avoir ces erreurs 'tôt' (en d'autres termes : dans votre environnement PyDev). Voir aussi un article de blog original pour cette solution de contournement .

1 votes

Merci Chris. Surtout si l'on considère le commentaire de Mark T. ci-dessus, votre réponse me semble la plus appropriée. Et pour quelqu'un qui n'est pas principalement un utilisateur d'Eclipse/PyDev, je n'aurais jamais trouvé cela tout seul.

0 votes

J'aimerais changer cela globalement (plutôt qu'une fois par configuration d'exécution), mais je n'ai pas trouvé comment - j'ai posé une autre question : stackoverflow.com/questions/9394277/

13voto

kiril Points 111

En ce qui concerne python2 (et python2 uniquement), certaines des réponses précédentes reposent sur l'utilisation du hack suivant :

import sys
reload(sys)  # Reload is a hack
sys.setdefaultencoding('UTF8')

Il est déconseillé de l'utiliser (vérifier ce ou ce )

Dans mon cas, il y a un effet secondaire : j'utilise les carnets de notes d'Ipython, et une fois que j'exécute le code, la fonction "print" ne fonctionne plus. Je suppose qu'il y a une solution, mais je pense tout de même que l'utilisation du hack ne devrait pas être la bonne option.

Après avoir essayé de nombreuses options, celle qui a fonctionné pour moi est la suivante en utilisant le même code dans le sitecustomize.py où ce bout de code est censé se trouver. . Après avoir évalué ce module, la fonction setdefaultencoding est supprimée de sys.

La solution est donc d'ajouter au fichier /usr/lib/python2.7/sitecustomize.py le code :

import sys
sys.setdefaultencoding('UTF8')

Lorsque j'utilise virtualenvwrapper, le fichier que je modifie est le suivant ~/.virtualenvs/venv-name/lib/python2.7/sitecustomize.py .

Et quand j'utilise les carnets de notes python et conda, c'est ~/anaconda2/lib/python2.7/sitecustomize.py

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X