[python] pipが壊れた! 導入直後に嵌まりがちな ImportError の解決法

python のパッケージを管理する pip。

apt を使って導入した場合以下のように upgrade を推奨されることがあります。

指示されるがまま緑のコマンドを打つと悲劇が始まります。

アップグレード後、このように ImportError が発生し pip が使えなくなるのです。

この現象は Version10以下の pip をアップグレードした際に発生します。

環境が壊れるアップデートを勧めてくる見事な初見殺しです。

本記事ではこのような状況に陥ってしまった時の解決方法を書いていきます。

MEMO

筆者の環境

ubuntu 18.0.4

username: bulauza

解決方法

まずは ubuntu が参照している pip の場所を確かめます。whichコマンドを使用します。

次に出力されたパスにあるファイルを編集します。root権限が必要なのでsudoをつけ忘れないようにしましょう。エディタはご自由に。

9行目の from pip の後ろに ._internal を付け加えます。

以上です。もうpip が動くはずです。

動かなかった場合は書き換えた部分を元に戻しておきましょう。

解決までの試行錯誤

ここから先は何故上記の方法で解決するのか、またその方法をどうやって探っていったのかを書いています。

とりあえず pip が直ればOK!という人はここまでで大丈夫です。

なんなら筆者の備忘録です。

1. pip で実行されるプログラムを場所を把握

pip と打つとまず ubuntu がコマンドを認識してどこかにあるプログラムを実行します。

一番最初に使った which コマンドは、実行したプログラムがどこにあるのかを調べるものです。

今回の例でいうと ubuntu は pipというコマンドを受け付けて /usr/bin/pip を実行したということになります。

試しに元の状態に戻して $ python /usr/bin/pip と入力すると全く同じエラーが出てきます。

2. python の参照先を調査

実行されたプログラム、今回の python スクリプトでは pip が import されていました。

しかし、ここでmain属性が呼び出せないという ImportError が発生していました。

そこで python がどこを参照して pip を import しているのかを対話型コマンドラインで確認してみることにします。

画像では ipython を使用していますが普通のものでも問題ありません。

3. 原因の特定

参照しているコードが判明したので cat で中身を見てみましょう。

・・・なんということでしょう。まさかの1行です。匠もびっくり。

これではmain属性を呼び出せないのも納得です。

仕方がないので同じディレクトリにある __main__.py も確認してみます。

こちらはちゃんと中身があります。そして着目すべきは16行目です。

このコードではもう1階層深い _internal の中の main を参照していることに気が付きます。

というわけで潜ってみます。

4. 解決法を探る・・・

_internalの中にも__init__.py があるので中身を確認します。

中身もありますし、main属性も定義されていることが分かります。

というわけで

本来 python はこちらのファイルを参照すべきなのではという予測が立てられます。

5. 解決

というわけでステップ3で調べた python の参照先を書き換えて一件落着となります。

まとめ

pip を アップグレードした際に発生する ImportError の解決法をまとめました。

which で pip の場所を探し、そこに記載されている import 先を変更することで直ります。


スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。