Python3の環境構築

#はじめに

初学者が書いていますので、誤っている箇所などあればご指摘願います。

###前提
・macOS Catalina
・`pyenv`と`pyenv-virtualenv`を使用して環境構築する
・`zsh`使用

###参考記事
[pyenv と pyenv-virtualenv で環境構築
](https://qiita.com/Kodaira_/items/feadfef9add468e3a85b)[pyenvとpyenv-virtualenvの自分流使い方](https://qiita.com/ksato9700/items/5d9eba10fe6b8e064178)
[pyenv、pyenv-virtualenv、venv、Anaconda、Pipenv。私はPipenvを使う。](https://qiita.com/KRiver1/items/c1788e616b77a9bad4dd)
[pyenv-virtualenvを使って都合のいいように Pythonパッケージ環境を行き来する話](https://ensekitt.hatenablog.com/entry/2018/03/13/200000)



#pyenv
###pyenvとは
Pythonのバージョンを複数インストールすることができ、バージョンを切り替えて使えるようになります。

https://github.com/pyenv/pyenv

###pyenvのインストール
ホーム画面で下記コマンドを実行します。

```
% git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```
 
※`git clone`ではなく`brew install`する方法もありますが、その場合は下記の`.zshrc`に記載する内容が異なります。詳しくはpyenvのgithubをご覧下さい。

`.zshrc`というファイルを編集するため、コマンドでファイルを開きます。
(`zsh`ではなく`bash`を使用されている方は編集ファイルが異なります。)

※公式のgithubだと`.zshrc`ではなく`.zprofile`を編集していますので、`.zprofile`の方がいいかもしれません。

```
% vi .zshrc
```

ファイルに下記をそのままコピペします。

```zsh:.zshrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
```
↑HOMEとか編集する必要はありません。

シェルへ再ログインします。

```
% exec $SHELL
```

下記コマンドを実行すると、インストールできるversionがたくさん出てきます。
今回は3.9.6を使用します。

```
% pyenv install --list
　　　　~省略~
  3.9.1
  3.9.2
  3.9.3
  3.9.4
  3.9.5
  3.9.6
  3.10.0b4
  3.10-dev
  3.11-dev
  activepython-2.7.14
  activepython-3.5.4
  activepython-3.6.0
  anaconda-1.4.0
　　　　~省略~
```

下記コマンドでインストールします。

```
% pyenv install 3.9.6
```

```
% pyenv versions
* system (set by /Users/YOUR_NAME/.pyenv/version)
  3.9.6
```
3.9.6のインストールができたので、`pyenv global`コマンドで`system`から`3.9.6`へ切り替えます。
※特定ディレクトリ以下のバージョンを変えたい場合は、`global`ではなく`local`コマンドを使います。(競合した場合、`global`より`local`が優先されます。)

```
% pyenv global 3.9.6
```

もう一回確認します。

```
% pyenv versions
  system
* 3.9.6 (set by /Users/YOUR_NAME/.pyenv/version)
```
切り替えができてます！

```
% python --version
```
上記コマンドでも確認します。

```
Python 3.9.6
```

問題なさそうです！
もし、デフォルトで入ってるバージョン(2.X.X)が表示されてしまった場合は、`pyenv`の環境がうまくいかなかったか、シェルの読み込みに失敗している可能性があります。


#pyenv-virtualenv
###pyenv-virtualenvとは
`pyenv`のプラグインで、`pyenv`上で`virtualenv`を使えます。
Pythonのバージョンが同じでも違う環境を作成することができます。

※`virtualenv`とは違います。
`virtualenv`の場合、`activate`しないと環境が切り替わりません。

https://github.com/pyenv/pyenv-virtualenv

###pyenv-virtualenvのインストール


```
% git clone https://github.com/pyenv/pyenv-virtualenv.git ~/plugins/pyenv-virtualenv
```
※`git clone`ではなく`brew install`する方法もあります。

`.zshrc`に下記を記載します。

```
% vi .zshrc
```

```zsh:.zshrc
eval "$(pyenv virtualenv-init -)"
```

```
% exec $SHELL
```


###新しいPython環境の作成
`pyenv virtualenv <VERSION> <NAME>`とコマンドを打つことで、NAMEという新しい環境を作成できます。
今回はversion3.9.6のみインストールしているので、3.9.6の新しい環境をsampleという名前で作ります。

```
% pyenv virtualenv 3.9.6 sample
```
上記コマンドで、
`3.9.6/envs/sample`と`sample`の二つの環境?ができますが、pyenv-virtualenvのgithubを見ると、sampleの方を使うようですね。

新しい環境(sample)で作業をしていきたいので、下記コマンドを実行します。

```
% pyenv local sample
```
```
% pyenv versions
  system
  3.9.6
  3.9.6/envs/sample
* sample (set by /Users/YOUR_NAME/.python-version)
```


#pip

切り替えが完了したので、必要なライブラリ等をpipコマンドでインストールしていきましょう！

さっそくDjangoをインストールしてみます。

```
% pip install django
```

インストールができました！
ちなみに、`pip list`でインストールしたものを確認できます。

#pyenv global X.X.Xをしても何も変わらない時
上記作業が終わって、`pyenv global X.X.X`をしたのですが、実行されませんでした。
過去に同じディレクトリ内でPythonの環境を設定してしまうと`.python-version`というファイルが出来てしまうようです。

```
% rm ~/.python-version
```

上記コマンドを実行してファイルを削除することで、`pyenv global X.X.X`ができました！


#最後に
この記事をまとめ始めてから、`pyenv-virtualenv`と`virtualenv`は違うものだということが分かりました。
アウトプット大事ですね。

また今後の課題として、`venv`と`pipenv`が何なのかを理解できるようになりたいなと思っています。今は正直よく分かってないです。
Python3.3以降は`venv`が標準化されていて、`virtualenv`は使う必要がなくなったというのは理解しました。
[pyenv、pyenv-virtualenv、venv、Anaconda、Pipenv。私はPipenvを使う。
](https://qiita.com/KRiver1/items/c1788e616b77a9bad4dd)

2021/8/11
@Msksgm さんからコメントをいただき、大幅に修正させていただきました！
コメントありがとうございました！