Sur l'une de mes machines, j'ai l'erreur lorsque je travaille avec le moteur d'applications Google ou Django.
Par exemple:
app.yaml
application: demas1252c
version: 1
runtime: python
api_version: 1
handlers:
- url: /images
static_dir: images
- url: /css
static_dir: css
- url: /js
static_dir: js
- url: /.*
script: demas1252c.py
demas1252c.py
import cgi
import wsgiref.handlers
from google.appengine.ext.webapp import template
from google.appengine.ext import webapp
class MainPage(webapp.RequestHandler):
def get(self):
values = {'id' : 10}
self.response.out.write(template.render('foto.html', values))
application = webapp.WSGIApplication([('/', MainPage)], debug = True)
wsgiref.handlers.CGIHandler().run(application)
foto.html
<!DOCTYPE html>
<html lang="en">
<head></head>
<body>some</body>
</html>
message d'erreur:
C:\artefacts\dev\project>"c:\Program Files\Google\google_appengine\dev_appserver.py" foto-hosting
Traceback (most recent call last):
File "c:\Program Files\Google\google_appengine\dev_appserver.py", line 69, in <module>
run_file(__file__, globals())
File "c:\Program Files\Google\google_appengine\dev_appserver.py", line 65, in run_file
execfile(script_path, globals_)
File "c:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver_main.py", line 92, in <module>
from google.appengine.tools import dev_appserver
File "c:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 140, in <module>
mimetypes.add_type(mime_type, '.' + ext)
File "C:\Python27\lib\mimetypes.py", line 344, in add_type
init()
File "C:\Python27\lib\mimetypes.py", line 355, in init
db.read_windows_registry()
File "C:\Python27\lib\mimetypes.py", line 260, in read_windows_registry
for ctype in enum_types(mimedb):
File "C:\Python27\lib\mimetypes.py", line 250, in enum_types
ctype = ctype.encode(default_encoding) # omit in 3.x!
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128)
Lorsque je travaille avec des fichiers statiques dans Django (sans gae), j'ai une erreur très similaire (avec une pile différente).
J'ai essayé de trouver la raison de l'erreur et j'ai ajouté du code à mimetypes.py:
print '====='
print ctype
ctype = ctype.encode(default_encoding) # omit in 3.x!
Ensuite, je reçois les prochains messages dans ma console:
=====
video/x-ms-wvx
=====
video/x-msvideo
=====
рєфшю/AMR
Traceback (most recent call last):
Dans le registre HKCR/Mime/Database/ContentType/j'ai cinq clés avec des lettres russes (cyriliques). Mais comment puis-je corriger cette erreur?
Il s'agit d'un bogue dans mimetypes
, déclenché par de mauvaises données dans le registre. (рєфшю/AMR
n'est pas du tout un type de média MIME valide.)
ctype
est un nom de clé de registre renvoyé par _winreg.EnumKey
, qui mimetypes
s'attend à être une chaîne Unicode, mais ce n'est pas le cas. Contrairement à _winreg.QueryValueEx
, EnumKey
renvoie une chaîne d'octets (directement à partir de la version ANSI de l'API Windows; _winreg
in Python 2 n'utilise pas les interfaces Unicode même s'il renvoie des chaînes Unicode, donc il ne lira jamais correctement les caractères non ANSI).
Donc, la tentative de .encode
il échoue avec un décodage Unicode Erreur lors de la tentative d'obtention d'une chaîne Unicode avant de la recoder en ASCII!
try:
ctype = ctype.encode(default_encoding) # omit in 3.x!
except UnicodeEncodeError:
pass
Ces lignes dans mimetypes
doivent simplement être supprimées.
ETA: ajouté au bug tracker .
Soit dit en passant, le principal responsable du problème est QuickTime qui ajoute des types de mime non ascii au registre Windows. Le moyen le plus simple de le corriger est de rechercher et de supprimer manuellement du registre les sous-sections du HKCR/Mime/Database/ContentType/
commençant par аудио/
et видео/
.
Il y a un patch:
http://bugs.python.org/file18143/9291.patch
Fonctionne très bien pour moi.
Il suffit de remplacer UnicodeEncodeError pour être UnicodeError
Une solution alternative de python issue9291 par Alexandr Zarubkin (me21) :
ajoutez un fichier nommé sitecustomize.py dans le dossier Lib\site-packages.
import sys
sys.setdefaultencoding("cp1251")
son bogue python avec des pointes MIME latines dans le registre démarre regedit et inspecte "HKEY_CLASSES_ROOT\MIME\Database\Content Type" pour les noms non latins.