Ipython: crash avec des fichiers python dans un encodage incorrect

Créé le 17 sept. 2016  ·  3Commentaires  ·  Source: ipython/ipython

%run ing un fichier python marqué avec # -*- coding: utf-8 -*- et enregistré dans un format non-utf8 peut planter ipython (retour au shell).
Pour obtenir le crash, le fichier doit :

  • contenir un caractère non ASCII
  • contenir une erreur (lorsqu'il est exécuté avec python3, une trace de pile est générée, mais pas de plantage)
  • être enregistré avec un mauvais encodage

Voici un petit script reproduisant cela, enregistré dans ISO-8859-15, avec la trace de la pile :
fichiers.zip

%run wrong_encoding.py
...
... <long trace>
...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 78: invalid continuation byte
 python3 -c "import IPython; print(IPython.sys_info())"
{'commit_hash': '5c9c918',
 'commit_source': 'installation',
 'default_encoding': 'UTF-8',
 'ipython_path': '/usr/lib/python3.4/site-packages/IPython',
 'ipython_version': '5.1.0',
 'os_name': 'posix',
 'platform': 'Linux-3.16.7-42-desktop-x86_64-with-SuSE-13.2-x86_64',
 'sys_executable': '/usr/bin/python3',
 'sys_platform': 'linux',
 'sys_version': '3.4.5 (default, Jul 03 2016, 13:55:08) [GCC]'}

Bien sûr, le fichier doit avoir été enregistré dans le bon format, en premier lieu.

Mais idéalement, la session ne serait pas perdue et un message plus informatif serait diffusé.

Commentaire le plus utile

Je compte treize retraçages enchaînés - je pense qu'en obtenir autant sans utiliser la récursivité devrait vous rapporter une sorte de prix. ;-)

Tous les 3 commentaires

Je compte treize retraçages enchaînés - je pense qu'en obtenir autant sans utiliser la récursivité devrait vous rapporter une sorte de prix. ;-)

9955 est une solution grossière pour cela; l'erreur n'est pas très informative, mais elle ne fait pas planter IPython.

Si le nom du fichier n'est pas facile à atteindre, voici la commande que j'ai utilisée pour retrouver le coupable :

find . -name "*.py" -exec file {} \; | grep -v ASCII | grep -v UTF-8 | grep -v empty

Cette page vous a été utile?
0 / 5 - 0 notes