M1 MacでpyenvとpoetryをインストールしてPython3.10.10環境を構築

みなさんこんにちは！

M1　MacにはデフォルトでPythonがインストールされていますが、Python本体のバージョンやパッケージを案件個別に管理したいケースが多く、デフォルトのPythonを利用した開発を行う人はあんまりいないと思います。

Pythonのパッケージ管理ツールとしてはPipenvとPoetryの2強だと思いますが、今回は最近勢いのあるPoetryでM1 MacのPython実行環境を構築する方法を紹介していきます。

それに付随して、Python自体のバージョン管理ツールとしてPyenvを併用していきます。


## homebrewのインストール

まずはPyenvをインストールしていきますが、最初にhomebrewをインストールする必要があります。

ターミナルを開き、以下のコマンドを実行するとインストールできます。

参考: https://brew.sh/

```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

インストールされたかどうかは以下のコマンドで確認できます。

```bash
% brew --version
Homebrew 4.0.5
Homebrew/homebrew-core (git revision 92a61f8a21a; last commit 2023-02-17)
Homebrew/homebrew-cask (git revision 2ae6e86efe; last commit 2023-02-16)
```

既にダウンロードされていた方はアップデートすることをお勧めします。

```bash
brew update && brew upgrade
```

## Pyenvのインストール

homebrewがインストールされていれば以下のコマンドでインストール可能です。

参考: https://github.com/pyenv/pyenv

```bash
brew install pyenv
```

インストールが完了した後はPathを通す必要があるので以下のコマンドを実行してください。
（M1のデフォルトのshellはzshなので、それを前提にしていますが、bashなどを利用している方は適宜読み替えてください。）

```bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
source ~/.zshrc
```

以下のようにバージョンが表示されればインストール完了です。

```bash
% pyenv --version
pyenv 2.3.14
```

バージョンが古いときは以下のようにしてPyenv自体をアップデートできます。

```bash
brew update && brew upgrade pyenv
```

## PyenvでPythonをインストール

インストールするpythonを確認し、インストールします。

```bash
pyenv install --list
pyenv install 3.10.10
```
使用するバージョンを決定します。
globalはマシン全体の設定で、localはそのディレクトリ（プロジェクト）内固有の設定になります。
とりあえずどっちも設定しておきましょう。

```bash
pyenv versions
pyenv global 3.10.10
pyenv local 3.10.10
```

`pyenv local`の設定を行うとフォルダ内に、`.python-version`というファイルができますが、これによってディレクトリ内で利用するPythonのバージョンを判定していますので、削除しないようにしてください。

設定がうまくいっていればpythonのバージョンが指定したものに変更されているのが確認できると思います。

```bash
% python --version
Python 3.10.10
```

## Poetryをインストールする

参考: https://python-poetry.org/docs/

以下のようにインストールを行います。

```bash
curl -sSL https://install.python-poetry.org | python -
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
```

正常にインストールされていれば以下のような表示がされます。

```bash
% poetry --version
Poetry (version 1.3.2)
```

Poetry自体は以下のコマンドでアップデートできます。

```bash
% poetry self update
Updating Poetry version ...

Using version ^1.4.0 for poetry
...

% poetry --version  
Poetry (version 1.4.0)
```

削除したい場合は以下のコマンドで削除できます。

```bash
curl -sSL https://install.python-poetry.org | python - --uninstall
```

Poetryを利用する目的として、「プロジェクトごとにパッケージを管理したい」という理由が大きいと思いますが、以下のコマンドを実行kすると、ディレクトリの中に.venvフォルダ、つまり仮想環境を作成できるので管理が楽になります。

```bash
poetry config virtualenvs.in-project true
```

## プロジェクトを作成する

必要なツールが揃ったので、Poetryでプロジェクトを作成してみましょう。

```bash
% poetry new poetry-demo
...

% ls -al .
total 8
drwxr-xr-x  6 hogehoge  staff   192B  3 13 18:02 poetry-demo/
```

`poetry-demo`ディレクトリが生成されているのを確認できると思います。
次にディレクトリに入って仮想環境を作成し、有効化してみましょう。

```bash
% cd poetry-demo/    
% poetry install
% poetry shell
% python -V
Python 3.9.16
```

おっと、Pythonのバージョンが3.9系になってしまっていますね。

`pyproject.toml`というファイルを覗くと以下のようになっていました。

```toml
[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = [""]
readme = "README.md"
packages = [{include = "poetry_demo"}]

[tool.poetry.dependencies]
python = "^3.9"


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
```

以下の箇所に注目すると、Pythonのバージョンが3.9以上であれば何でもOK！というふうに設定ファイルが定義されていることがわかります。

```toml
[tool.poetry.dependencies]
python = "^3.9"
```

これは以下のコマンドで対応可能です。
仮想環境の中で以下を実行してください。

```bash
% poetry env use 3.10.10 
% python -V
Python 3.10.10
```

求めているバージョンになりましたね！

ただし、このままでは他の人がプロジェクトを開始するときに同じく3.9系が利用されてしまう可能性があるので、`pyproject.toml`の記述は以下のように変更しておくことをお勧めします。

```toml
[tool.poetry.dependencies]
python = "^3.10"
```

また、`poetry.lock`も更新しておく必要があるため、実際の運用をする際には`.venv`ディレクトリを削除して再構築し直すのが望ましいでしょう。

```bash
% rm -rf .venv/
% pyenv local 3.10.10
% poetry env use 3.10.10
% poetry install
```

## 終わりに

以上が、M1 Macでpyenvとpoetryを使ってPythonの環境を構築する手順です。これで、複数のPythonバージョンを使い分けたり、プロジェクトごとに環境を分離したりすることができます。