自分のキャリアをあれこれ考えながら、Pythonで様々なデータを分析していくブログです

[Mac] 複数のPython仮想環境をJupyter notebook上で切り替える方法

Python
Python

今回は[Mac] Pythonの仮想環境をvenvで作成する方法の応用版になります。

jupyter notebook内で複数の仮想環境を切り替えて利用できるようにする方法をまとめました。

図にすると下記のようになります。

図1:

メイン環境のmy-venv環境にjupyterをインストールし、other1 ~ other3までの環境を切り替えられるようにします。(my-venv環境も共存可能)

スポンサーリンク

どういう場合に利用するのか

分析をしていく中で、特定のライブラリをインストールしたとき他のライブラリと競合する場合があると思います。

例えばライブラリAはnumpy 1.19.5以下に依存してるが、ライブラリBはnumpy 1.20.0以上に依存している場合などです。

この場合、二つのライブラリA&Bは共存することが出来ないので仮想環境をライブラリA用(other1)とライブラリB用(other2)の2つを作成するといったことが発生します。(メイン環境(my-venv)にライブラリA、サブ環境にライブラリB(other1)をインストールでも可能)

仮想環境を分けることはいいのですが、jupyter notebookやjupyterlabで分析したい場合、それぞれの仮想環境でpip install jupyterをしてjupyter notebookを起動している人もいるかも知れません。

この方法ですと管理が複雑になるし扱いづらいので、なるべく1つのjupyterから複数の仮想環境を切り替える方法をおすすめします。

スポンサーリンク

メインの仮想環境(my-venv)の作成

# my-venvという名前の仮想環境を作成
python3 -m venv my-venv
# activateにする
source my-venv/bin/activate
# pipのアップグレード
(my-venv) % python3 -m pip install --upgrade pip
Out[0]
Collecting pip
  Using cached https://files.pythonhosted.org/packages/96/2f/caec18213f6a67852f6997fb0673ae08d2e93d1b81573edb93ba4ef06970/pip-22.1.2-py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 19.2.3
    Uninstalling pip-19.2.3:
      Successfully uninstalled pip-19.2.3
Successfully installed pip-22.1.2
# jupyterのインストール
(my-venv) % python3 -m pip install jupyter
Out[0]

Collecting jupyter
  Using cached jupyter-1.0.0-py2.py3-none-any.whl (2.7 kB)
Collecting ipykernel
  Using cached ipykernel-6.13.0-py3-none-any.whl (131 kB)
・・・省略・・・
Successfully installed MarkupSafe-2.1.1 Send2Trash-1.8.0 appnope-0.1.3 argon2-cffi-21.3.0 argon2-cffi-bindings-21.2.0 asttokens-2.0.5 attrs-21.4.0 backcall-0.2.0 beautifulsoup4-4.11.1 bleach-5.0.0 cffi-1.15.0 debugpy-1.6.0 decorator-5.1.1 defusedxml-0.7.1 entrypoints-0.4 executing-0.8.3 fastjsonschema-2.15.3 importlib-resources-5.7.1 ipykernel-6.13.0 ipython-8.4.0 ipython-genutils-0.2.0 ipywidgets-7.7.0 jedi-0.18.1 jinja2-3.1.2 jsonschema-4.6.0 jupyter-1.0.0 jupyter-client-7.3.1 jupyter-console-6.4.3 jupyter-core-4.10.0 jupyterlab-pygments-0.2.2 jupyterlab-widgets-1.1.0 matplotlib-inline-0.1.3 mistune-0.8.4 nbclient-0.6.4 nbconvert-6.5.0 nbformat-5.4.0 nest-asyncio-1.5.5 notebook-6.4.11 packaging-21.3 pandocfilters-1.5.0 parso-0.8.3 pexpect-4.8.0 pickleshare-0.7.5 prometheus-client-0.14.1 prompt-toolkit-3.0.29 psutil-5.9.1 ptyprocess-0.7.0 pure-eval-0.2.2 pycparser-2.21 pygments-2.12.0 pyparsing-3.0.9 pyrsistent-0.18.1 python-dateutil-2.8.2 pyzmq-23.1.0 qtconsole-5.3.0 qtpy-2.1.0 six-1.16.0 soupsieve-2.3.2.post1 stack-data-0.2.0 terminado-0.15.0 tinycss2-1.1.1 tornado-6.1 traitlets-5.2.2.post1 wcwidth-0.2.5 webencodings-0.5.1 widgetsnbextension-3.6.0 zipp-3.8.0

後ほど確認するためにmy-venv環境にはpandasをインストールしておきます。

# pandasのインストール
(my-venv) % python3 -m pip install pandas
Out[0]

Collecting pandas
  Downloading pandas-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl (11.0 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.0/11.0 MB 15.5 MB/s eta 0:00:00
Requirement already satisfied: python-dateutil>=2.8.1 in ./my-venv/lib/python3.8/site-packages (from pandas) (2.8.2)
Collecting numpy>=1.18.5
  Using cached numpy-1.22.4-cp38-cp38-macosx_10_15_x86_64.whl (17.6 MB)
Collecting pytz>=2020.1
  Downloading pytz-2022.1-py2.py3-none-any.whl (503 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 503.5/503.5 kB 11.4 MB/s eta 0:00:00
Requirement already satisfied: six>=1.5 in ./my-venv/lib/python3.8/site-packages (from python-dateutil>=2.8.1->pandas) (1.16.0)
Installing collected packages: pytz, numpy, pandas
Successfully installed numpy-1.22.4 pandas-1.4.2 pytz-2022.1

これで一旦、メイン環境(my-venv)の準備は完了。

# deactivateコマンドでmy-venv環境から抜け出します
deactivate
スポンサーリンク

切替用の仮想環境(other1,other2,other3)の作成

仮想環境の作成

# 3つ一気に作成
python3 -m venv other1 
python3 -m venv other2
python3 -m venv other3

pipのアップデートと確認用に異なるバージョンのnumpyのインストール

1つずつの仮想環境にactivateしてコマンド実行するのは大変なので、直接それぞれの仮想環境内のpythonを呼び出して作業してみます。

# pipのアップグレード
other1/bin/python3 -m pip install --upgrade pip
other2/bin/python3 -m pip install --upgrade pip
other3/bin/python3 -m pip install --upgrade pip

#確認用にnumpyのインストール
other1/bin/python3 -m pip install numpy==1.19.0
other2/bin/python3 -m pip install numpy
other3/bin/python3 -m pip install numpy==1.17.5
Out[0]
アウトプットは割愛します。
スポンサーリンク

jupyterからIPythonカーネルを呼び出せるようにする

my-venvのjupyter notebookからother1 ~ other3の仮想環境を選択できるようにします。

jupyterは裏側でIPythonカーネルという単独のプロセスがPythonコードなどを実行するために動いているようです。(pip install jupyterをしたときにipykernelも依存関係でインストールされていました。)

The IPython kernel is the Python execution backend for Jupyter.
引用: https://ipython.readthedocs.io/en/stable/install/kernel_install.html

それぞれの仮想環境ごとに別々のIPythonカーネルを準備してメインのjupyterで読み込んであげることによって複数の仮想環境を使い分けることが可能になるようです。

All the other interfaces—the Notebook, the Qt console, ipython console in the terminal, and third party interfaces—use the IPython Kernel. This is a separate process which is responsible for running user code, and things like computing possible completions.引用:https://ipython.org/ipython-doc/3/development/how_ipython_works.html

仮想環境other1~other3にipykernelをインストール

# 仮想環境にipykernelのインストール
other1/bin/python3 -m pip install ipykernel
other2/bin/python3 -m pip install ipykernel
other3/bin/python3 -m pip install ipykernel

kernelspecファイルのインストール

# jupyterから読み込めるように、それぞれのipykernelのkernelspecファイルをインストール
other1/bin/python3 -m ipykernel install --user --name other1 --display-name "Python (other1)"
other2/bin/python3 -m ipykernel install --user --name other2 --display-name "Python (other2)"
other3/bin/python3 -m ipykernel install --user --name other3 --display-name "Python (other3)"
Out[0]

Installed kernelspec other1 in /Users/hinomaruc/Library/Jupyter/kernels/other1
Installed kernelspec other2 in /Users/hinomaruc/Library/Jupyter/kernels/other2
Installed kernelspec other3 in /Users/hinomaruc/Library/Jupyter/kernels/other3

other1~other3のカーネルスペックファイルがインストールされました。
こちらの情報をjupyterが読み込んでくれるようです。

# インストールされたカーネルスペックを確認する
my-venv/bin/activate/jupyter kernelspec list
Out[0]

Available kernels:
  other1     /Users/hinomaruc/Library/Jupyter/kernels/other1
  other2     /Users/hinomaruc/Library/Jupyter/kernels/other2
  other3     /Users/hinomaruc/Library/Jupyter/kernels/other3
  python3    /Users/hinomaruc/Desktop/blog/my-venv/share/jupyter/kernels/python3

無事参照できていそうです。

jupyterの起動と動作確認

# my-venvのjupyter notebookを起動
my-venv/bin/python3 -m jupyter notebook

右上の新規ボタンをクリックすると、other1 ~ other3の環境を選択できるようになっています。「Python (ipykernel)」はmy-venvのカーネルです。

図2:

まずはメイン環境であるmy-venvから確認してみます。

図3: Python (ipykernel)

想定通りです。pandasがインストールされているようです。numpyはpandasをインストールすると依存関係でインストールされます。

図4: Python (other1)

numpyのバージョンは1.19.0でpandasはインストールされていませんので想定通りです。

図5: Python (other2)

numpyのバージョンは現在の最新版でpandasはインストールされていませんので想定通りです。

図6: Python (other3)

numpyのバージョンは1.17.5でpandasはインストールされていませんので想定通りです。

スポンサーリンク

kernelspecファイルの削除方法

使わなくなったカーネルスペックファイルを削除する
jupyter kernelspec uninstall other1
Out[0]
Kernel specs to remove:
  other1 /Users/hinomaruc/Library/Jupyter/kernels/other1
Remove 1 kernel specs [y/N]: y

other1が削除されたと思います。

ちなみにjupyter kernelspec listでインストール済みのカーネルスペック一覧を確認できます。

スポンサーリンク

まとめ

いかがでしたでしょうか?

依存関係がややこしいdeep leaning系のライブラリも環境を分けることによって作業しやすくなるのではないかと思います。

次回はautomlの仮想環境を作成してみようと思います。

タイトルとURLをコピーしました