Edited at

pyenvはどのようにバージョンを切り替えているのか?

More than 3 years have passed since last update.


はじめに

Pythonのバージョンを切り替える便利ツール、 pyenv 、意味もわからずに、 pyenv localつかっていたのですが、ふとpyenvのページを見るとどのように動くか丁寧に説明してあることに気づきました。こちらはその抄訳となります。

MITライセンスなので、許諾はいらないとおもっていますが、なにかあれば指摘ください。


pyenvの動作の仕組み

pyenvpythonのコマンドをシム実行ファイル( shim executables )で横取りして、どのPythonのバージョンで実行するかを決め、あなたのアプリケーションに正しいPythonのインストール環境を渡します。シム実行ファイルは PATH環境変数の仕組みを利用しています。


PATHについて理解する

pythonpipのようなコマンドを実行した場合、OSは一連のディレクトリから、その名前の

実行ファイルを探します。ディレクトリのリストはPATH環境変数で定義れていて、:(コロン)

で区切られたディレクトリのリストです。


  • PATH環境変数から pipの実行ファイルを探す

  • PATHの先頭にある ~/.pyenv/shimsディレクトリの pipを見つける

  • この pipを実行し、コマンドを pyenvに渡す


Pythonバージョンの選択

シムの実行時、pyenvはどの Pythonのバージョンを利用するか、以下の順番で確認をします。


  1. (定義されていれば)PYENV_VERSION環境変数。現在のシェルセッション中で、

    pyenv shellコマンドを用いることで、この環境変数を設定することができます。


  2. (もし存在すれば)カレントディレクトリ中にある . python-version ファイル。

    pyenv local コマンドでこの内容を変更できます。


  3. 親ディレクトリ中の . python-version ファイル。一つずつ、ルートまで遡ります。l


  4. グローバルな ~/.pyenv/version ファイル。 pyenv globalコマンドで変更できます。


  5. 上記が全てない場合は "system" Pythonが実行


注意: pyenv global 3.4.1 2.8.8のように複数のバージョンを一度に有効にできます。

これはtoxのような python2と3を並行して利用する場合に利用します。


Pythonのインストール場所

pyenvがバージョンを決定すると、コマンドを正しい Pythonのバージョンに渡します。

Pythonのバージョンは、~/.pyenv/versions の下にインストールされています。例えばこんな感じです。


  • ~/.pyenv/versions/2.7.6/

  • ~/.pyenv/versions/3.3.3/

  • ~/.pyenv/versions/pypy-2.2.1/


おわりに

pyenvの話でしたが、rbenvもほぼ同様の仕組みで動いています。次はpyenv と vritualenv、rbenv と bundlerを調べたいとおもいます。