Pyenvとpipenvのインストールを依存するPythonバージョンから考えてみた[簡易フローチャート付き]

Pyenvとpipenvの依存環境とPythonバージョンの関係について、振り返りつつ備忘録としてまとめました。また、「ではどれを選択すべきか」という点で簡潔ながらフローも描いてみました。
2021.06.09

Pythonを初めて使う人や、複数人によるチームでPythonを使う際の検討事案として、Pyenvとpipenvの導入ルートがあります。結果として正常に動いていればいいのですが、複数プロジェクトを抱えている場合にプロジェクト毎に使うPythonのバージョンが異なったり、アップデートで更新が必要となるのはよくあることです。

セットアップ手段での依存バージョンがまとまっている記事は案外見つからず、依存関係のトラブル解決の糸口として記録に残しておくのもありだと考えました。

大元のインストールソースとそれぞれメリットとデメリットを挙げてみました。また、今回の記事はPyenv + pipenvの組み合わせを前提とします。いずれかのパッケージ利用が欠けている状態を想定していません。

インストールソース

日頃あまり気にしていないかもしれません。Pyenvとpipenv自体の動作に問題があるなら、インストール元も注意すべきです。以下、文中にあるoriginalはPyenv、pipenvそれぞれのパブリックリポジトリを指します。

Pyenvのインストールソース

大きく分けて2つ。

  • Pypi,
  • GitHub(original, HomeBrew, anyenv)

HomeBrewをGitHubの括弧付けとしている理由は、FormulaGitHub上のリポジトリをソースとしているためです。anyenvについてもFormulaを辿った先はGitHubです。

pipenvのインストールソース

  • Pypi
  • GitHub(HomeBrew)

念の為書いておきますが、pipenvをanyenvで直インストールはできません。

インストールソースの選択

PyenvはリポジトリのREADMEにあるインストール手順の通り、HomeBrewかGitHubのcloneを選択すべきです。というのも、Pypiを用いる場合は言語構成率1.8%とはいえど実行したpipのあるPythonのディレクトリ構成に依存することとなります。

  • HomeBrew
brew install pyenv
  • GitHub
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zprofile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zprofile
echo 'eval "$(pyenv init --path)"' >> ~/.zprofile
echo 'eval "$(pyenv init -)"' >> ~/.zshrc

pipenvはプロジェクト毎及びリモート環境への導入にはpip installを使っておくのが安牌でしょう。フローがシンプルになり、GitHubの障害に巻き込まれにくくなります。勿論、Pypiが障害に遭う可能性もありますが、そこまで気にするなら固定のtarballによるインストールにすべきです。

pip install pipenv

ローカルでのインストール時には、HomeBrewが独自に仮想環境を構成する点でもシステム全体用としてはHomeBrewもありかと思います。

brew install pipenv

依存するPythonのバージョン

Pyenvとpipenvを利用するに当たって、気をつけておくべきはそれぞれを導入するPythonのバージョンです。Pyenvにて仮想環境のバージョンは切り替えられますが、Pyenvとpipenv自体の動作はPyenvを導入した時のPythonバージョンに縛られます。

前提として、EOLを過ぎているバージョンに依存すべきでありません。以下、EndOfLifeに2021年6月9日時点で掲載されているPythonのEOLです。

基本は3.7以降でしょう。

次に、Pyenvとpipenvの依存するバージョン指定を見ていきます。

Pyenv

  • Pypi
  • GitHub(original, anyenv, HomeBrew)

HomeBrewの場合はインストール先がHomeBrew用ディレクトリ以下となりますが、通されるPATHを除いてoriginalやanyenvと変わり有りません。

Pypi経由の場合、インストールの過程で権限変更が行われた場合にOSXのシステムでPythonに依存している機能に影響が及ぶ可能性があり、お勧めはしません。

リポジトリが公式としている手続きを取る限りは、システムのバージョンをベースとします。ただし、システムディレクトリではなくユーザディレクトリ内へコピーする形となるためにシステム上の権限変更は発生せず、OSへの影響は心配なくなります。

pipenv

  • Pypi
  • GitHub(original, anyenv, HomeBrew)

HomeBrewはソースこそGitHubリポジトリを元にしていますが、Python環境自体はHomeBrew内で独自に構成した仮想環境を元にし、依存するPythonバージョンもFormula内に固定記述されます。このバージョン指定はPython最新版がリリースされた後に更新されています。python3.9の場合、リリースは2020年10月05日で、Formula内の3.9への依存更新は2020年10月9日でした。

depends_on "python@3.9"

導入時には、システム全体とプロジェクト各位で使い分けるべきでしょう。

システム全体への導入時には、Pyenvで導入後にpyenv global指定にした環境へインストールするか、HomeBrew経由でPyenvで導入した仮想環境に入れる形となるはずです。

インストールソース選択フローチャート

あくまで目安ですが、ローカル環境全体の構成かどうか、HomeBrewを導入しているかどうかで変わってきます。

あとがき

インストールソース別に実際のリソースをどうやって取得しているかも合わせて確認してみました。今後同様のライブラリが出てきた場合には違ってくるかもしれませんが、Python環境設定の参考になれば幸いです。