※この記事は試行錯誤している現状をメモしたものです。ベストプラクティスとは限りません。
世の中の Jupyter Notebook(以下jupyter)の記事は、公式のチュートリアルも含めて、Pythonインタープリタを1個だけインストールしていることを前提にしています。
しかし、私は pyenv で複数のPythonインタープリタをインストールし、pipenvでプロジェクトごとに仮想環境を作って開発しているので、ちょっと困ることがあります。
jupyterが1個しかないと困ること
jupyterで「Python3」のノートブックを実行する時は、jupyterを起動したPythonインタープリタを使用します。pandasなどのパッケージを使いたい時は、そのPythonインタープリタにインストールする必要があります。
しかし、プロジェクトごとに、パッケージのバージョンが違ったり、独自パッケージがあったりするので、1つのPythonインタープリタに全パッケージを共存させることはできません。
作戦A: プロジェクトごとに jupyter をインストールする
各プロジェクトでjupyterをインストールします
$ ( cd ~/path/to/foo; pipenv install --dev jupyter )
$ ( cd ~/path/to/bar; pipenv install --dev jupyter )
$ cd ~/path/to/foo; pipenv run jupyter # 開発したいプロジェクトでjupyterを起動する
この方法のメリットは、
-
- とにかく分かりやすい: pipenv install するだけ
- 各プロジェクトのjupyterが完全に分離されるので、トラブル時に直すのも簡単
一方デメリットは、
-
- jupyter のインストール先が複数になるため、jupyterをアップデートしたりプラグインを追加したりするのが煩雑になること
- あるプロジェクトから別のプロジェクトに移る時には、jupyterを起動し直す必要がある。プロジェクトを並行開発している場合(レビュー待ち中に別プロジェクトをコーディングするなど)は起動が面倒
作戦B: jupyterを –user でインストールし、プロジェクトごとに kernel を作る
まずjupyterは、各プロジェクトとは無関係な場所にインストールします。簡単なのは –user を使うことです。こうすると、pipenvやpyenvに関係なく、jupyterコマンドを特定のPythonインタープリタで使えるようになります。
$ ~/.pyenv/versions/3.7.3/bin/pip install --user jupyter
$ export PATH="$PATH:$HOME/.local/bin" # これを ~/.bash_profile に追加
$ which jupyter
/Users/foo/.local/bin/jupyter
そして、各プロジェクトでipykernelというパッケージをインストールし、プロジェクトの仮想環境を「Kernel」としてjupyterに登録します。
$ pipenv run pip install ipykernel
$ pipenv run python -m ipykernel install --name="$(basename $(pwd))" --user
すると、Notebookを新規作成する時に、「Python3」の他にプロジェクト名が表示され、実行時にプロジェクトの仮想環境で実行できるようになります。