🐍

Jupyter Notebook (Lab)上で目当てのPythonが呼べないときの覚書

2023/04/28に公開

目的

Anacondaを使って環境管理をしつつ、Jupyter-labでそれぞれの環境下にあるPythonを別のカーネルとして呼びたい。
Jupyterとそこで呼び出されるカーネル・ターミナルの違いを正しく理解する。

InstallしたはずのパッケージがJupyter上で動かない

まず作業のために新たな環境を作成し、その環境をactivateした上でJupyter-labを走らせました。しかし、Jupyter上で動くカーネルはJupyterが走っている環境とは必ずしも一致しないので、以下のコマンドを走らせて呼び出されるpythonと、Jupyter notebook上でコードを実行するpythonは別の環境下にあるものになることがあります。

!which python

実際に呼び出されているpythonの場所は、以下のコマンドで確認することができます。

import sys
sys.executable
-> /home/user/miniconda3/envs/different_env/bin/python

特定の環境でNotebookを走らせるためには、その環境下でipython kernelをインストールする必要があります。公式の説明はこちらです。

まず目的の環境をactivateし、きちんと正しいPATHが通っていることを確認します。

conda activate env_name
echo $PATH

この環境にはipythonをインストールしておく必要があります。
カーネルを以下のコマンドでインストールします。

(env_name) conda install -c conda-forge ipython
(env_name) pip install ipykernel
(env_name) ipython kernel install --name hoge --display-name Python3.x-hoge

また、このようなAnacondaを使った環境構築はサーバー上で行っていることが多いと思いますが、以下のように書き込みができないディレクトリが参照されるようなエラーが出ることがあります。

[Errno 13] Permission denied: '/usr/local/share/jupyter'.

これは、Jupyter(のバックエンドにあるipython)がカーネルの場所として参照している場所が、書き込み許可のない/usr/local/share/jupyter/にあるために起こります。これらのpathの設定は以下のコマンドで調べられます。

jupyter --path

書き込み場所を指定してカーネルをインストールするには、--prefixオプションを利用します。

ipython kernel install --name hoge --display-name Python3.x-hoge --prefix=/home/user/.local/

これで、目的の環境に基づくipythonカーネルを(おそらく)/home/user/.local/share/jupyter/kernelsに追加することができました。
実際に、Jupyterを起動してカーネルが選択できることを確認します。
これらはpythonを利用するためのipythonのカーネルに関してでしたが、異なる環境下でのRの利用もそれぞれのIRkernelをインストールすることで実現されます。

install.packages('IRkernel')
IRkernel::installspec(name = 'irhoge', displayname = 'R.3.x-hoge')

カーネルの名前は別々のものを指定しないとoverwriteしてしまうので注意が必要です。

おまけ

以上のように、Jupyterとその内部で呼ばれるターミナルはカーネルの環境と一致していません。そのため、カーネルと異なる環境でJupyterを動かしている場合に、pipなどでパッケージをインストールすると目的の環境とは別の場所に入ってしまいます。
そのため、正しい場所にインストールをするためには、コマンドライン上で目的の環境をactivateしてからインストール作業をする必要があります。
参考 https://qiita.com/SaitoTsutomu/items/a3d27a2de1ff3e762771

Discussion