たけのこブログ

凡人が頑張って背伸びするブログ

venvで新しくjupyterインストールして動かしたら、ローカルのjupyter環境と競合して全ての開発環境が詰んだ件についての対処法

概要

めっちゃ長いタイトルですが、タイトルの通りです。業務でjupyterでコードが欲しいと頼まれたので、従来のcolabで渡すのがダルくてvenv+requirements.txtで配布してしまいました。そして、地獄はスタートしました。

なぜか、ローカルのjupyter環境が全て動かなくなりました😇

jupyterは起動する。しかし、あらゆるコードが実行できず、*のまま停止する。juliaをターミナルから起動してnotebook()したときは動くのに、なぜか素でjupyter起動すると動かない。しかも、jupyter起動した時のデフォルトのパスがvenv作ったパスからスタートされてしまうバグつき。

もうね、泣きたくなったよ、うん。

さらに、jupyter notebookはコードを開いた瞬間に500エラーを出される始末でした。ぐぅの音も出ない。

ローカルで入れてるjuliaもpythonもRも動かなくて死にそうになりました(休日の開発がオワタ)。それでも、対応していくうちになんとなく原因が分かったのですが、どうやら

venvで入れたjupyterバージョンとローカルで入れてるjupyterバージョンが競合した

ことが原因みたいです(えぇ...汗)

そこで、ローカル環境で新しくjupyterを入れようとしたのですが、古かったせいか色んなエラーを吐かれて詰みかけたので、今回は上記のような特殊な経験をしてしまった(ニッチな)人たちの助けとして「新しいjupyterを導入する際に気をつけたいこと」を記載します

解決方法

もしも上の環境を実行していて従来のjupyterが動かない場合は新しいjupyter環境を入れますが、そこそこ古いjupyter環境から新しい環境に変えようとして何も考えずpip install jupyterlabを行うと

ERROR: Cannot uninstall 'terminado'. 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.

のようなエラーが吐かれてしまいます。解決策が中々見つからず時間がかかりましたが、

pip install terminado==0.9.1 --user --ignore-installed 

を実行すればterminado問題は解決します。しかし、この後にpip install jupyterlabをすると高確率で

ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
ndex2 3.2.0 requires enum34, which is not installed.

という内容のエラーが出てくると思いますが、これは

pip install enum34

で大丈夫です。ここまできたら、あとは

pip install jupyterlab

で問題なく動いて解決すると思います(無事に開発環境が復旧したので良かった...明日から平日だし焦った...泣

上の対応は主にjupyterlabを最新版に更新するときの障害ですが、venv+requirements.txtにしたせいで思わぬ障害が発生しました汗

まとめ

相手にjupyter形式で環境を提供するときは本当に気を付けましょう(いや、本当に洒落にならないから。めっちゃ謝ることになるから。さっき担当者に謝ったから汗汗汗)

もうトラウマになってしまって、例えどんなに面倒臭くても、二度とvenv+requirements.txtで環境渡せないです笑

余談

ローカルに入れていたjupyter環境とvenv上で新しく入れたjupyter環境の競合が原因なので原因特定に時間がかかりましたが、上記の対応でなんとかなると思います。ちなみに、venv上のカーネルについてはjupyter kernelspec listに登録されていると気持ち悪いと思いますので、

jupyter kernelspec uninstall 仮想環境で作ったカーネル名

で削除できます。あー気持ちいい()