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の使用方法
Ubuntuに関する特記事項
pyenvでPythonをインストールする際、下記のパッケージを事前にインストールしておく必要があります。
sudo 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インストールでパッケージが足りない旨のエラーが出た際は参照してください。(Ubuntu以外のOSの場合もWikiに記載されています)
ますpyenvで使いたいバージョンのPythonをインストールし、次に、インストールしたPythonを、ユーザーデフォルトや指定したディレクトリ毎に割り当てます。
インストールできるPythonのバージョン一覧表示
pyenv install —list
指定したバージョンのPythonをインストール
pyenv install <バージョン名>
この時、pipもインストールされます。
インストールされているバージョン一覧表示
pyenv versions
ユーザーデフォルトのPythonバージョンを、指定したバージョンにする
pyenv global <バージョン名>
カレントディレクトリ以下でのPythonバージョンを、指定したバージョンにする
pyenv local <バージョン名>
利用例
例)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のものかを知るのに有用です。