pip でのインストール時に UnicodeDecodeError が出た場合の解決方法

諸事情でブログの更新がご無沙汰でしたが、久しぶりに書いてみました。
今回は Python の pip が使えないトラブルがあったので、その解決方法の紹介です。

pip というのは Python のパッケージマネージャーです。 上記のリンク先のインストールと違い、Anaconda が必要だったので、そちらでインストールしてみました。
Anaconda というのは Python の数値計算系のライブラリーなどを一緒にまとめた Python 環境です。 実行環境は次のような感じです。
  • Windows 7
  • Anaconda 5.1 (Python 3.6)
  • pip 9.0.1
  • プロキシー環境
上手くいく環境もあるので、おそらくプロキシー環境というのが問題なんじゃないかと思います。
実際、pip を使うとどうなるかというと、エラーが発生して何もインストールできません。
$ pip install py2exe
Collecting py2exe
Exception:
Traceback (most recent call last):
  File "c:\programdata\anaconda3\lib\site-packages\pip\basecommand.py", line 215, in main
    status = self.run(options, args)
  File "c:\programdata\anaconda3\lib\site-packages\pip\commands\install.py", line 335, in run
    wb.build(autobuilding=True)
  File "c:\programdata\anaconda3\lib\site-packages\pip\wheel.py", line 749, in build
    self.requirement_set.prepare_files(self.finder)
  File "c:\programdata\anaconda3\lib\site-packages\pip\req\req_set.py", line 380, in prepare_files
    ignore_dependencies=self.ignore_dependencies))
  File "c:\programdata\anaconda3\lib\site-packages\pip\req\req_set.py", line 554, in _prepare_file
    require_hashes
   File "c:\programdata\anaconda3\lib\site-packages\pip\req\req_install.py", line 278, in populate_link
     self.link = finder.find_requirement(self, upgrade)
   File "c:\programdata\anaconda3\lib\site-packages\pip\index.py", line 465, in find_requirement
     all_candidates = self.find_all_candidates(req.name)
   File "c:\programdata\anaconda3\lib\site-packages\pip\index.py", line 423, in find_all_candidates
     for page in self._get_pages(url_locations, project_name):
   File "c:\programdata\anaconda3\lib\site-packages\pip\index.py", line 568, in _get_pages
     page = self._get_page(location)
   File "c:\programdata\anaconda3\lib\site-packages\pip\index.py", line 683, in _get_page
     return HTMLPage.get_page(link, session=self.session)
   File "c:\programdata\anaconda3\lib\site-packages\pip\index.py", line 792, in get_page
     "Cache-Control": "max-age=600",
   File "c:\programdata\anaconda3\lib\site-packages\pip\_vendor\requests\sessions.py", line 521, in get
     return self.request('GET', url, **kwargs)
   File "c:\programdata\anaconda3\lib\site-packages\pip\download.py", line 386, in request
     return super(PipSession, self).request(method, url, *args, **kwargs)
   File "c:\programdata\anaconda3\lib\site-packages\pip\_vendor\requests\sessions.py", line 494, in request
     prep = self.prepare_request(req)
   File "c:\programdata\anaconda3\lib\site-packages\pip\_vendor\requests\sessions.py", line 437, in prepare_request
     hooks=merge_hooks(request.hooks, self.hooks),
   File "c:\programdata\anaconda3\lib\site-packages\pip\_vendor\requests\models.py", line 309, in prepare
     self.prepare_auth(auth, url)
   File "c:\programdata\anaconda3\lib\site-packages\pip\_vendor\requests\models.py", line 540, in prepare_auth
     r = auth(self)
   File "c:\programdata\anaconda3\lib\site-packages\pip\download.py", line 153, in __call__
     netrc_auth = get_netrc_auth(req.url)
   File "c:\programdata\anaconda3\lib\site-packages\pip\_vendor\requests\utils.py", line 195, in get_netrc_auth
     _netrc = netrc(netrc_path).authenticators(host)
   File "c:\programdata\anaconda3\lib\netrc.py", line 34, in __init__
     self._parse(file, fp, default_netrc)
   File "c:\programdata\anaconda3\lib\netrc.py", line 43, in _parse
     toplevel = tt = lexer.get_token()
   File "c:\programdata\anaconda3\lib\shlex.py", line 106, in get_token
     raw = self.read_token()
   File "c:\programdata\anaconda3\lib\shlex.py", line 137, in read_token
     nextchar = self.instream.read(1)
UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 0: illegal multibyte sequence
出ました UnicodeDecodeError。 Python と言えば UnicodeDecodeError ですね。

pip が使えないので、何かのライブラリーをアップグレードするという対処もできません。
ググってみると sys.setdefaultencoding('utf-8') をするといいという情報が見つかったのでやってみましたが、 今度は sys に setdefaultencoding のメソッドはないとエラーになります。 さらに調べて reload するというのがあったのですが、それでもダメ。コマンドプロンプト環境を UTF-8 にしてみても同じくダメでした。

しょうがないので、エラーみながら試行錯誤したところ、 どうやら認証処理のあたりで、cp932(Shift-JIS みたいなの)の文字コード設定になっているのが原因らしいということがわかりました。

で、解決方法ですが、netrc.py の 32 行目あたりのコードを修正します。netrc.py のファイルの場所はインストール先の設定などによって変わると思います。

{Anaconda インストールフォルダー}/Lib/netrc.py:
         with open(file) as fp:
             self._parse(file, fp, default_netrc)
ここでファイルを開くときに utf-8 の指定をするような引数を追加します。
         with open(file, encoding='utf-8') as fp:
              self._parse(file, fp, default_netrc)
これが適切な修正かどうかはわかりませんが、無事 pip が動くようになりました。
今回はなんとか自力で解決できましたが、日本人が Python を使うなら今後とも UnicodeDecodeError との戦いは続きそうです。



スポンサーサイト



 
このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
26位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
8位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

05月 | 2023年06月 | 07月
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。