pipのupgradeしたらpip installができなくなった件について
2か月も前の話なんだけど突然pipが使えなくなった。
ffmpegをインストールしようとpip install と打ち込んでみたところimportErrorがでた。
toor@toor-VirtualBox:~$ pip3 install ffmpeg-python Traceback (most recent call last): File "/usr/bin/pip3", line 9, in <module> from pip import main ImportError: cannot import name 'main'
むむ。
よくわからんがpip installできないときはだいたいupgradeで直る。
いざupgrade!
toor@toor-VirtualBox:~$ pip3 install --upgrade pip Traceback (most recent call last): File "/usr/bin/pip3", line 9, in <module> from pip import main ImportError: cannot import name 'main'
what the f〇ck?!
upgradeもできんと?
というか9行目のmainなんてもんはねぇってどういうこと。
じゃもう消すしかない。
toor@toor-VirtualBox:~$ sudo rm pip3 rm: 'pip3' を削除できません: そのようなファイルやディレクトリはありません
what?! pipがないだって?
toor@toor-VirtualBox:~$ pip3 -V Traceback (most recent call last): File "/usr/bin/pip3", line 9, in <module> from pip import main ImportError: cannot import name 'main'
じゃもうeasy install でpip3を上書きだ!
toor@toor-VirtualBox:~$ sudo easy_install pip3 Searching for pip3 Reading https://pypi.org/simple/pip3/ Couldn't find index page for 'pip3' (maybe misspelled?) Scanning index of all packages (this may take a while) Reading https://pypi.org/simple/ No local packages or working download links found for pip3 error: Could not find suitable distribution for Requirement.parse('pip3')
なんなんだこれは!!!!!
pip installできなくなったときの解決策
試すのは以下の2つ
一つ目はhashのリセットをする。
僕はこの方法でpipが復活した。
toor@toor-VirtualBox:~ $ hash -r
何しているのかはあとで話します。
もう一つの方法はpythonコマンドを使う方法。
toor@toor-VirtualBox:~$ python -m pip install 〇〇
pipが使えなくなった原因
結論からいうとpipのバージョンを9から10に上げたことでpipが使えなくなった。
なんでもver.9とver.10ではファイルの構成が異なっているようでver.9だとpip.mainというモジュールを動かすようだが、ver.10ではpip.mainが存在しないらしい。
それが原因で9行目のfrom pip import mainでimportErrorが出たのか。
詳しくはこちらのブログをご覧ください。
▼pip install --upgrade pip (10.0.0) 後の奇妙な挙動について - 雑記
そしてこれはバグというわけではなく仕様らしいので各自適応するしかないようだ。
ハッシュをリセットするとはどういうことか
1つ目の方法であるハッシュのリセット。
コマンドラインでコマンドを実行するさい環境変数pathから参照するが、頻繁に利用するコマンドはハッシュテーブルという場所に保存されているらしい。
▼【 hash 】コマンド――シェルが記憶しているコマンドのパスを確認する:Linux基本コマンドTips(96) - @IT
つまりpipがver.10になってもver.9のときのpip.mainを探しちゃう癖があるのでひっぱたいてリセットするわけだ。
そうすればpip.mainを参照することはなくなるのでver10でうまく動くようになる、ってことだろう。
いやわからんけどな。
python -m pipとはなにか
とりあえずpythonコマンドを使うことが少ないのでhelpを見てみる。
toor@toor-VirtualBox:~ $ python --help usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ... Options and arguments (and corresponding environment variables): ... -m mod : run library module as a script (terminates option list) ...
mオプションを見るとモジュールをスクリプトとして実行するとある。
つまりfrom pip import mainと書かれた行をスクリプトとして実行するってこと。
みんな、これどういう意味かわかる?
僕はまったくわからない。
ただこれでうまくいくことは確かだ。
まとめ
VirtualBoxでUbuntuを起動させてやってるときに起きたできごとで、Anacondaでは起きていない。
つまりAnaconda最強なのか。
ちなみに今現在のpipのバージョンは18、問題なく使えています。
そのほか参考にさせていただいた記事はこちらです。
▼pipコマンドが壊れた件
▼Ubuntu16.04 pip10 壊れる(ImportError: cannot import name main)
▼【 hash 】コマンド――シェルが記憶しているコマンドのパスを確認する:Linux基本コマンドTips(96) - @IT