Pyenvについて

pyenvそのもののについて理解したい。

GitHub - yyuu/pyenv: Simple Python version management

pyenv/README.md at master · yyuu/pyenv · GitHub

Authoring plugins · yyuu/pyenv Wiki · GitHub

以下ざっくりREADMEから抄訳。英語で詳細まで理解しようとするのは疲れる。


概要

  • rbenvのフォーク
  • ユーザーごと、ディレクトリごとにPythonのバージョンを設定できる。
  • Python自体に依存しないシェルスクリプト
  • 環境変数ごとPythonのバージョンを上書き
  • 同時に複数のPythonのバージョンからコマンドをサーチ。toxと使う時便利。
  • virtualenvを作ることもできます。あるいはpyenv-virtualenvで処理を自動化もできます。

どのように動作するか

  • PATHにshim実行ファイルを挿入することでPythonコマンドを横取りする。

PATHの理解

  • PATHは:で並べられたパスを左から右にサーチする。

Shimsの理解

  • PATHの前にshimsのパスを入れる。

Pythonのバージョンを選ぶ

  1. PYENV_VERSION環境変数使う。pyenv shellコマンドでセッション中の環境変数セットできる。
  2. アプリケーション固有のカレントディレクトリの「.python-version」ファイル。pyenv local コマンドで変更できる。
  3. ディレクトリをルートまで辿って、最初にあった「.python-version」ファイル。
  4. グローバルの~/.pyenv/versionファイル。pyenv globalコマンドで変更できる。グローバルのファイルないと"system"のPython使うとみなす。

NOTE: 複数のバージョンを同時に使える。toxのようなツールを使用すれば、Python2とPython3を並行して使える。

Pythonのインストール先

  • 一旦pyenvがアプリケーションが指定したpythonのバージョンを特定したら、コマンドを対応するPythonのインストール先にパスをする。
  • 各バージョンのPythonは~/.pyenv/versions以下に、それぞれのディレクトリにインストールされる。
  • pyenvに関して言えば、バージョン名がそのままディレクトリの名前になる。

インストール

MacならHomebrewで

$ brew update
$ brew install pyenv

アップグレードする場合は、upgrade を installの代わりに使う。

インストール後は、eval "$(pyenv init -)"をプロファイルに追加する必要が有る(それらを表示するには、brew info pyenvを使用する)。プロファイルには一度だけ追加する必要が有る。

下記の「ベーシックなGitHubチェックアウト」の手順4以降を実行する。(シェルを再起動して、パスを有効にする。)

自動インストーラ

GitHub - yyuu/pyenv-installer: This tool is used to install `pyenv` and friends.

ベーシックなGitHubチェックアウト

  1. チェックアウト、(インストール先は任意)
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
  1. 環境変数PYENV_ROOTをインストール先に定義して、pyenvコマンドラインユーティリティーにアクセスできるように$PYENV_ROOT/binを$PATHに追加。
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile

Zsh note: ~/.zshenv ファイルを変更。 Ubuntu note: ~/.bashrc ファイルを変更。

  1. shimsとオートコンプリーションを有効にするのに、pyenv initを使用するシェルに追加。初期化中にPATHに手を加えるので、eval "$(pyenv init -)"がシェルのコンフィグファイルの最後に置かれているか確認する。
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

Zsh note: ~/.zshenv ファイルを変更。 Ubuntu note: ~/.bashrc ファイルを変更。 General warning: BASH_ENV変数が.bashrcをさすように設定されているシステムがあります。そのようなシステムでは、だいたいにおいて上記のeval "$(pyenv init -)は.bashrcではなく.bash_profileにおくべきでしょう。そうしない場合、pyenvが無限ループになるような奇妙な振る舞いに遭遇するでしょう。 詳細はpyenv init getting into an infinite loop when invoked from bashrc · Issue #264 · yyuu/pyenv · GitHubを参照。

  1. パスの変更を反映させるためにシェルを再起動。これでpyenvが使える。
$ exec $SHELL
  1. $PYENV_ROOT/versionsにPythonの各バージョンをインストール。Python 2.7.8をインストールする場合。
$ pyenv install 2.7.8

アップグレード

上記の方法でpyenvをインストールした場合、アップグレードはgitでできる。

$ cd ~/.pyenv
$ git pull

特定のリリースにアップグレードするばあい、対応するtagをチェックアウトする。

$ cd ~/.pyenv
$ git fetch
$ git tag
v0.1.0
$ git checkout v0.1.0

アンインストール

pyenvはシンプルなので、一時的に無効にすることも、アンインストールも簡単。

  1. pyenvを無効にする場合、シェルの起動コンフィグから単にpyenv init行を削除する。これで、pyenv shimsのディレクトリをPATHから削除して、pyenv導入以前のようにpythonコマンドのような呼び出しはシステムのPythonのバージョンを実行する。 pyenv は command lineからアクセスできるが、Python apps はバージョン切り替えの影響を受けない。
  2. 完全にアンインストールする場合、手順1を実行した後、pyenvのルートディレクトリも削除する。これはpyenv root/versions/以下のすべてのPythonのバージョンを削除する。
`pyenv root`/versions/

パッケージマネージャーでインストールした場合、最後の手順として、pyenv packageを削除する。Homebrewの場合は、

brew uninstall pyenv

コマンドレファレンス

アドバンスド設定

このセクションはシェルのプロファイルのすべての行がすることを知る必要が有る場合以外はスキップしてください。

  1. shimsのパスを設定 pyenvが適切に動作するための唯一の設定。主導でやる場合、~/.pyenv/shims$PATHの先頭に追加。
  2. autocompletionをインストール 完全にオプションだけど極めて便利。~/.pyenv/completions/pyenv.bashをソーシングすることで、設定できる。Zshユーザーには~/.pyenv/completions/pyenv.zshもある。
  3. shimsをRehash 時々、shimファイルを再構築する必要が出てくるでしょう。これをinitでやることで、すべてが更新されている状態にします。いつでもpyenv rehashで主導で実行できます。
  4. sh dispatcherをインストール この部分もオプションだが、pyenv と pluginsに使用中のシェルで環境変数を変更できるようにする、pyenv shellのようなコマンドを使用できるようにして。sh dispatcherはcdを上書きしたり、シェルプロンプトをハックしたりするようなクレイジーなことは一切しないが、pyenvにシェルの機能ではなく実際のスクリプトであることが必要ななんらかの理由のために、これを安全にスキップすることができる。

実際何やっているか自分で見る場合は、pyenv init -を実行。

Pythonバージョンのアンインストール

時間が経つにつれ、~/.pyenv/versionsディレクトリにPythonバージョンがたまるでしょう。

古いPythonバージョンを削除するには、pyenv uninstallコマンドで削除プロセスを自動で行います。

もう一つの方法として、単純に削除したいバージョンのディレクトリをrm -rfを使用します。pyenv prefixコマンドで特定のバージョンのディレクトリを見つけることができます、例)pyenv prefix 2.6.8

コマンドレファレンス

参照 pyenv/COMMANDS.md at master · yyuu/pyenv · GitHub

環境変数

下記設定を利用して、pyenvがどのように動作するか変えられます。

名前 デフォルト 説明
PYENV_VERSION Pythonバージョンを指定する。pyenv/COMMANDS.md at master · yyuu/pyenv · GitHubも参照
PYENV_ROOT ~/.pyenv それぞれのPython versions と shimsが入るディレクトリを定義する。pyenv rootも参照
PYENV_DEBUG デバッグ情報を出力。Also as: pyenv --debug <subcommand>
PYENV_HOOK_PATH wiki参照(Authoring plugins · yyuu/pyenv Wiki · GitHub pyenv を引っ掛けるためにサーチされるコロン区切りのパスのリスト
PYENV_DIR $PWD .python-versionファイルのサーチを始めるディレクト