2010-02-14 16 views
13

Estoy ejecutando Python 2.6 con el último IPython en Windows XP SP3, y tengo dos preguntas. El primero de mis problemas es que, cuando estoy bajo IPython, no puedo ingresar cadenas Unicode directamente y, como resultado, no puedo abrir archivos con nombres que no sean latinos. Déjame demostrar. Bajo pitón de costumbre esto funciona:Problema extraño con la codificación de entrada en IPython

>>> sys.getdefaultencoding() 
'ascii' 
>>> sys.getfilesystemencoding() 
'mbcs' 
>>> fd = open(u'm:/Блокнот/home.tdl') 
>>> print u'm:/Блокнот/home.tdl' 
m:/Блокнот/home.tdl 
>>> 

Es cirílico allí, por cierto. Y bajo la IPython me sale:

In [49]: sys.getdefaultencoding() 
Out[49]: 'ascii' 

In [50]: sys.getfilesystemencoding() 
Out[50]: 'mbcs' 

In [52]: fd = open(u'm:/Блокнот/home.tdl') 
--------------------------------------------------------------------------- 
IOError         Traceback (most recent call last) 

C:\Documents and Settings\andrey\<ipython console> in <module>() 

IOError: [Errno 2] No such file or directory: u'm:/\x81\xab\xae\xaa\xad\xae\xe2/home.tdl' 

In [53]: print u'm:/Блокнот/home.tdl' 
-------------->print(u'm:/Блокнот/home.tdl') 
ERROR: An unexpected error occurred while tokenizing input 
The following traceback may be corrupted or invalid 
The error message is: ('EOF in multi-line statement', (15, 0)) 

--------------------------------------------------------------------------- 
UnicodeEncodeError      Traceback (most recent call last) 

C:\Documents and Settings\andrey\<ipython console> in <module>() 

C:\Program Files\Python26\lib\encodings\cp866.pyc in encode(self, input, errors) 
    10 
    11  def encode(self,input,errors='strict'): 
---> 12   return codecs.charmap_encode(input,errors,encoding_map) 
    13 
    14  def decode(self,input,errors='strict'): 

UnicodeEncodeError: 'charmap' codec can't encode characters in position 3-9: character maps to <und 

In [54]: 

El segundo problema es menos frustrante, pero aún así. Cuando intento abrir un archivo y especificar un argumento de nombre de archivo como cadena no unicode, no se abre. Tengo que fuerza cadena de decodificación de OEM juego de caracteres, antes de que pudiera abrir los archivos, lo que es bastante incómodo:

>>> fd2 = open('m:/Блокнот/home.tdl'.decode('cp866')) 
>>> 

lo mejor tiene algo que ver con mi configuración regional, no lo sé, porque puedo' t incluso cortar texto cirílico de la consola. He puesto "ruso" en todas partes en entornos regionales, pero parece que no funciona.

Respuesta

12

Sí. Escribir Unicode en la consola siempre es problemático y generalmente es mejor evitarlo, pero IPython is particularly broke. Convierte los caracteres que escribe en su consola como si estuvieran codificados en ISO-8859-1, independientemente de la codificación real que le proporcione.

Por ahora, tendrá que decir u'm:/\u0411\u043b\u043e\u043a\u043d\u043e\u0442/home.tdl'.

+0

Oh, de acuerdo. Eso es triste, sin embargo. Esperará la reparación. –

+3

Aquí está el parche para este problema https://bugs.launchpad.net/ipython/+bug/339642 Simplemente elimine la línea 'source = source.encode (self.stdin_encoding)' de iplib.py desde la distribución de IPython. Me funcionó en OS X. –

+0

@ t0ster: gracias por la sugerencia, funcionó para mí. Y pensar que he pasado varias horas buscando en Google pensando que esto es un problema de Matplotlib. – Halka

0

Tuve el mismo problema con la entrada griega, esta patch from launchpad también funciona para mí.

Gracias.

1

toda lógica que parezca, esto va a funcionar:

fd = open('m:/Блокнот/home.tdl') 

O:

fd = open('m:/Блокнот/home.tdl'.encode('utf-8')) 

Esto se pone alrededor de fallo de ipython mediante la introducción de la cadena como una codificación UTF-8 bytes cadena de texto. ipython no intenta ningún negocio divertido con él. Entonces puede codificarlo en una cadena Unicode si lo desea y continuar con su vida.

Cuestiones relacionadas