WSL2 による Python3 の環境構築

# 概要

WSL2 を使って，Python3 の実行環境を整備する方法をまとめました．
本記事では pip を用いた仮想環境を構築していきます．

- 利用可能になるまでの所要時間
    - Python3：0分 ($\because$ インストール済み)
    - pip3：10分
<br / >
- 実行環境：Windows 11

<br / >

WSL2 のインストール方法については以下の記事をご覧ください．

https://qiita.com/zakoken/items/61141df6aeae9e3f8e36


# 目次
1. [WSL2 上での Python3 の利用](#1-wsl2-上での-python3-の利用)
1. [pip3によるライブラリ管理のための準備](#2-pip3-によるライブラリ管理のための準備)
1. [仮想環境の構築](#3-仮想環境の構築)
1. [仮想環境下での pip3 を用いたライブラリ管理](#4-仮想環境下での-pip3-を用いたライブラリ管理)

# 1. WSL2 上での Python3 の利用

WSL2 では python3 がデフォルトで実装されており，**インストール不要**です．
試しに Ubuntu のターミナルから `python3 --version` と入力してみましょう．
```python:Python
python3 --version
Python 3.10.12
```
デフォルトでは，バージョン `3.10.12` がインストールされているようです．
python の実行ファイルの在処は `which -a python3.10` と入力することで確認できます．
```terminal:Ubuntu
which -a python3.10
/usr/bin/python3.10
/bin/python3.10
```

ただし，matplotlib や pandas といった数値計算用ライブラリは揃っていないので，これらを以下で紹介する手順に沿ってインストールしていきます．

## 1-1. pyenv による python 自体のバージョン管理
大昔に作られた python コードの中には，まれに賞味期限切れのパッケージが含まれている場合があり，バージョンを適切に切り替えないと作動しない場合があります．
そこで，[pyenv](https://github.com/pyenv/pyenv) というパッケージを使った python のバージョン管理法をまとめておきます．

このパートは，以下の記事を引用させて頂きました．

https://zenn.dev/hr0t15/articles/8ae3564bde2cce

#### pyenv をインストールする
まず，`sudo apt update` を実行しておきます．
次に，pyenv のインストールに必要なパッケージをインストールします(コピペで OK)．
``` : Ubuntu
sudo apt install build-essential libffi-dev libssl-dev zlib1g-dev liblzma-dev libbz2-dev \
  libreadline-dev libsqlite3-dev libopencv-dev tk-dev git
```
github から pyenv を取り寄せます(コピペで OK)．
``` : Ubuntu
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```
以下を実行し，`~./bashrc` に pyenv の実行を自動化させます．
``` : Ubuntu
echo '' >> ~/.bashrc
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
source ~/.bashrc
```
`pyenv -v` と入力し，以下のような応答があればインストール完了です．
``` : Ubuntu
pyenv -v
pyenv 2.3.36-18-g0167890c
```
なお，インストール先は `~/.pyenv` 以下となります．

## 1-2. 任意の python バージョンをインストールする
入手可能な python バージョンは `pyenv install --list` で確認することができます．
とても長いですが，最初の方の数字だけの部分がバージョンを表します．
``` : Ubuntu
pyenv install --list
~省略~
3.10.10
3.10.11
3.10.12
3.10.13
3.11.0
3.11-dev
3.11.1
3.11.2
3.11.3
3.11.4
3.11.5
3.11.6
3.11.7
3.11.8
3.12.0
~省略~
```
まず，`pyenv install 欲しいバージョン` を使ってインストールします(5分くらい掛かります)．
例えば，`3.12.0` をインストールしてみます．
インストール先は `~/.pyenv/versions/` 以下です．
``` : Ubuntu
pyenv install 3.12.0

Downloading Python-3.12.0.tar.xz...
-> https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz
Installing Python-3.12.0...
Installed Python-3.12.0 to /home/ユーザー名/.pyenv/versions/3.12.0
```
`pyenv versions` と入力すると，インストール済みのバージョンを確認できます．
``` : Ubuntu
pyenv versions

* system (set by /home/ユーザー名/.pyenv/version)
  3.12.0
```

## 1-3. python のバージョンを切り替える
現在有効な python のバージョンを確認するには `pyenv version` を使います．
``` : Ubuntu
pyenv versions

* system (set by /home/ユーザー名/.pyenv/version)
```
まだ有効化されていないので何も表示されません．

### システム全体のバージョンを切り替える場合
システム全体の python バージョンを切り替えるには `pyenv global バージョン` とします．
``` : Ubuntu
pyenv global 3.12.0
```
改めて `pyenv version` を実行すると，無事 `3.10.12` が `3.12.0` に切り替わっていることを確認できます．
``` : Ubuntu
pyenv version
3.12.0 (set by /home/ユーザ名/.pyenv/version)

python3 --version
Python 3.12.0
```
なお，この設定は Ubuntu を再起動しても継続されます．
`python3 --version` で確認する場合は Ubuntu を再起動してください．

### ローカルにバージョンを切り替える場合
ローカルに python のバージョンを切り替えるには，そのディレクトリに移動した後 `pyenv local バージョン` とします．
``` : Ubuntu
pyenv local 3.12.0
```
この設定は Ubuntu を再起動すると消滅します．

::: note warn
以降は，WSL2 のデフォルト `3.10.12` を使って環境を構築していきます．
そのため，`pvenv global 3.10.12` を実行してください．
:::

# 2. pip3 によるライブラリ管理のための準備
複数のユーザーが同一のマシンを利用している場合では，ライブラリのバージョン齟齬が生じて大変面倒です．

そのような衝突などを避けるために，python の実行環境を新たに作成し，そのローカルな環境でライブラリ管理を行うことが一般的です．
このようなローカルな環境を「仮想環境」と言います．

python 自体のバージョン管理には [pvenv](https://github.com/pyenv/pyenv) を使います．
仮想環境の構築には，[pip](https://pypi.org/project/pip/) や [conda](https://docs.conda.io/en/latest/) などのツールを用います．

本記事では，ライブラリ管理が簡単という点から pip を用いた方法を紹介します．
両者の違いは以下の記事などが参考になります．

https://qiita.com/toto1310/items/14bdbaccd53bed74715c

https://zenn.dev/ren_hisui/articles/10d1d5f6493663


## 2-1. pip3 のインストール


`pip3 --version` と入力し，以下のような応答があれば，既にインストールされています．
```terminal:pip
pip3 --version
pip 23.0.1 from /home/ユーザー名/.pyenv/versions/3.10.12/lib/python3.10/site-packages/pip (python 3.10)
```

もしも pip3 をインストールするには，`sudo apt install python3-pip` と入力します．

```terminal:Ubuntu
sudo apt install python3-pip
```


## 2-2. インストール済みのライブラリを確認する

`pip3 list` と入力すると，インストール済みのパッケージ名が一覧で表示されます．

```:pip
pip3 list
Package                Version
---------------------- -------------
contourpy       1.2.0
cycler          0.12.1
fonttools       4.49.0
kiwisolver      1.4.5
matplotlib      3.8.3
numpy           1.26.4
packaging       24.0
pillow          10.2.0
pip             23.0.1
python-dateutil 2.9.0.post0
setuptools      65.5.0
```

`pip3 list --outdated` と入力すると，上記のうち最新版でないパッケージが表示されます．

```:pip
pip3 list --outdated
Package            Version Latest Type
------------------ ------- ------ -----
fonttools  4.49.0  4.50.0 wheel
pip        23.0.1  24.0   wheel
setuptools 65.5.0  69.2.0 wheel
```

デフォルトのpipちゃんは古いバージョンなので，後で最新版に更新します．

# 3. 仮想環境の構築

myenv という名前の仮想環境を構築してみます．
myenv 以外の仮想環境名にする場合は，myenv を適当に読み替えてください．

１．仮想環境を作るために必要な [venv](https://docs.python.org/ja/3/library/venv.html) というモジュールをインストールします．
```terminal:Ubuntu
sudo apt install python3.10-venv
```
なお，`pythonバージョン-venv` としてください．

２．myenv という名前の仮想環境を，`~/.local/bin/` というローカルな場所に設置します．

```terminal:Python
python3 -m venv ~/.local/bin/myenv 
```

## 3-1. 仮想環境の有効化と無効化
`source ~/.local/bin/myenv/bin/activate` と入力すると，仮想環境が有効になります．
```:Ubuntu
ユーザー名:現在のPATH$ source ~/.local/bin/myenv/bin/activate 
(myenv) ユーザー名:現在のPATH$
```
:::note info
仮想環境が有効になると，頭に (仮想環境名) が付きます．
:::

仮想環境から脱出するには，`deactivate` と入力します．

```:Ubuntu
(myenv) ユーザー名:現在のPATH$ deactivate
ユーザー名:現在のPATH$
```

なお，Ubuntu を閉じると仮想環境から強制的に追い出されます．

## 3-2. Ubuntu 起動時に仮想環境を自動で開くように設定する

`source ~/.local/bin/myenv/bin/activate` と毎回打つのは面倒です．
そこで，Ubuntu 起動時に自動的で仮想環境が有効になるように設定しておきます．
具体的には，`~/.bashrc` の最後尾に以下を追記します．
```:Ubuntu
vim ~/.bashrc
# bashrc が開くので，最後尾に次を追記
source ~/.local/bin/myenv/bin/activate
```
Ubuntuを一旦閉じて，再度開いてみましょう．
自動で myenv が有効になっていることが確認できます．

<br / >

なお，vim のコマンドは以下がとても参考になります．

 https://qiita.com/hide/items/5bfe5b322872c61a6896

 
# 4. 仮想環境下での pip3 を用いたライブラリ管理

### 準備
- Ubuntu にログインして，仮想環境を有効にしてください
- `~/.local/bin/myenv/lib/python3.10/site-packages` に移動して中身を確認してください
```terminal:Ubuntu
ls
_distutils_hack           pip                   pkg_resources  setuptools-59.6.0.dist-info
distutils-precedence.pth  pip-22.0.2.dist-info  setuptools
```

::: note info
`~/.local/bin/myenv/lib/python3.10/site-packages/` にライブラリが格納されます
:::

## 4-1. python ライブラリの更新方法

手始めに，pip のバージョンを更新しましょう．
まず，仮想環境下にある pip のバージョンを調べてみます．
```terminal:pip
pip3 list --outdated
Package    Version Latest Type
---------- ------- ------ -----
pip        22.0.2  24.0   wheel
setuptools 59.6.0  69.1.1 wheel
```

python ライブラリの更新には，`pip3 install --upgrade ライブラリ名` と入力します．
pip 自身を更新する場合は，以下のようになります．

```terminal:pip
pip3 install --upgrade pip
```
もしも PATH が通っていないと注意されたら，[コチラ](#おまけ-wsl2-における-path-の開通)を参考にしてください．
再度バージョンを確認すると，pip が無事消えていることが分かります．
```terminal:pip
pip3 list --outdated
Package    Version Latest Type
---------- ------- ------ -----
setuptools 59.6.0  69.1.1 wheel
```
なお，バージョンを指定する場合は `pip3 install ライブラリ名==バージョン` と入力します．
例えば，上の最新版 pip 24.0 を元の 22.0.2 に戻す場合は以下のようにします．
```:pip
pip3 list # 現在のバージョンを確認
Package    Version
---------- -------
pip        24.0
setuptools 59.6.0

pip3 install pip==22.0.2
# 省略
Successfully installed pip-22.0.2

pip3 list # 再度バージョンを確認
Package    Version
---------- -------
pip        22.0.2
setuptools 59.6.0
```


## 4-2. python ライブラリのインストール方法

python ライブラリのインストールには `pip3 install パッケージ名` と入力します．
例えば，[matplotlib](https://matplotlib.org/) をインストールする場合は以下のようにします．

```:pip
pip3 install matplotlib
# 省略
Installing collected packages: six, pyparsing, pillow, packaging, numpy, kiwisolver, fonttools, cycler, python-dateutil, contourpy, matplotlib
Successfully installed contourpy-1.2.0 cycler-0.12.1 fonttools-4.49.0 kiwisolver-1.4.5 matplotlib-3.8.3 numpy-1.26.4 packaging-24.0 pillow-10.2.0 pyparsing-3.1.2 python-dateutil-2.9.0.post0 six-1.16.0
```
上の例では，matplotlib に付随する他のライブラリも幾つかインストールされたようです．
実際，`pip3 list` で見てみると，numpy なども追加されたことが確認できます．
```terminal:pip
pip3 list
Package         Version
--------------- -----------
contourpy       1.2.0
cycler          0.12.1
fonttools       4.49.0
kiwisolver      1.4.5
matplotlib      3.8.3
numpy           1.26.4
packaging       24.0
pillow          10.2.0
pip             24.0
pyparsing       3.1.2
python-dateutil 2.9.0.post0
setuptools      69.1.1
six             1.16.0
```

なお，ライブラリのアンインストールには `pip3 uninstall ライブラリ名` を実行します．


## (おまけ) WSL2 における PATH の開通

現在の PATH 状況は `echo $PATH` で確認できます．

```:Ubuntu
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:続く…
```

各 PATH は，コロン区切りで表されています．

例えば，`/home/ユーザ名/.local/bin` を新たに追加する場合を考えます．

```:Ubuntu
export PATH="$PATH:/home/ユーザ名/.local/bin/"
```

改めて，`echo $PATH` を実行すると
```:Ubuntu
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:続く…/home/ユーザ名/.local/bin/
```
となり，指定した PATH をめでたく開通することができます．

::: note warn
`PATH=$PATH:追加PATH` のうち，`$` マークを忘れると PATH が全部書き換わるので注意しましょう．
:::

# まとめ

WSL2 を使って，Python3 の実行環境を整備する方法を紹介しました．
pip3 による仮想環境を使って，大元の Python を汚さないように心掛けましょう．

また，WSL2 を使って Fortran 環境 (gfortran と Intel Fortran) を構築する方法をまとめた記事も書いているので，興味のある方はご覧ください．

https://qiita.com/zakoken/items/2a5e629020ce68f3efe1


# 参考文献
- [(公式) pip](https://pypi.org/project/pip/)
- [(公式) anaconda](https://www.anaconda.com/download)
- ['pip'と'conda'は何が違うのか？ (Qiita @toto1310)](https://qiita.com/toto1310/items/14bdbaccd53bed74715c)
- [conda と pip の違い (Zenn @Len)](https://zenn.dev/ren_hisui/articles/10d1d5f6493663)
- [(公式) venv](https://docs.python.org/ja/3/library/venv.html)
- [よく使う Vim のコマンドまとめ (Qiita @hide)](https://qiita.com/hide/items/5bfe5b322872c61a6896)
- [(公式) matplolib](https://matplotlib.org/)
- [pip の使い方 (エンベーダ―)](https://envader.plus/course/8/scenario/1072)
- [よく使うpipコマンド (Qiita @Masaaki_Inaba)](https://qiita.com/Masaaki_Inaba/items/fe4a246a7e6fcd9c4726)
- [Pythonの環境構築をマスターする(pyenv,venv)(WSL2,Ubuntu利用)(poetry追記) (Zenn @taiga)](https://zenn.dev/tigrebiz/articles/2822fb4de256d8)
- [Pythonで開発するための準備 (Qiita @ynack)](https://qiita.com/ynack/items/5cfd0b391d05ef9ac2b2)
- [WSL2のubuntuでaliasの設定をする (Heisen TechBlog)](https://heisen-tech.com/blog/wsl-2/)
- [【Linux】環境変数の設定方法と注意点 (ICTDoctor)](https://ictdoctor.jp/blogdata/2279/)
- [pvenv (github)](https://github.com/pyenv/pyenv)
- [Ubuntuにpyenvをインストール (Zenn @hr0t15)](https://zenn.dev/hr0t15/articles/8ae3564bde2cce)