M1 Macにpyenv+Poetryをインストールする
これまで Anaconda をずっと使ってきましたが,実行環境を他に移すときにトラブることが多いようです.その原因はパッケージのバージョン違いにあるようで,手動で解決すればまあいいわけですが,そこに時間を取られるのも残念.
というわけで,M1 搭載 Mac Mini の新環境に移るタイミングでなんか良さそうな Poetry を使ってみることにしました.
使い分け
Python 環境構築にあたって,二種類のパッケージを使用します.
- pyenv: Python 仮想環境管理
- poetry: パッケージ管理
Anaconda 仮想環境は上記の二つを一つにまとめたようなものでしたが,Poetry は調べた感じでは Python のバージョンは管理できないようなので,pyenv を併用します.
以下,インストールは Rosetta2 を経由せずに行います.
pyenv インストール
$ brew update
$ brew install pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
パスを通し忘れずに.
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.zshrc
Python インストール
pyenv で Python をインストールします.
// 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 インストール
$ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -
インストールすると自動的にパスに追加されました.追加されていなければ要編集です.
export PATH="$HOME/.poetry/bin"
Poetry のプロジェクト管理
Anaconda は仮想環境単位での管理でしたが,Poetry はプロジェクト単位での管理になります.Node.js の package.json が Poetry の pyproject.toml になった感じです.
$ mkdir myproject
$ pyenv local 3.9.1
$ pyenv install
そもそも pyenv では global
は全体設定,local
は特定のディレクトリ内でのバージョン設定となっており,設定していれば local
が優先されます.
Poetry ではプロジェクトディレクトリを開いて local
コマンドでプロジェクトごとに Python バージョンを指定するのが良いようです.