0utputab1e

pyenvの仕組みについて調べてみた

 2020-07-05
 

過去の記事で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つの手順を実行していきます。
 

  1. Pythonバージョンの管理を行うpyenvを無効にするため、シェルのスタートアップ構成から
eval "$(pyenv init -)"

の行を削除する。

※これにより、$PATHからpyenvのshimsディレクトリが削除され、python, pipなどを今後の呼び出す際、pyenvインストール以前と同様に、システムのPythonバージョンが実行されるようになります。

 

  1. pyenvを完全にアンインストールするには、1を実行してから、pyenvのルートディレクトリを削除する必要があります。

※この操作で、「$(pyenv root)/versions」ディレクトリにインストールされていたすべてのPythonバージョンを削除することができます。
 

$ rm -rf $(pyenv root)  

 
参考: pyenv(GitHub)

 
今回はここまでにしようと思います。

 
では、また会いましょう!

 

あわせて読みたい記事

>> Homeに戻る