好奇心の横断歩道を創る!

自分の思考をラバーダック・デバッグするためのブログ

pip でパッケージをアップデートしようとしたのだけど、トラブルが発生したので、とりあえず記録しておく。

※専門家ではありません。難民です。ここに書いてあることをまねした結果何か不具合が起こったとしても、一切責任を負えません。 ・・・宣言したからな!

 

Pythonに初めて触れてから約2年たつ。まあいろいろあって生まれて初めてpipでパッケージをアップデートした。何から何まで初めて尽くし。右も左もわからないので、とりあえず下の記事をお供にアップデートを試みた。

qiita.com

> pip install -U パッケージ

とすればパッケージがアップデートできるらしい。実際やってみたところ、多くのパッケージは問題なくアップデートに成功。しかし、時々、赤字でこんなエラーが出てアップデートに失敗する。

spyder 3.3.4 has requirement spyder-kernels<1.0,>=0.4.3, but you'll have spyder-kernels 1.3.3 which is incompatible.

spyder-kernels 1.3.3”というパッケージはインストールしている。TOEIC400点の残念な脳みそで考えるに、これはつまり、「spyder 3.3.4 spyder-kernels 0.4.3 を使うのに、spyder-kernels 1.3.3 じゃあバージョンが違っとるじゃろうが!」と怒られたということのような気がする。そこで、わざわざ spyder-kernels 1.3.3 をアンインストールして、spyder-kernels 0.4.3 を入れ直し、もう一度

> pip install -U パッケージ名

をしてみた。すると、上のエラーは消えた。一歩前進。ところが、今度はこんなエラーが出てきた。(本当は上のエラーの時も出てたんだけど、エラーの先頭じゃなかったから、無視してた。)

Cannot uninstall 'qtconsole'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

もう一度残念な脳みそで考えた。このエラーが意味するのは、「なにかとダブってインストールしてしまっているので、どれをアンインストールしていいかが特定できません。したがって'qtconsole' (←パッケージ名) がアンインストールできません。」ということのような気がする。どうしたものか。全く心当たりがない。今日はもう時間がないので、必要に迫られた時にもう一度トライすることにした。そもそもエラーの解釈を間違っているのかもしれないし。

 

最後に、ほんの少しだけ役立つことを書いておくことにする。

 

> pip check

とすると、モジュール間の依存関係に問題がないかをチェックできるというものらしい。公式ドキュメントらしきものをリンクする。

pip.pypa.io

これにも書いてある通り、何も問題がなければ、

> pip check

と入力すると

No broken requirements found. 

と返される。しかし自分の場合、

> pip check

に対して、

spyder 3.3.4 has requirement spyder-kernels<1.0,>=0.4.3, but you have spyder-kernels 1.3.3.
jupyterlab 0.35.4 has requirement jupyterlab_server<0.3.0,>=0.2.0, but you have jupyterlab-server 0.3.0.

と返された。公式ドキュメントらしきものにこのような判例はない。そこで、考えた。

まず、一つ目のエラー。「spyder 3.3.4 は spyder-kernels0.4.3 が必要なのに、 spyder-kernels 1.3.3. を使ってますよ。バージョンが違いますよ」ということだと解釈した。spyder-kernels3.3.4をアンインストールし、代わりに spyder-kernels0.4.3をインストールした。

二つ目のエラーも同様。jupyterlab-server 0.3.0 をアンインストールし、代わりに jupyterlab_server0.2.0 をインストールした。

そしてもう一度

> pip check

したところ、今度は

No broken requirements found. 

が返された。モジュールの依存関係の問題が解決されたらしい。「そもそも異なるモジュールでお互いに関係を持ってるって非合理的なんじゃないの?」とかって文句を言いたくなるのは、たぶん自分が何も知らないからだろう。無知な大衆はいつだって無責任だ。

 

ちょっとだけ気に入らないのは、パッケージをアップデートしようとしたのに結局古い方を使わざるを得なくなったという現実。謎の敗北感。

 

今日はここまで。なぜこんなことになったのか。Djangoをアップデートして、ドキュメントのバージョン(=Django2.2だったかな)に合わせよう と思ったのが事の発端だった。明日は時間をつくり次第Djangoチュートリアルを読む予定。