Posted at

複数プロジェクトを開発している時に jupyter を使う

※この記事は試行錯誤している現状をメモしたものです。ベストプラクティスとは限りません。

世の中の 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」の他にプロジェクト名が表示され、実行時にプロジェクトの仮想環境で実行できるようになります。