Windows版 Python 2.7.6 で ez_setup.py が UnicodeDecodeErrorになる件

Windows で easy_install を入れたくってez_setup.py を実行するけれども、UnicodeDecodeError が発生してうまく行きません。おかしいな、前入れた時はそんなことなかったのに。

問題の例外は mimetypes.py で発生しています。

  • C:/Python27/lib/mimetypes.py
          ・
          ・
    def read_windows_registry(self, strict=True):
        """
        Load the MIME types database from Windows registry.

        If strict is true, information will be added to
        list of standard types, else to the list of non-standard
        types.
        """

        # Windows only
        if not _winreg:
            return

        def enum_types(mimedb):
            i = 0
            while True:
                try:
                    ctype = _winreg.EnumKey(mimedb, i)
                except EnvironmentError:
                    break
                try:
★                  ctype = ctype.encode(default_encoding) # omit in 3.x!
                except UnicodeEncodeError:
                    pass
                else:
                    yield ctype
                i += 1

        default_encoding = sys.getdefaultencoding()
        with _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, '') as hkcr:
            for subkeyname in enum_types(hkcr):
                try:
          ・
          ・

★で UnicodeDecodeErrorが発生。

どうやらレジストリの HKEY_CLASSES_ROOT の下のサブキーを舐める処理っぽい。なんかよくないキー名でもいるのかな?・・・と regedit で開いてみるも、キーが多すぎて探すのに挫折...orz

問題のコードをちょっと拝借して以下の様なスクリプトを走らせます

  • debug.py
import sys
import _winreg

default_encoding = sys.getdefaultencoding()

def enum_types(mimedb):
    i = 0
    while True:
        try:
            ctype = _winreg.EnumKey(mimedb, i)
        except EnvironmentError:
            break
        try:
            ctype = ctype.encode(default_encoding) # omit in 3.x!
        except UnicodeEncodeError:
            pass
        except UnicodeDecodeError:    # added!
            print ctype               # for Research Error Factor
        else:
            yield ctype
        i += 1

with _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, '') as hkcr:
    for subkeyname in enum_types(hkcr):
        pass

実行結果

C:\bin>python debug.py
ComicStudio Web投稿ファイル
ComicStudio コンビニ出力ファイル
ComicStudio トーンファイル
ComicStudio ページファイル
ComicStudio 作品ファイル

あー、、、、ComicStudio ですか...orz

どうしたもんかな、と思ったのですが、UnicodeEncodeError が発生したサブキーは 無造作に捨てているので UnicodeDecodeErrorの方もexcept して ポイ捨て するように修正して実行しました。

まぁうまく行ったのでよしとしますが、これはやっぱりバグなのかしらね。