いますぐにPythonを始めたい人のためのモダンな環境構築手順

## はじめに
- Pythonの環境構築は選択肢がいろいろあって何がなんだかわからない
- Anacondaをインストールすれば速いが、いろいろデメリットもあり、Anacondaを使わずにプロジェクトごとにバージョン管理、パッケージ管理をしたい場合もある
- 特にPythonの場合、Google Colaboratoryや外部の学習教材など環境構築不要で始められる機会も多いぶん、いざ自分で環境構築しようとなると「・・・あれ？どうすればいいんだっけ？」となることも（私がそうなった）
- また、例えばパッケージ管理についても、以前は requirements.txt という、使用するパッケージ名とそのバージョンを列挙したファイルを作成して管理するような方法が取られていたが現在はレガシーなやり方とみなされている
- みたいな状況も勘案し、なるべく最近の動向も踏まえて環境を構築したい
    - 具体的には、最近アツいとされている poetry というパッケージマネージャを使う

## この記事の前提
- 対象は **Mac**。
- Python のバージョンマネージャとパッケージマネージャをインストールして、Pythonを用いた開発に着手できる環境を構築する。
- この記事では **anacondaは使わず** に環境構築する。
- 扱うもの（この記事でインストールすることになるもの）は以下。
    - Homebrew
    - anyenv
    - pyenv
    - poetry

## 環境
- macOS Catalina 10.15.3
- MacBookPro (16inch, 2019)

## 1. Homebrew のインストール
- [Homebrew の公式サイト](https://brew.sh/index_ja)に、「このスクリプトをターミナルに貼り付け実行して下さい。」と書いてあるのでコピーしてターミナルに貼り付け実行する。
<img width="839" alt="スクリーンショット 2020-03-02 19.05.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480820/dccbedfd-daf1-9ef8-2d7f-803a4e709f23.png">

## 2. anyenv のインストール
### anyenv とは ([GitHub へのリンク](https://github.com/anyenv/anyenv))
- 「○○env」と名のつくものたち（pyenvや、JavaScript（というかNode.js）で扱うnodenvなど。主に、プロジェクトごとに言語のバージョンを簡単に切り替えるために使ったりする）をまとめて管理する便利なやつ。
- のちのち別の言語でも開発してみるとなったときにも便利。

### anyenv インストール手順
1. 上でインストールした Homebrew を使う。ターミナル（私の場合zsh）で以下を実行。
    
    ```zsh:ターミナル
    $brew install anyenv
    ```

1. 続けて、ターミナルで以下を実行。

    ```zsh:ターミナル
    $anyenv init
    ```

1. そうすると、指示が出てくるのでそれにしたがって、 ~/.zshrc（bashの場合は~/.bashrc） に `eval "$(anyenv init -)"` と追記する。具体的には以下のとおり。

    ```zsh:ターミナル
    vi ~/.zshrc
    ```

    ```text:.zshrc（bashの場合は.bashrc）に追記
    eval "$(anyenv init -)"
    ```

1. ターミナルを再起動
1. ターミナルを再起動したタイミングでWarningが出てくるので、指示通りに以下を実行

    ```zsh:ターミナル
    $anyenv install --init
    ```


## pyenvのインストール
### pyenv とは ([GitHub へのリンク](https://github.com/pyenv/pyenv))
- Python のバージョン管理に使う。
- プロジェクトごとに Python のバージョンを簡単に切り替えることができる。

### pyenv インストール手順

1. 上でインストールした anyenv から pyenv をインストール。

    ```zsh:ターミナル
    $ anyenv install pyenv
    ```

1. ターミナルで以下を実行（起動中のシェル（`$SHELL`）をログインシェルから起動させるコマンド）

    ```zsh:ターミナル
    $ exec $SHELL -l
    ```

1.  続いて、ターミナルで以下を実行することで、インストール可能なPythonのバージョンのリスト（一覧）が出る。

    ```zsh:ターミナル
    $pyenv install -l
    ```

1. その後、インストールしたいバージョンを指定（以下の例では3.8.2）してターミナルで以下を実行。
    - 最新のバージョンなどは [Python の公式サイト](https://www.python.org/downloads/)から確認できる。

    ```zsh:ターミナル
    $pyenv install 3.8.2
    ```

1. 続いて、以下をターミナルで実行。

    ```zsh:ターミナル
    $pyenv rehash
    ```

1. 最後に、以下のコマンドをターミナルで実行することで、インストールしたバージョンの Python をどのプロジェクトでも使えるようになる。

    ```zsh:ターミナル
    $pyenv global 3.8.2
    ```

  * ちなみに、個別のプロジェクト（アプリ）でバージョンを切り替えたい場合は、まず、利用したいバージョンをインストール（`$pyenv install (バージョン番号)`してから、そのディレクトリ内で`$pyenv local (バージョン番号)`と打って実行することで、プロジェクトごとにバージョンを切り替えることができる。

## poetry のインストール
### [poetry](https://python-poetry.org/) とは
- 2018年から開発がスタートした Python の依存関係やパッケージのマネージャ
- JavaScript でいうところの npm や yarn のような感覚で扱える

### ターミナルで以下を実行し poetry をインストール
- [公式のGitHub](https://github.com/python-poetry/poetry#installation)に書いてあるとおりにインストールする

```zsh:ターミナル
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
```

### Pathを通す

```zsh:ターミナル
$ echo '$HOME/.poetry/bin:$PATH' >> ~/.zshrc（bashの場合は.bashrc）
$ source ~/.zshrc（bashの場合は.bashrc）
```

### ついでに
- 合わせて、以下を実行することで、仮想環境が各プロジェクト直下に作られるようになるのでとりあえずやっておく
- （ちなみに、デフォルトでは ~/Library/Caches/pypoetry/virtualenvs に仮想環境が作られる）

```zsh:ターミナル
$ poetry config settings.virtualenvs.in-project true
```

## プロジェクトを作る
- 以上でひとまず環境構築は完了したので、プロジェクトを作っていく

```zsh:ターミナル
$ mkdir my-project（ディレクトリ名はなんでもいい）
```

- 作ったディレクトリに移動 -> プロジェクトで使用する Python のバージョンを指定 -> `poetry init` を実行
- このとき（バージョンを指定するとき）、そのバージョンをあらかじめ`pyenv install 3.8.2`などのようにインストールしておく必要があることに注意

```zsh:ターミナル
$ cd my-project
$ pyenv local 3.8.2
$ poetry init
```

- `poetry init`すると、対話式で質問が表示され、それらの質問に答えていくとプロジェクトの設定が完了し `pyproject.toml` という設定ファイルが作られる。
- 設定が完了したら、 `poetry install` を行う。

```zsh:ターミナル
$ poetry install
```

- これで、（上記の対話式質問の中で必要なパッケージを指定していれば）指定したパッケージがインストールされる。
- 以上でひとまず完了。

### Python の実行のしかた
- 作成したディレクトリ（プロジェクト）の中で Python ファイルを作る。

```python:main.py
print('hello python world!')
```

- ディレクトリの中で、以下を実行

```zsh:ターミナル
$ poetry run python main.py
```

- これで Python ファイルが実行される。

```zsh:ターミナル（出力）
hello python world!
```

## Jupyter Notebook の使い方
- プロジェクト（ディレクトリ）内で、以下により jupyter をインストール

```zsh:ターミナル
$ poetry add jupyter
```

- 以下を実行すれば Jupyter Notebook が立ち上がる

```zsh:ターミナル
$ poetry run jupyter notebook
```

## 参考記事
1. [Poetryを使ったPythonパッケージ開発からPyPI公開まで](http://kk6.hateblo.jp/entry/2018/12/20/124151)
2. [https://qiita.com/yano404/items/85f21897e417f03236c9](https://qiita.com/yano404/items/85f21897e417f03236c9)
3. [Poetryのインストールと初期セットアップ](https://kitigai.hatenablog.com/entry/2019/10/10/003422)