pyenv は rbenv の 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
基本的なコマンド
python インストール
選択可能なバージョンを調査してインストールします。pyenv をシステムインストールした場合は root で作業します。新しいバージョンの python や pip によって実行可能なファイルをインストールした場合は rehash を実行する必要があります。
pyenv install -l
pyenv install 2.7.10
pyenv rehash
virtualenv 環境の作成
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 / virtualenv 環境)
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
Flask アプリケーションの例
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!
virtualenv 環境を保存
開発時と同じバージョンのモジュールで構成された virtualenv 環境を他の開発環境やデプロイ環境に構築するためには pip freeze および wheel を利用します。それぞれ ruby/perl の Gemfile.lock/cpanfile.snapshot および bundle package/carton bundle のようなものです。インストールされていない場合は wheel を事前にインストールしておきます。
pyenv exec pip install wheel
pip freeze によるモジュール一覧とバージョン情報の出力
$ pyenv exec pip freeze > requirements.txt
$ cat requirements.txt
Flask==0.10.1
itsdangerous==0.24
Jinja2==2.7.3
MarkupSafe==0.23
Werkzeug==0.10.4
wheel==0.24.0
wheel によるモジュールのキャッシュ作成
$ pyenv exec pip wheel --wheel-dir=/tmp/wheelhouse -r requirements.txt
$ ls /tmp/wheelhouse/
Flask-0.10.1-py2-none-any.whl Jinja2-2.7.3-py2-none-any.whl
itsdangerous-0.24-py2-none-any.whl MarkupSafe-0.23-cp27-none-linux_x86_64.whl
wheel-0.24.0-py2.py3-none-any.whl Werkzeug-0.10.4-py2.py3-none-any.whl
別の virtualenv を作成して同じ構成で再構築
$ pyenv virtualenv 2.7.10 flask-app-2.7.10-copy
$ pyenv shell flask-app-2.7.10-copy
$ pyenv exec pip install -r requirements.txt --use-wheel --no-index --find-links=/tmp/wheelhouse
$ pyenv exec pip list
Flask (0.10.1)
itsdangerous (0.24)
Jinja2 (2.7.3)
MarkupSafe (0.23)
pip (7.0.3)
setuptools (17.0)
Werkzeug (0.10.4)
wheel (0.24.0)
- --no-index → Ignore package index (only looking at --find-links URLs instead).
- --find-links → Look for archives in the directory listing.
関連記事
- Python コードスニペット (条件分岐)if-elif-else sample.py #!/usr/bin/python # -*- coding: utf-8 -*- # コメント内であっても、ASCII外の文字が含まれる場合はエンコーディング情報が必須 x = 1 # 一行スタイル if x==0: print 'a' # 参考: and,or,notが使用可能 (&&,||はエラー) elif x==1: p...
- Python コードスニペット (リスト、タプル、ディクショナリ)リスト range 「0から10まで」といった範囲をリスト形式で生成します。 sample.py print range(10) # for(int i=0; i<10; ++i) ← C言語などのfor文と比較 print range(5,10) # for(int i=5; i<10; ++i) print range(5,10,2) # for(int i=5; i<10;...
- ZeroMQ (zmq) の Python サンプルコードZeroMQ を Python から利用する場合のサンプルコードを記載します。 Fixing the World To fix the world, we needed to do two things. One, to solve the general problem of "how to connect any code to any code, anywhere". Two, to wra...
- Matplotlib/SciPy/pandas/NumPy サンプルコードPython で数学的なことを試すときに利用される Matplotlib/SciPy/pandas/NumPy についてサンプルコードを記載します。 Matplotlib SciPy pandas [NumPy](https://www.numpy
- pytest の基本的な使い方pytest の基本的な使い方を記載します。 適宜参照するための公式ドキュメントページ Full pytest documentation API Reference インストール 適当なパッケージ