M1 Macにpyenv+Poetryをインストールする

これまで Anaconda をずっと使ってきましたが,実行環境を他に移すときにトラブることが多いようです.その原因はパッケージのバージョン違いにあるようで,手動で解決すればまあいいわけですが,そこに時間を取られるのも残念.

というわけで,M1 搭載 Mac Mini の新環境に移るタイミングでなんか良さそうな Poetry を使ってみることにしました.

使い分け

Python 環境構築にあたって,二種類のパッケージを使用します.

  • pyenv: Python 仮想環境管理
  • poetry: パッケージ管理

Anaconda 仮想環境は上記の二つを一つにまとめたようなものでしたが,Poetry は調べた感じでは Python のバージョンは管理できないようなので,pyenv を併用します.

以下,インストールは Rosetta2 を経由せずに行います.

pyenv インストール

terminal
$ brew update
$ brew install pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc

パスを通し忘れずに.

terminal
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zshrc

Python インストール

pyenv で Python をインストールします.

terminal
// show the list of installable versions
$ pyenv install --list
$ pyenv install 3.9.1

Python 3.9.1 は macOS Big Sur に対応した初のバージョンだそうです (Python Release Python 3.9.1 | Python.org).これ以降のバージョンは Universal 2 バイナリ対応,すなわち Apple Silicon に対応したものになります.

逆に,それ以前のバージョンは Rosetta2 で動かすことになります.知らずに homebrew でインストールしようとしたら以下のエラーが出ました.

Unexpected output of 'arch' on OSX

Poetry インストール

terminal
$ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -

インストールすると自動的にパスに追加されました.追加されていなければ要編集です.

.zshrc
export PATH="$HOME/.poetry/bin"

Poetry のプロジェクト管理

Anaconda は仮想環境単位での管理でしたが,Poetry はプロジェクト単位での管理になります.Node.js の package.json が Poetry の pyproject.toml になった感じです.

terminal
$ mkdir myproject
$ pyenv local 3.9.1
$ pyenv install

そもそも pyenv では global は全体設定,local は特定のディレクトリ内でのバージョン設定となっており,設定していれば local が優先されます.

Poetry ではプロジェクトディレクトリを開いて local コマンドでプロジェクトごとに Python バージョンを指定するのが良いようです.

参考:Managing environments | Documentation | Poetry