UbuntuにpyenvとvenvでPython開発環境構築

WSL(Windows Subsystem for Linux)のUbuntu18.04 LTSにpyenvとvenvを使ってPython環境構築したので、その記録です。WSLでなくてもUbuntuなら手順は同じです。

環境比較は、記事[「Windows PCで機械学習環境を作る方法まとめ」](https://qiita.com/FukuharaYohei/items/8fb34107dda208f79bca)に書きました。

|種類|バージョン|内容|
|:--|:--|:--|
|OS|Windows10 Professional 64bit|WSL(Windows Subsystem for Linux)でUbuntu18.04.1 LTSを使っています|
|pyenv|1.2.11|pyenv1.2.8で検証しましたが、1.2.11でも同様なことを確認(2019/5/27)|

# インストール手順
## 0. 前提
curlインストール済

環境構築後にTensorBoardを使おうとしたら「ImportError: No module named '_sqlite3'」とエラーが出てしまいました。最初にこれをインストールしておきましょう。そうしないと手順「1.5. Pythonのインストール」からやり直しです。(2019/1/2追記)

```bash
sudo apt-get install zlib1g-dev libssl-dev libsqlite3-dev libbz2-dev libncurses5-dev libgdbm-dev liblzma-dev libssl-dev tcl-dev tk-dev libreadline-dev
```

## 1. pyenvインストール
### 1.1. pyenvインストール
pyenv installerを使って[Github way](https://github.com/pyenv/pyenv-installer#github-way-recommended)の方法に従ってインストールしています。

```bash
curl https://pyenv.run | bash
```

### 1.2. .bashrcに追記
.bashrcに以下の3行を追記しました。

```bash
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init - zsh --no-rehash)"
eval "$(pyenv virtualenv-init -)"
```

### 1.3. pyenv確認
pyenvのバージョンを確認します。

```bash
pyenv -v
```

### 1.4. pyenvでインストール可能なPythonバージョン確認
pyenvでインストール可能なPythonバージョンを確認します。
非常にたくさんでてくるので、記事[「pyenvでインストール可能なバージョン一覧を表示する方法」](https://qiita.com/lighttiger2505/items/9361de2a2951b838f3b7)に記載されている方法で絞り込むと便利かもしれません。

```bash
pyenv install --list
```

リストが多いので、絞り込んだ方が見やすいです(以下はWindowsのPowershellでの絞り込み)。

```powershell
pyenv install --list | Select-String "3.12"
```


### 1.5. Pythonのインストール 
バージョンを指定してインストールします。
※なぜか、私のWSL環境では1時間弱かかりました・・・

```bash
pyenv install 3.6.8
```

Pythonの指定したバージョンがインストールできたことを確認します。

```bash
pyenv versions
```

### 1.6. Pythonのインストール結果の確認
ひとまずグローバルに設定して、現在のPythonバージョンを確認してみます。

```bash
pyenv global 3.6.8
python --version
which python
```

特定のディレクトリ配下で、Pythonバージョンを変えたい場合はlocalコマンドを使います。Pythonバージョンを変えたいディレクトリをカレントにして`pyenv local`で設定します。便利:grinning:

```bash
pyenv local 3.5.5
python --version
which python
```

:::note warn
2022/7 追記
うまくPythonのバージョンがglobalでもlocalでも切替できないことがありました。
どうもVSCodeのインストールと関係しているようです(詳細未調査)。
:::

`pyenv versions`で確認すると、環境変数`PYENV_VERSION`が悪さをしているようです。`pyenv shell --unset`で環境変数が削除されます。

```shell
>> pyenv versions
  system
* 3.10.4 (set by PYENV_VERSION environment variable)
  3.9.13
```

以下のサイトを参考にしました。代わりにVSCodeで不都合が起こるか、などは見ていないです。

https://utano.jp/entry/2019/02/pyenv-local-does-not-work/

あと、この方法もあります。

https://qiita.com/sentencebird/items/7b573c158ddb9401bf00

## 2. venvで仮想環境設定
### 2.1. 仮想環境作成
ディレクトリを移動し、venvで仮装環境を作成します。

```bash
cd <directory>
python -m venv <enviroment name>
```

仮想環境作成によりディレクトリ直下に仮想環境名のフォルダが作成され、その直下にbin等のフォルダができます。lsで確認します。

```bash
ls <environment name> -al
```

### 2.2. 仮想環境有効化
仮想環境を有効化します。コマンドが長くてcondaに比べると少し面倒です。有効化した後はpip freezeやpip install等を使ってpython環境の管理をします。

```bash
source <environment name>/bin/activate
```

ついでにpipを最新化しておきましょう。

```bash
pip install --upgrade pip
```

基本的に便利なJupyter Labをインストールしておきます。Jupyter Notebookより使いやすいと思うようになってきました。

```bash
pip install jupyterlab
```

Jupyter Labの拡張で [Variable Inspector](https://github.com/lckr/jupyterlab-variableInspector)もインストールしておきます。これは、仮想環境を有効化して実行します。Notebook実行中に、いちいちprintコマンドなどを使わずに変数の値を見ることができます。

```bash
pip install lckr-jupyterlab-variableinspector
```

### 2.3. 仮想環境無効化
deactivateコマンドで無効化されます。

```bash
deactivate
```

# その他
## その他1 : venv仮想環境を削除
作成されたファルダを削除するで仮想環境が削除できるようです。

```bash
rm -fr <environment name>
```

## その他2 : パッケージ一括upgrade
インストールしたパッケージを一括でupgrade。Condaの場合は一括パッケージupgradeが簡単だったのですが、少し面倒です。
[Pro Tip - Pip Upgrade All Python Packages](http://mikegrouchy.com/blog/2014/06/pro-tip-pip-upgrade-all-python-packages.html)を参考にしました。

```bash
pip freeze --local | grep -v '^\-e' | cut -d = -f 1  | xargs pip install -U
```

## その他3 : pyenvのupdate
pyenv自体のupdateをする場合です。[pyenv-update](https://github.com/pyenv/pyenv-update)というPlug-inを使います。

まだPlug-inがなければcloneします。

```bash
git clone git://github.com/pyenv/pyenv-update.git $(pyenv root)/plugins/pyenv-update
```

後は以下のコマンドを叩くだけ。超簡単です:grinning:

```bash
pyenv update
```

Macでhomebrew使っている場合は以下のコマンド。

```terminal
brew upgrade pyenv
```

## その他4 : pyenvでアンインストール
pyenvで管理しているpythonバージョンをアンインストールする場合です。<version>の場所に"pyenv versions"で出てくるバージョン名を指定します。

```bash
pyenv uninstall <version>
```