pyenv と pyenv-virtualenv のサンプル


環境

# cat /etc/centos-release
CentOS Linux release 7.3.1611 (Core) 

# ansible --version
ansible 2.2.1.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides

インストール

インストールに必要なパッケージ

# yum install make gcc patch readline-devel zlib-devel openssl-devel bzip2-devel sqlite-devel git -y

ユーザ環境にインストール

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

$ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
$ git clone git://github.com/yyuu/pyenv-update.git ~/.pyenv/plugins/pyenv-update
$ pyenv rehash

ここでは、pyenv-virtualenvpyenv-updateプラグインをインストールしています。


pyenv のアップデート

$ pyenv update

pyenvで利用できるpythonのバージョン等を更新できます。 pyenv-updateが必要です。


python のインストール

# インストール可能なバージョン一覧
$ pyenv install -l

# python 3.6.0 をインストール
$ pyenv install 3.6.0

# pyenv で管理している python のバージョン一覧
$ pyenv versions
* system (set by /home/foobar/.pyenv/version)
  3.6.0

# 3.6.0 を規定の python として設定
$ pyenv global 3.6.0
$ pyenv versions
  system
* 3.6.0 (set by /home/foobar/.pyenv/version)

globalではなくlocalとすると、カレントディレクトリに対してpythonのバージョンが設定されます。


pyenv-virtualenv を利用

pyenv-virtualenvを利用すると、pyenv環境に仮想環境を構築できます。

# python 3.6.0 を利用して apps1 の環境を作成
$ pyenv virtualenv 3.6.0 apps1

# python 3.6.0 を利用して apps2 の環境を作成
$ pyenv virtualenv 3.6.0 apps2

$ pyenv versions
  system
* 3.6.0 (set by /home/foobar/.pyenv/version)
  3.6.0/envs/apps1
  3.6.0/envs/apps2
  apps1
  apps2

# apps1 を規定の環境として設定
$ pyenv global apps1
$ pyenv versions
  system
  3.6.0
  3.6.0/envs/apps1
  3.6.0/envs/apps2
* apps1 (set by /home/foobar/.pyenv/version)
  apps2

pyenv-virtualenvが必要です。


pyenv-virtualenv 環境で pip を利用

$ pip install requests
$ pip freeze -l
requests==2.13.0

pyenv-virtualenv で環境を変更

$ pyenv global apps2
$ pyenv versions
  system
  3.6.0
  3.6.0/envs/apps1
  3.6.0/envs/apps2
  apps1
* apps2 (set by /home/foobar/.pyenv/version)
$ pip freeze -l

一時的に他の環境を利用

$ pyenv shell apps1
$ pyenv versions
  system
  3.6.0
  3.6.0/envs/apps1
  3.6.0/envs/apps2
* apps1 (set by PYENV_VERSION environment variable)
  apps2
$ pip freeze -l
requests==2.13.0

# 環境変数
$ echo ${PYENV_VERSION}
apps1

# 環境変数を削除
$ unset PYENV_VERSION
$ pyenv versions
  system
  3.6.0
  3.6.0/envs/apps1
  3.6.0/envs/apps2
  apps1
* apps2 (set by /home/foobar/.pyenv/version)

virtualenv と pyenv-virtualenv

pyenv-virtualenvとは別にvirtualenvという仮想環境を構築する仕組みが存在します。

以降は、pyenv-virtualenvvirtualenvを利用した場合についての検証です。

$ pyenv global apps1

# virtualenv をインストール
$ pip install virtualenv

# virtualenv の環境 "apps1test" を作成
$ mdir test
$ cd test
$ virtualenv apps1test
$ source  appstest/bin/activate
(apps1test) $ pyenv versions
  system
  3.6.0
  3.6.0/envs/apps1
  3.6.0/envs/apps2
* apps1 (set by /home/foobar/.pyenv/version)
  apps2
(apps1test) $ pip freeze -l
appdirs==1.4.1
packaging==16.8
pyparsing==2.1.10
six==1.10.0

(apps1test) $ pip install tqdm
(apps1test) $ pip freeze -l
appdirs==1.4.1
packaging==16.8
pyparsing==2.1.10
six==1.10.0
tqdm==4.11.2
(apps1test) $ deactive

$ pip freeze -l
requests==2.13.0
virtualenv==15.1.0

上記の通り、python-virtualenvの環境においても、virtualenvの環境を作成すると、pyenv-virtualenvの影響を受けないことが確認できます。 ただし、pythonのバージョンはpyenvのバージョンです。