pyenv は こちらで紹介した rbenv および こちらで紹介した plenv の python 版です。ただし pyenv には rbenv/plenv の bundler/carton が存在しません。代わりに pyenv には virtualenv が存在します。bundler/carton は、あるバージョンの ruby/perl に gem/cpanm でモジュールを直接インストールするのではなく、パッケージとして管理することによってプロジェクト毎に異なるバージョンのモジュールを使用できるようにします。このことを python の virtualenv では別の観点から実現しています。rbenv/plenv では同じバージョンの ruby/perl は一つしか存在できませんが pyenv では同じバージョンの python 環境を仮想的に複数存在させることで、プロジェクト間で同じバージョンの python を使用しつつモジュールは異なるバージョンを使用できるようにします。モジュールのインストール時には ruby/perl の gem/cpanm に相当する pip などを利用します。python モジュールのレポジトリは Python Package Index (PyPI) です。pip は PyPI から search, install 等を行います。発音は似ていますが Python 上の Python 実行環境 PyPy と区別します。
事前に必要なソフトウェアをインストールしておきます。例えば以下のようなものが必要になります。
sudo yum install gcc openssl-devel readline-devel bzip2-devel sqlite-devel patch
sudo apt install git build-essential libssl-dev libreadline-dev zlib1g-dev libbz2-dev libsqlite3-dev python-tk tk-dev
自分だけに有効な pyenv を用意したい場合、管理者権限がなくてもホームディレクトリ以下にインストールできます。
pyenv および pyenv-virtualenv プラグインをダウンロードします。pyenv-virtualenv は pyenv でインストールした各バージョンの python に対して virtualenv を自動でインストールするためのプラグインです。
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
~/.bashrc
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
exec $SHELL
システム全体にインストールすることで、個別にユーザそれぞれに対してインストールする手間が省けます。
sudo git clone https://github.com/yyuu/pyenv.git /usr/local/pyenv
sudo git clone https://github.com/yyuu/pyenv-virtualenv.git /usr/local/pyenv/plugins/pyenv-virtualenv
sudo mkdir /usr/local/pyenv/shims
sudo mkdir /usr/local/pyenv/versions
/etc/profile.d/pyenv.sh
export PYENV_ROOT=/usr/local/pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
exec $SHELL
選択可能なバージョンを調査してインストールします。pyenv をシステムインストールした場合は root で作業します。新しいバージョンの python や pip によって実行可能なファイルをインストールした場合は rehash を実行する必要があります。
pyenv install -l
pyenv install 2.7.10
pyenv rehash
2.7.10 のバージョンの python 環境が新設されました。該当の python に対する初回実行時には pyenv-virtualenv プラグインによって virtualenv が自動でインストールされます。その際、該当バージョンの python にインストールされている pip が利用されます。事前に pip のバージョンを最新にしておきましょう。
pyenv shell 2.7.10
pyenv exec pip install --upgrade pip
virtualenv 環境の作成
$ pyenv virtualenv 2.7.10 my-virtualenv-2.7.10
$ ls $PYENV_ROOT/versions/
2.7.10 my-virtualenv-2.7.10
作成されたことを確認してみます。
$ pyenv virtualenvs
my-virtualenv-2.7.10 (created from /home/vagrant/.pyenv/versions/2.7.10)
virtualenv 環境は該当バージョンの python の複製として同等の扱いを受けるため pyenv コマンドの versions でも確認できます。
$ pyenv versions
system
* 2.7.10 (set by PYENV_VERSION environment variable)
my-virtualenv-2.7.10
python バージョンまたは python バージョンの複製である virtualenv 環境は同じコマンドで削除できます。
pyenv uninstall my-virtualenv-2.7.10
pyenv uninstall 2.7.10
システム全体
pyenv global my-virtualenv-2.7.10
カレントディレクトリのみ
$ pyenv local my-virtualenv-2.7.10
$ cat .python-version
my-virtualenv-2.7.10
現在のシェルのみ
pyenv shell my-virtualenv-2.7.10
(my-virtualenv-2.7.10)[vagrant@localhost ~]$ pyenv which pip
/home/vagrant/.pyenv/versions/my-virtualenv-2.7.10/bin/pip
Python Django と比較して小型の Web フレームワーク Flask を動かしてみます。
mkdir flask-app
cd flask-app
pyenv virtualenv 2.7.10 flask-app-2.7.10
pyenv local flask-app-2.7.10
pyenv exec pip install Flask
hello.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
動作検証
(flask-app-2.7.10)[vagrant@localhost flask-app]$ python hello.py
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
別ターミナル
$ curl http://localhost:5000/
Hello World!