モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

目次目次を開く/閉じる

pyenv および virtualenv の使い方

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2015/06/18
最終更新最終更新
2021/09/07
記事区分記事区分
一般公開

目次

    筋トレ始めました。バックエンドエンジニアです。

    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.
    Likeボタン(off)0
    詳細設定を開く/閉じる
    アカウント プロフィール画像

    筋トレ始めました。バックエンドエンジニアです。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    >>さらに詳しくステッカーを贈る
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      ログインする

      関連記事