pyenvの仕組みについて調べてみた
過去の記事でPythonバージョン管理ツール「pyenv」をインストールしましたが、どうやってバージョン情報を保持しているのか気になったので調べてみました。
インストール方法
過去の記事
「Ubuntu18.04環境にPython(pyenv)をインストールして動かしてみる」
で紹介させていただきましたので、是非ご覧になってください。
pyenvコマンドの場所
以下のコマンドで参照可能です。
$ which pyenv
pyenvインストール時のやり方によって差はあるかもしれないですが、前回の方法のとおりにパスを渡していれば、
~/.pyenv/bin/pyenv
が呼び出されるようです。
pyenv実行ファイルは、「git clone」でダウンロードしてきたpyenvプロジェクト直下のbinディレクトリにあります。
pyenv globalについて
説明
全ディレクトリに指定のPythonバージョンを適用するコマンド。
また、すでに「pyenv global」コマンドを適用している場合、再実行すると指定したPythonバージョンに切り替えることになります。
バージョンの記録場所
どのバージョンを使うかは「$HOME/.pyenv/version」ファイルに記述して記憶しています。
pyenv localについて
説明
このコマンドを実行したディレクトリ以下すべてに指定のPythonバージョンを適用するコマンド。
また「pyenv global」と同様、すでに現ディレクトリにコマンドを適用している場合、再実行すると指定したPythonバージョンに切り替えることになります。
バージョンの記録場所
バージョン情報はpyenv localコマンドを実行したディレクトリに「.python-version」ファイルとして記述され、管理されています。
※globalや上位階層の「.python-version」より、より深い階層の「.python-version」が優先されるようです。
(より具体的に言うと、下層 -> 上層順に探索され、「$HOME/.pyenv/version」ファイルの情報もない場合、システムのPython, pipが呼び出されるようです)
pyenvのインタプリタ呼び出しファイル(shims)の場所
現在パス指定なしで実行できるPythonの場所を
$ which python
で調べてみると、
~/.pyenv/shims/python
が参照先になっているようです。
pyenv installでインストールしてきた本体の場所
$ pyenv which python
で調べることができ、
~/.pyenv/versions/バージョン番号/bin/python
に配置されていることが確認できます。
pyenvの動きの仕組み
pyenvをインストールしたとき~/.plaintext_aliasesに記述したコマンド
eval "$(pyenv init -)"
によって、shims等のpyenvの仕組みを有効化してくれるようです。
pyenvのインストール時、~/.plaintext_aliasesに
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
と記述し、このときは「~/.pyenv/shims」を明示的にパスに渡していませんでしたが、3行目の「eval $(pyenv init -)」によってパスを有効化してくれます。
※「~/.pyenv/shims」にパスが有効になっているどうかは、
echo $PATH
コマンドで確認できます。
python, pip等の実行を要求されると、「~.pyenv/shims」配下の同名コマンド(shimコマンド)経由でpyenvにコマンドが渡されます。
続いて、pyenvが現在の作業ディレクトリに配置されている「.python-version」ファイルに記載されたバージョンに対応したPythonインタプリタを「~/.pyenv/versions/」以下から探索し、実行するようです。
pyenv自体のアンインストール方法
以下の2つの手順を実行していきます。
- Pythonバージョンの管理を行うpyenvを無効にするため、シェルのスタートアップ構成から
eval "$(pyenv init -)"
の行を削除する。
※これにより、$PATHからpyenvのshimsディレクトリが削除され、python, pipなどを今後の呼び出す際、pyenvインストール以前と同様に、システムのPythonバージョンが実行されるようになります。
- pyenvを完全にアンインストールするには、1を実行してから、pyenvのルートディレクトリを削除する必要があります。
※この操作で、「$(pyenv root)/versions」ディレクトリにインストールされていたすべてのPythonバージョンを削除することができます。
$ rm -rf $(pyenv root)
参考: pyenv(GitHub)
今回はここまでにしようと思います。
では、また会いましょう!