pip
でインストールしたコマンドなど、Pythonで書かれたコードで起こる問題。どうやらURLをパースするのに失敗しているらしい。
どうにも局所的でかつユーザ側の環境による問題なのだが、それ故か対処法がまとまっていなかったのでメモしておく。
経緯
atcoder-tools(競プロ用のツール)を使っていたところ、11月のはじめあたりに突然正しく動作しなくなった。ツールにアプデがあったわけでは無い、というかそもそも自分ではupdateを挟んでいないのでupdateで動作しなくなったというわけではなさそう。本当に心当たりがないのでよくわからない。
エラーを見ると
File "/usr/lib/python3/dist-packages/requests/models.py", line 380, in prepare_url
scheme, auth, host, port, path, query, fragment = parse_url(url)
File "/usr/lib/python3/dist-packages/urllib3/util/url.py", line 392, in parse_url
return six.raise_from(LocationParseError(source_url), None)
File "<string>", line 2, in raise_from
urllib3.exceptions.LocationParseError
という感じのログがある。問題があるのはsix
あるいはurllib3
モジュールだろうと見当をつけて調べてみる。
対処法1
$ pip3 install six==1.15.0
six
モジュールのバージョンが古く、不具合を起こしている可能性がある。
module 'six' has no attribute 'ensure_str'
みたいな感じのログが出てる人はまあこれだろう。six
にensure_str
が追加されるのは1.15.0
以降なので以上のコマンドとなる。
実際これで改善された人もいるらしい。ただ、自分はこれでは直らなかった。これをしても変わらんよって人は以下の対処法2を試してみるといいかもしれない。
対処法2
$ pip3 insatll --upgrade urllib3
これまたurllib3
のバージョンを最新に引き上げている。
自分はこれで正常に動作するようになったが、これをすれば直るとも言い切れない。
まとめ
かなりくだらない理由だったので悲しくなった。途中まで通常に動作していたのに、どこかのタイミングでバージョンダウングレードが挟まってしまったということだろうか。途中でコマンドの install,uninstall などを行ったが、そのせいかも?わからん