mac python3環境構築についての個人的備忘録

参考:

- [pyenvとpyenv-virtualenvの自分流使い方](https://qiita.com/ksato9700/items/5d9eba10fe6b8e064178)
- [Pythonにまつわるツールのまとめ](https://qiita.com/Aruneko/items/c63ed3f5770569fb5e11)
- [2021個人的に最強だと思うPythonの環境構築](https://zenn.dev/unemployed/articles/cc111706c3167c)
- [github.com/pyenv/pyenv](https://github.com/pyenv/pyenv#basic-github-checkout)

## 知っておくと良い前提知識

- Python3.5まではpyvenvコマンドで作成していましたが、このコマンド自体がどこのPython環境下で動いているかを明確にするためにpyvenvコマンドは廃止予定となり、以降はpython -m venvコマンドを使うことが推奨されています。
- 特別な理由がないのに安易にAnacondaを利用すること
    - pipとの共存が難しいため
    - たいていの場合Anacondaを利用する必要は無いはず
- 環境構築の仕方としては仮装環境それぞれに独立したPythonをインストールして、そこに同梱されているpipを通してライブラリをインストールする。
    - ライブラリ等も環境ごとにきっちり別ける事が出来る
- pyenvでエラーなくインストールできるのは3.7.8から

![スクリーンショット 2022-01-03 19.54.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363815/dc1908b5-e270-8270-5df6-1bc23972a370.png)


## 理解できていないこと

- macOS
    - brew の python3と pyenv python3の共存は問題ないのか


## インストール

```zsh:
brew update
brew install pyenv
```

### 設定

- For Zsh:(zshを使用している人はこっち)
    - MacOS, if Pyenv is installed with Homebrew: 

```zsh:Homebrewの人はこっち
echo 'eval "$(pyenv init --path)"' >> ~/.zprofile
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
# Make sure that your terminal app runs the shell as a login shell.  
```

- 
    - MacOS, if Pyenv is installed with a Git checkout:

```zsh:Githubからの人はこっち
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zprofile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zprofile
echo 'eval "$(pyenv init --path)"' >> ~/.zprofile 

echo 'eval "$(pyenv init -)"' >> ~/.zshrc
#Make sure that your terminal app runs the shell as a login shell.
```  

全ての動作をまとめて実行してくれているpyenv公式スクリプト

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

- For Fish shell:(Fishを使用している人はこっち)

Execute this interactively:
```bash:シェルで実行
set -Ux PYENV_ROOT $HOME/.pyenv
set -U fish_user_paths $PYENV_ROOT/bin $fish_user_paths
```
And add this to ~/.config/fish/config.fish:

```bash:~/.config/fish/config.fishに追記
# pyenv
status is-login; and pyenv init --path | source
status is-interactive; and pyenv init - | source
```

# 使用方法

```zsh:
#インストールできるpython-list
pyenv install --list

#インストールバージョンを指定しインストール
pyenv install <python-version>

#インストールされているpythonのバージョン確認
pyenv versions

#グローバル設定
pyenv global <python-version>
#ローカル設定
pyenv local <python-version>
```


```zsh:具体的な使用例
#グローバルとローカル設定の分離
pyenv global 3.8.5
cd /Users/johndoe/projectX
pyenv local 3.6.9

cd /Users/johndoe/projectA
pyenv local projectA
# 削除
pyenv uninstall projectA

```

```zsh:仮想環境
# venv(仮想環境) を作成
python3 -m venv venv
# venv を有効化
source ./venv/bin/activate
# もしくわ
. ./venv/bin/activate
# venv内の pipをアップグレード
python3 -m pip install --upgrade pip
# モジュール の install 
pip install -r requirements.txt
# venv内で実行
python3 sample.py
```

## 詳細

参考:venv

- [venv 仮想環境の作成¶ バージョン 3.3で追加](https://docs.python.org/ja/3/library/venv.html)

仮想環境の作成が完了すれば、その仮想環境のバイナリディレクトリにあるスクリプトで "有効化" できます。 スクリプトの呼び出し方はプラットフォーム固有です ((./venv) の部分は、仮想環境があるディレクトリのパスに置き換える必要があります): 

プラットフォーム|シェル|仮想環境を有効化するためのコマンド|無効化
--|--|--|--
POSIX|bash/zsh| $ source (./venv)/bin/activate |$ deactivate
-- |fish|$ source (./venv)/bin/activate.fish|$ deactivate
-- |csh/tcsh|$ source (./venv)/bin/activate.csh|$ deactivate
-- |PowerShell Core|$ (./venv)/bin/Activate.ps1|$ deactivate
Windows|cmd.exe|C:\> (./venv)\Scripts\activate.bat|$ deactivate
-- |PowerShell|PS C:\> (./venv)\Scripts\Activate.ps1|$ deactivate


When a virtual environment is active, the VIRTUAL_ENV environment variable is set to the path of the virtual environment. This can be used to check if one is running inside a virtual environment.

環境を有効化するのに特別な指定は 必要 ありません; 有効化は仮想環境のバイナリディレクトリをパスの最初に加えて、 `python` で仮想環境の Python インタプリタが呼び出されるようにし、フルパスを入力せずにインストールされたスクリプトを実行できるようにするだけです。 しかし、インストールされたすべてのスクリプトは有効化しなくても実行可能で、仮想環境の Python で自動的に実行されなければなりません。

シェルで `deactivate` と入力することで仮想環境を無効化できます。 厳密な仕組みはプラットフォーム固有であり、内部の実装詳細です (たいていはスクリプトかシェル関数が使われます)。