пятница, 28 марта 2014 г.

setuptools на python 2.7 (Windows) и ошибка UnicodeDecodeError: 'ascii' codec can't decode byte 0xae in position 11

Недавно пытался установить модуль setuptools для Python 2.7 под Windows XP.
По документации установка проходит буквально в два клика: запускаем
python ez_install.py 
ждем, пока скачается и установится модуль, наслаждаемся жизнью.
В моем случае на этапе установки вылезла ошибка:

Installing Setuptools
Traceback (most recent call last):
  File "setup.py", line 17, in 
    exec(init_file.read(), command_ns)
  File "", line 8, in 
  File "c:\users\namar\appdata\local\temp\tmp1tanvy\setuptools-2.1\setuptools\__
init__.py", line 11, in 
    from setuptools.extension import Extension
  File "c:\users\namar\appdata\local\temp\tmp1tanvy\setuptools-2.1\setuptools\ex
tension.py", line 5, in 
    from setuptools.dist import _get_unpatched
  File "c:\users\namar\appdata\local\temp\tmp1tanvy\setuptools-2.1\setuptools\di
st.py", line 15, in 
    from setuptools.compat import numeric_types, basestring
  File "c:\users\namar\appdata\local\temp\tmp1tanvy\setuptools-2.1\setuptools\co
mpat.py", line 19, in 
    from SimpleHTTPServer import SimpleHTTPRequestHandler
  File "c:\python27\lib\SimpleHTTPServer.py", line 27, in 
    class SimpleHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  File "c:\python27\lib\SimpleHTTPServer.py", line 208, in SimpleHTTPRequestHand
ler
    mimetypes.init() # try to read system mime.types
  File "c:\python27\lib\mimetypes.py", line 358, in init
    db.read_windows_registry()
  File "c:\python27\lib\mimetypes.py", line 258, in read_windows_registry
    for subkeyname in enum_types(hkcr):
  File "c:\python27\lib\mimetypes.py", line 249, in enum_types
    ctype = ctype.encode(default_encoding) # omit in 3.x!
UnicodeDecodeError: 'ascii' codec can't decode byte 0xae in position 11: ordinal
 not in range(128)
Something went wrong during the installation.
See the error message above.

Полез в гугл. Основное предлагаемое решение - удалить  в разделе "HKEY_CLASSES_ROOT\MIME\Database\Content Type" все подразделы, в названии которых есть русские символы (точнее, символы не из кодировки ascii). Например, см. здесьздесь или здесь.
Полез по указанному пути. Проверил на несколько раз. Разделов с запретными названиями не было!
Дальнейшее гугление ни к чему не привело.
Собственно, вот к какому решению я пришел после некоторых исследований:

  • Открываем c:\python27\lib\mimetypes.py
  • Переходим на строку 249
 ctype = ctype.encode(default_encoding)
  • Перед этой строкой вставляем 
print ctype
  • Сохраняем
  • Запускаем 
python ez_install.py
еще раз.
  • Видим, как на консоль выводятся некие строки - это названия разделов реестра, которые сейчас просматривает установщик. 
  • В определенный момент вывод строк остановится, и последней из этих строк будет строка с "кракозябрами" (ну или с русскими символами - зависит от того, как настроена консоль).
  • Далее всё просто - если в строке "кракозябры", то с помощью любимого текстового редактора переводим символы в нужную кодировку,  и делаем поиск в реестре по этим символам.
В моем случае разделом, на котором установщик споткнулся, был раздел "BDATool.компоненты".
  • Далее удаляем или переименовываем этот раздел и запускаем установщик заново.