僕の世界観を変えてみる

文系男子が趣味でプログラミングを勉強していくブログです。他にも日常で起きたどうでもいいことや愚痴を書いていきたいです。座右の銘は和を以て貴しとなすです。仲良くやろうよ。

pipのupgradeしたらpip installができなくなった件について

f:id:htmllifehack:20180818222853j:plain

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