macOSにanyenv + pyenv + poetryでPythonの実行環境をつくる

これまでちょっとしたスクリプトが必要なときはRubyで書いていたけれど、なんとなくPythonでも書けるようになってみたいな〜と漠然と思い、本を買って読んでみた。画像を生成したり、OSのGUIもスクリプトで操作できるんだ〜。おもしろそう、ということで、まずはmacOSでPythonを実行する環境を整えてみることにしました。

Rubyはanyenvでrbenvをインストールしたうえでバージョンを管理していたので、Pythonも同様になんちゃらenvがあるのかなあと思って調べたら、venv、virtualenv、pipenv、pyenv… などがあり、ちょっと複雑。venvはPython 3.3から標準で提供されているPythonの仮想環境を作成するためのモジュール、virtualenvはvenvが標準で提供される前から存在していたツールでPython 3.3以前でも利用できる、pipenvは仮想環境管理とパッケージ管理を統合したツールでPipfileやPipfile.lockを用いて依存関係を管理できる、pyenvはPythonのバージョンを管理するためのツール、という理解をしました。

しばらく調べた結果、2023年7月現在はanyenvを使ってpyenvをインストールし、pyenvでインストールしたPythonを使ってvenvで仮想環境を作成するのが良い…?という結論になった。とはいえ、ちょっとPythonで遊んでみたいな、くらいの目的としては複数のバージョンをがっつり切り替える必要もなく、まあ動けばいいかということでvenvは必要になったら導入しようかな。

ここではanyenvでPythonをインストールした手順を残しておきます。なお、手元のmacOSのバージョンは13.4.1で、シェルはZshを使ってます。anyenvのインストールは割愛…

$ anyenv update
$ anyenv install --list
$ exec $SHELL -l
$ anyenv install pyenv
$ pyenv install --list
$ pyenv install 3.11.4 #記事公開時の最新バージョンです
$ pyenv global 3.11.4
$ pyenv versions

これでPythonの3.11.4をインストールできました🎉

Pythonにはpipというパッケージ管理ツールがあるものの、依存関係を管理しやすくなったpoetryというツールがあるようで、あわせてインストールしておきます。RubyでいうところのBundler、JavaScriptでいうところのnpmのようなもので、GemfileやGemfile.lock、package.jsonやpackage-lock.jsonにあたるのがpyproject.tomlとpoetry.lockとのこと(理解が間違っていたらすみません…)。

$ curl -sSL https://install.python-poetry.org | python3 -
# .zshrc に `export PATH=$HOME/.local/bin:$PATH` を追記
$ exec $SHELL -l
$ poetry --version
$ poetry self update
$ poetry config virtualenvs.in-project true 
$ poetry config --list

Pythonを実行するときは、RubyでBundlerを使うときのbundle execよろしく poetry run をつける。

$ poetry init -n
$ poetry run python main.py

そんな感じで〜す!