2014年3月18日火曜日

[python]pip 1.5.4にアップデートしたらutf-8エラーが出た。 for windows

バグFixついでにpipを1.0.1から1.5.4へアップデートしたら無慈悲なエラーが吐き出された。
しかも赤い文字でエラーまで出る始末。。


 Traceback (most recent call last):
  File "C:\traclight\python\Scripts\pip-script.py", line 8, in
    load_entry_point('pip==1.5.4', 'console_scripts', 'pip')()
  File "C:\TracLight\python\lib\site-packages\pip-1.5.4-py2.6.egg\pip\__init__.p
y", line 185, in main
    return command.main(cmd_args)
  File "C:\TracLight\python\lib\site-packages\pip-1.5.4-py2.6.egg\pip\basecomman
d.py", line 161, in main
    text = '\n'.join(complete_log)
  File "C:\TracLight\python\Lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x82 in position 34: invalid
start byte



pythonを扱う上では文字コードは毎回の事エラーが出るし、そこまで驚かないけど、
英語圏の人は文字コード関係なしなんだろうなーと思ってしまう。


治す取っ掛かりは、エラーの出た個所を追っていくと文字データに2バイト文字が含まっている変数が見つかるので、 Windows環境であればCP932でdecodeしてあげれば良い。

そんなわけで探していくと、

download.py 472行目付近
temp_dirにアカウント名(2バイト文字)が入っていたので、さっそくdecodeデコード。


def unpack_http_url(link, location, download_cache, download_dir=None,
                    session=None):
    if session is None:
        session = PipSession()

    temp_dir = tempfile.mkdtemp('-unpack', 'pip-')
    try:
        temp_dir = temp_dir.decode('cp932')
    except:
        pass


asciiやutf-8はそのままでいいし、eucは使わないし、
そんなやっつけ仕事で動く程度の修正して解決。
コメントを投稿

Androider