環境
- pip 18.0
- Python 3.6.6
- Anaconda 3.5.2
- Windows10
問題
pip install
を実行したら、「UnicodeDecodeError: 'cp932' codec can't decode byte 0x82 in position 56: illegal multibyte sequence」というエラーが発生しました。
>pip install pandas --upgrade
Exception:
Traceback (most recent call last):
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_internal\basecommand.py", line 141, in main
status = self.run(options, args)
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_internal\commands\install.py", line 299, in run
resolver.resolve(requirement_set)
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_internal\resolve.py", line 102, in resolve
self._resolve_one(requirement_set, req)
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_internal\resolve.py", line 256, in _resolve_one
abstract_dist = self._get_abstract_dist_for(req_to_install)
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_internal\resolve.py", line 199, in _get_abstract_dist_for
skip_reason = self._check_skip_installed(req)
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_internal\resolve.py", line 170, in _check_skip_installed
self.finder.find_requirement(req_to_install, upgrade=True)
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_internal\index.py", line 494, in find_requirement
all_candidates = self.find_all_candidates(req.name)
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_internal\index.py", line 452, in find_all_candidates
for page in self._get_pages(url_locations, project_name):
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_internal\index.py", line 597, in _get_pages
page = self._get_page(location)
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_internal\index.py", line 715, in _get_page
return HTMLPage.get_page(link, session=self.session)
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_internal\index.py", line 824, in get_page
"Cache-Control": "max-age=600",
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_vendor\requests\sessions.py", line 525, in get
return self.request('GET', url, **kwargs)
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_internal\download.py", line 396, in request
return super(PipSession, self).request(method, url, *args, **kwargs)
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_vendor\requests\sessions.py", line 498, in request
prep = self.prepare_request(req)
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_vendor\requests\sessions.py", line 441, in prepare_request
hooks=merge_hooks(request.hooks, self.hooks),
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_vendor\requests\models.py", line 313, in prepare
self.prepare_auth(auth, url)
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_vendor\requests\models.py", line 544, in prepare_auth
r = auth(self)
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_internal\download.py", line 160, in __call__
netrc_auth = get_netrc_auth(req.url)
File "c:\users\yuji3\anaconda3_5.2.0\lib\site-packages\pip\_vendor\requests\utils.py", line 201, in get_netrc_auth
_netrc = netrc(netrc_path).authenticators(host)
File "c:\users\yuji3\anaconda3_5.2.0\lib\netrc.py", line 33, in __init__
self._parse(file, fp, default_netrc)
File "c:\users\yuji3\anaconda3_5.2.0\lib\netrc.py", line 42, in _parse
toplevel = tt = lexer.get_token()
File "c:\users\yuji3\anaconda3_5.2.0\lib\shlex.py", line 105, in get_token
raw = self.read_token()
File "c:\users\yuji3\anaconda3_5.2.0\lib\shlex.py", line 136, in read_token
nextchar = self.instream.read(1)
UnicodeDecodeError: 'cp932' codec can't decode byte 0x82 in position 56: illegal multibyte sequence
原因
.netrc
ファイルに、以下のように日本が記載されていたためです。
日本語を取り除いたら、pip install
は成功しました。
machine example.com
login xxxxxx
password yyyyyy
あ
ハマった理由
原因はしょうもないことでした。これに30分ぐらいハマっていました。
しかし、なぜ私はハマったのでしょうか?
1つ目は、pip install
で.netrc
を読み込むことを知らなかったからだと思います。pip install
のドキュメントにも.netrc
を読み込むとは書いていませんでした。
2つ目は、スタックトレースの最後がnetrcでなかったからだと思います。スタックトレースの最後はshlex.pyなので、最初はshlex.pyを調査していました。原因が分からないなと悩んでいたときに、スタックトレース全体を見たみたら"netrc"という文字列を見つけ、".netrc"を疑うことができました。
疑問
pip install
はなぜ".netrc"を読み込むのでしょうか?netrcは古い機能(もともとFTPコマンド用)だと思うのですが、どこかで使っているのでしょうか?そしてpipip install
のドキュメントにnetrcについて記載されていないのはなぜなんでしょうか?
なぞは深まるばかりです。