¿Cambiar la codificación predeterminada de Python?
Tengo muchos problemas de "no puedo codificar" y "no puedo decodificar" con Python cuando ejecuto mis aplicaciones desde la consola. Pero en Eclipse PyDev IDE, la codificación de caracteres predeterminada está configurada en UTF-8 , y estoy bien.
Busqué para configurar la codificación predeterminada y la gente dice que Python elimina la sys.setdefaultencoding
función al iniciar y que no podemos usarla.
Entonces, ¿cuál es la mejor solución para ello?
Aquí hay un método más simple (truco) que le devuelve la setdefaultencoding()
función que se eliminó sys
:
import sys
# sys.setdefaultencoding() does not exist, here!
reload(sys) # Reload does the trick!
sys.setdefaultencoding('UTF8')
(Nota para Python 3.4+: reload()
está en la importlib
biblioteca).
Sin embargo, esto no es algo seguro : obviamente es un truco, ya que sys.setdefaultencoding()
se elimina intencionalmente sys
cuando se inicia Python. Volver a habilitarlo y cambiar la codificación predeterminada puede romper el código que depende de que ASCII sea el predeterminado (este código puede ser de terceros, lo que generalmente haría imposible o peligroso arreglarlo).
PD: este truco ya no parece funcionar con Python 3.9.
Si recibe este error cuando intenta canalizar/redireccionar la salida de su script
UnicodeEncodeError: el códec 'ascii' no puede codificar caracteres en la posición 0-5: el ordinal no está en el rango (128)
Simplemente exporte PYTHONIOENCODING
en la consola y luego ejecute su código.
export PYTHONIOENCODING=utf8
A) Para controlar sys.getdefaultencoding()
la salida:
python -c 'import sys; print(sys.getdefaultencoding())'
ascii
Entonces
echo "import sys; sys.setdefaultencoding('utf-16-be')" > sitecustomize.py
y
PYTHONPATH=".:$PYTHONPATH" python -c 'import sys; print(sys.getdefaultencoding())'
utf-16-be
Podrías poner tu sitecustomize.py más arriba en tu PYTHONPATH
.
También te puede interesar probar reload(sys).setdefaultencoding
por @EOL
B) Para controlar stdin.encoding
y stdout.encoding
desea configurar PYTHONIOENCODING
:
python -c 'import sys; print(sys.stdin.encoding, sys.stdout.encoding)'
ascii ascii
Entonces
PYTHONIOENCODING="utf-16-be" python -c 'import sys;
print(sys.stdin.encoding, sys.stdout.encoding)'
utf-16-be utf-16-be
Finalmente: ¡ puedes usar A) o B) o ambos!
A partir de PyDev 3.4.1, la codificación predeterminada ya no se cambia. Vea este boleto para más detalles.
Para versiones anteriores, una solución es asegurarse de que PyDev no se ejecute con UTF-8 como codificación predeterminada. En Eclipse, ejecute la configuración del cuadro de diálogo ("ejecutar configuraciones", si no recuerdo mal); puede elegir la codificación predeterminada en la pestaña común. Cámbielo a US-ASCII si desea tener estos errores "temprano" (en otras palabras: en su entorno PyDev). Consulte también una publicación de blog original sobre esta solución .
Con respecto a python2 (y solo a python2), algunas de las respuestas anteriores se basan en el siguiente truco:
import sys
reload(sys) # Reload is a hack
sys.setdefaultencoding('UTF8')
Se desaconseja su uso (marque esto o esto )
En mi caso, tiene un efecto secundario: estoy usando cuadernos ipython y una vez que ejecuto el código, la función "imprimir" ya no funciona. Supongo que habría una solución, pero aún así creo que usar el truco no debería ser la opción correcta.
Después de probar muchas opciones, la que funcionó para mí fue usar el mismo código en el archivo sitecustomize.py
donde debe estar ese fragmento de código . Después de evaluar ese módulo, la función setdefaultencoding se elimina de sys.
Entonces la solución es agregar al archivo /usr/lib/python2.7/sitecustomize.py
el código:
import sys
sys.setdefaultencoding('UTF8')
Cuando uso virtualenvwrapper el archivo que edito es ~/.virtualenvs/venv-name/lib/python2.7/sitecustomize.py
.
Y cuando lo uso con cuadernos de Python y Conda, es~/anaconda2/lib/python2.7/sitecustomize.py