Python 3 Surrogate Handling¶
Click en Python 3 fait toute la gestion Unicode dans la bibliothèque standardet est soumis à son comportement. Dans Python 2, click fait toute la gestion de l’Unicode lui-même, ce qui signifie qu’il y a des différences dans le comportement des erreurs.
La différence la plus flagrante est que dans Python 2, l’Unicode va « juste fonctionner »,alors que dans Python 3, il nécessite une attention supplémentaire. La raison en est que surPython 3, la détection de l’encodage se fait dans l’interpréteur et que sur Linuxet certains autres systèmes d’exploitation, sa gestion de l’encodage est problématique.
La plus grande source de frustration est que les scripts de clics invoqués par les systèmesinit (sysvinit, upstart, systemd, etc.), des outils de déploiement (salt,puppet), ou des tâches cron (cron) refusent de fonctionner à moins qu’une locale Unicode ne soit exportée.
Si click rencontre un tel environnement, il empêchera la poursuite de l’exécution pour vous forcer à définir une locale. Ceci est fait parce que click ne peut pas connaître l’état du système une fois qu’il est invoqué et restaurer les valeursavant que la gestion Unicode de Python ne se mette en marche.
Si vous voyez quelque chose comme cette erreur dans Python 3:
Traceback (most recent call last): ...RuntimeError: Click will abort further execution because Python 3 was configured to use ASCII as encoding for the environment. Either switch to Python 2 or consult for http://click.pocoo.org/python3/ mitigation steps.
Vous avez affaire à un environnement où Python 3 pense que vous êtes restreint aux données ASCII. La solution à ces problèmes est différente selon la locale dans laquelle votre ordinateur fonctionne.
Par exemple, si vous avez une machine Linux allemande, vous pouvez résoudre le problèmeen exportant la locale vers de_DE.utf-8
:
export LC_ALL=de_DE.utf-8export LANG=de_DE.utf-8
Si vous êtes sur une machine américaine, en_EN.utf-8
est l’encodage de choix. Sur certains systèmes Linux plus récents, vous pourriez également essayer C.UTF-8
comme locale:
export LC_ALL=C.UTF-8export LANG=C.UTF-8
Vous devez faire cela avant d’invoquer votre script Python. Si vous êtescurieux sur les raisons de cela, vous pouvez rejoindre les discussions dans le bug tracker de Python 3 :
-
ASCII est un mauvais encodage par défaut du système de fichiers
-
Utiliser surrogateescape comme gestionnaire d’erreur par défaut
-
Python 3 soulève des erreurs Unicode dans la locale C
-
LC_CTYPE=C : pydoc laisse le terminal dans un état inutilisable (ceci est pertinent pour clickbec parce que le support du pager est fourni par le module stdlib pydoc)
.