新しいことにはウェルカム

技術 | 電子工作 | ガジェット | ゲーム のメモ書き

WSLにpyenvでPython3+Jupyter Notebook環境を構築する

WSL(Windows Subsystem for Linux)のUbuntuのバージョンが16と古くなってきたので、バージョン18のUbuntuを新たにインストールしました。

それに合わせて、Python3+Jupyter Notebookもセットアップし直したのですが、途中いくつかつまづいたので、今後の再セットアップ用に、Python環境構築についてのメモを記します。

Python環境に関する基本

  • Pythonはバージョン3と2の2系統があります。
  • バージョン3と2では、コマンドが違うので、1つのPCに2つとも入れる事が可能です。
    • (2つは共存できず、Pythonバージョン切り替えツールを用いで共存させるものだと勘違いしていてハマりました)
  • pipとはいわゆるモジュール管理ツールで、Pythonのモジュールのインストールはpipを使って行います。
  • Pythonのモジュールインストールは、
    Python3の場合python3 -m pip install <モジュール名>
    Python2の場合python -m pip install <モジュール名>
    で行います。

Pythonバージョン違い

Pythonバージョン3・2で、主に下記の違いがあります。

項目 バージョン3 バージョン2
実行コマンド python3 python
pipモジュールインストール方法 python3 -m pip install <モジュール名> python -m pip install <モジュール名>
Ubuntu pythonパッケージ名 python3 python
Ubuntu pipパッケージ名 python3-pip python-pip

Jupyter Notebook

インストール

Jupyter Notebookはpipを使ってインストールします。

python3 -m pip install jupyter

実行

実行は直接「jupyter」コマンドで行います。

jupyter notebook

Ubuntuに関する特記事項

  • Ubuntu18にはデフォルトではPython3しか入っていません。
  • Ubuntu18にはデフォルトではpipは入っていません。

なので、Jupyter Notebookをインストールするには、まず下記で、Python3のpipをインストールしておき、その後、Jupyter Notebookをインストールします。

sudo apt-get install python3-pip
python3 -m pip install jupyter

注意

Jupyter Notebookをインストールすると、「~/.local」にjupyterが置かれ、「jupyter」コマンドはそのjupyterを起動するようになります。(設定は「~/.profile」で行っている)

後述するPythonバージョン切り替えツールを使っても、jupyterが「~/.local」にある方を参照している場合は、システムでインストールされているバージョンのPythonが使用されるので、Pythonバージョン切り替えツールを使う場合は、jupyterが「~/.local」の方を指さないようにする必要があります。(これに気づかずハマりました)

pyenv

上記でPython3+Jupyter Notebook 環境をインストールできるのですが、その時のPythonのバージョンはUbuntuのパッケージでインストールしたPython3のバージョンになります。

UbuntuのパッケージのPythonのバージョンは、最新から少し古いので、任意のPythonバージョンでJupyter Notebookが使用できるよう、Pythonバージョン管理ツールの「pyenv」を導入します。

pyenvとは?

  • pyenvとは、Pythonのバージョンを任意に切り換えることのできるツールです。
  • 仕組みは、$PATHの前にpyenvのパスを通すことにより、システムのPythonが参照されるのを横取りして、任意のバージョンのPythonを呼び出すようにします。
  • ユーザーデフォルトのPythonバージョンを任意の物に設定したり、フォルダ毎にPythonバージョンを任意の物に設定することができます。

pyenvインストール

1. 必要ファイルをホームディレクトリの「.pyenv」にダウンロード

git clone https://github.com/pyenv/pyenv.git ~/.pyenv

2. 「.bashrc」または「.bash_profile」に下記を追記

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
    eval "$(pyenv init -)"
fi

3. シェル再起動

echo $PATHを実行すると分かるのですが、$PATHの先頭に「~/.pyenv/shims」が追加されています。

それにより、システムのPythonは隠蔽され、Pythonを起動しようとするとpyenvで管理された、「~/.pyenv/shims」配下に置かれたPythonが呼ばれるようになります。

pyenvの使用方法

ますpyenvで使いたいバージョンのPythonをインストールし、次に、インストールしたPythonを、ユーザーデフォルトや指定したディレクトリ毎に割り当てます。

インストールできるPythonのバージョン一覧表示

pyenv install —list

指定したバージョンのPythonをインストール

pyenv install <バージョン名>

この時、pipもインストールされます。

インストールされているバージョン一覧表示

pyenv versions

ユーザーデフォルトのPythonバージョンを、指定したバージョンにする

pyenv global <バージョン名>

カレントディレクトリ以下でのPythonバージョンを、指定したバージョンにする

pyenv local <バージョン名>

Ubuntuに関する特記事項

pyenvでPythonをインストールする際、下記のパッケージを事前にインストールしておく必要があります。

suto apt-get install make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

この内容はpyenv wikiに記載されている(これに気づかずハマりました)ので、Pythonインストールでパッケージが足りない旨のエラーが出た際は参照してください。

利用例

例)Pythonバージョン3.7.2でJupyter Notebook

pyenv install 3.7.2
pyenv local 3.7.2
python3 -m pip install jupyter
jupyter notebook

例)Pythonバージョン2.7.15と3.7.2をインストールして、ユーザーデフォルトで、コマンド「python」にバージョン2.7.15を割り当てる

Pythonバージョン3と2両方を使えるようにしたい場合があります。

そんな場合はpyenv global <バージョン2> <バージョン3>またはpyenv local <バージョン2> <バージョン3>と、2バージョン並べて記載します。

すると、両方のバージョンが使えるようになり、2つ並べたバージョンの内、最初に指定したバージョンに「python」コマンドが割り当てられます。

2つ目のバージョンは3なので「python3」コマンドに割り当てられます。

$ pyenv install 2.7.15
$ pyenv install 3.7.2
$ pyenv global 2.7.15 3.7.2
$ python -V
Python 2.7.15
$ python3 -V
Python 3.7.2

困った時は

どこの・どのバージョンのPython・Juypterが呼ばれているのかを調べれば、おかしい原因が見つかるかと思います。

  • Pythonのバージョン確認は
    Python3の場合python3 -V
    Python2の場合python -V
    で行います。
  • プログラムからPythonのバージョン・パスを知るには下記で行えます。
    特にJupyter Notebookから、実行されているPythonのバージョンを知るのに有用です。
import sys
print(sys.version_info)
print(sys.path)
  • 環境によってコマンド「python」に割り当てられているPythonのバージョンが3の場合があります。
    ですので、python -Vで「python」に割り当てられているバージョンを確認しておいた方がベターです。
  • コマンドがどのパスに割り当てられているかを確認するにはwhich <コマンド名>を用います。
    例えば「python」のパスを知るにはwhich pythonと打ちます。
    例えば「jupyter」のパスを知るにはwhich jupyterと打ちます。
    特にpyenvを使用している時、そのPython・Jupyterがシステムのものか、pyenvのものかを知るのに有用です。