pyenv および virtualenv の使い方
[履歴] [最終更新] (2015/09/02 08:07:28)
1
作品
364
技術情報
最近の投稿
ここは
趣味の電子工作を楽しむ人のためのハードウェア情報共有サイト

技術情報や作品の投稿機能、リアルタイム遠隔操作 API をご利用いただけます。
新着作品

概要

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

ホームディレクトリ以下にインストール

自分だけに有効な 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.
関連ページ
    概要 WSGI (Web Server Gateway Interface) は PSGI に影響を与えた python の標準化された Web インターフェースです。 Apache + mod_wsgi uwsgi WSGI の実装としては上記二つの選択肢があります。前者は Apache に依存しており更新も活発ではないため、後者の uwsgi を利用します。