2010-02-14 8 views
13

Je cours python 2.6 avec le dernier IPython sur Windows XP SP3, et j'ai deux questions. Le premier de mes problèmes est, quand sous IPython, je ne peux pas entrer des chaînes Unicode directement, et, par conséquent, ne peux pas ouvrir des fichiers avec des noms non-latin. Laissez-moi démontrer. Sous python habituel cela fonctionne:Problème étrange avec l'encodage d'entrée dans IPython

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

Il est cyrillique là-dedans, soit dit en passant. Et sous le IPython je reçois:

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]: 

Le deuxième problème est moins frustrant, mais quand même. Lorsque j'essaie d'ouvrir un fichier et de spécifier un argument de nom de fichier comme chaîne non-unicode, il ne s'ouvre pas. Je dois force chaîne de décodage de charset OEM, avant que je puisse ouvrir des fichiers, ce qui est assez pratique:

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

Peut-être qu'il a quelque chose à mes paramètres régionaux, je ne sais pas, parce que je peux » t même couper et coller le texte cyrillique de la console. J'ai mis "russe" partout dans les paramètres régionaux, mais cela ne semble pas fonctionner.

Répondre

12

Oui. Taper Unicode sur la console est toujours problématique et généralement mieux évité, mais IPython is particularly broke. Il convertit les caractères que vous tapez sur sa console comme s'ils étaient codés en ISO-8859-1, quel que soit le codage que vous lui fournissez. Pour l'instant, vous devrez indiquer u'm:/\u0411\u043b\u043e\u043a\u043d\u043e\u0442/home.tdl'.

+0

Oh, d'accord. C'est triste, cependant. Attendront la correction. –

+3

Voici un correctif pour ce problème https://bugs.launchpad.net/ipython/+bug/339642 Supprimez simplement la ligne 'source = source.encode (self.stdin_encoding)' de iplib.py de la distribution IPython. Cela a fonctionné pour moi sous OS X. –

+0

@ t0ster: merci pour le pourboire, travaillé pour moi. Et de penser que j'ai passé plusieurs heures à googler en pensant que c'est un problème de Matplotlib. – Halka

0

J'ai eu le même problème avec l'entrée grecque, cette patch from launchpad fonctionne pour moi aussi.

Merci.

1

assez Perversement, cela fonctionnera:

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

Ou:

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

Cela contourne le bogue de ipython en entrant la chaîne en UTF-8 octets chaîne encodée brut. ipython n'essaie pas de business marrant avec ça. Vous êtes alors libre de l'encoder en une chaîne unicode si vous le souhaitez, et continuez votre vie.