PyenvによるPython3.x環境構築(CentOS, Ubuntu)


## はじめに
pythonでアプリケーションを作ることになったのでデフォルトでOSに入っているpython2.x系でいいかなと思ったのだが、[Python 2 と Python 3 のどちらを使って開発すべき？](http://nyagao.hateblo.jp/entry/2014/03/25/210415)を読むともうPython3.xは安定しているとのことなので、pyenvでシステムワイドにPython3.xを利用できる環境を構築してみた。

はじめはpyenvだけの管理でいいかなと思ったが、各pythonのインストールは結構時間がかかり手軽に環境を削除再構築が出来なさそうなのでvirtualenvも導入した。

## 環境

* OS:CentOS 6.5, Ubuntu14.04


## Step1: 必要なパッケージのインストール

pythonのコンパイル時に必要なパッケージのインストール。

```package:CentOS
$ sudo yum install gcc bzip2 bzip2-devel openssl openssl-devel readline readline-devel
```

```package:Ubuntu
$ sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
```


## Step2: Pyenvのインストール
githubから取得します。

```
$ cd /usr/local/
$ sudo git clone git://github.com/yyuu/pyenv.git ./pyenv
$ sudo mkdir -p ./pyenv/versions ./pyenv/shims
```

## Step3: Pyenv-virtualenvのインストール
virtualenvで各バージョンの中で個別の環境を用意したいのでpyenv-virtualenvプラグインをインストール。

```
$ cd /usr/local/pyenv/plugins/
$ sudo git clone git://github.com/yyuu/pyenv-virtualenv.git
```

## Step4: Path設定
`/etc/profile.d/pyenv.sh`を作成します。

```
$ echo 'export PYENV_ROOT="/usr/local/pyenv"' | sudo tee -a /etc/profile.d/pyenv.sh
$ echo 'export PATH="${PYENV_ROOT}/shims:${PYENV_ROOT}/bin:${PATH}"' | sudo tee -a /etc/profile.d/pyenv.sh
$ source /etc/profile.d/pyenv.sh # 設定反映
$ pyenv --version
pyenv 20141211-6-g995da2d
$
```

sudo時にPATHとPYENV_ROOTを引き継ぎたいので[sudo時にPATHを引き継ぐ方法](http://qiita.com/akito1986/items/e9ca48cfcd56fdbf4c9d)と同様にvisudoで以下のように編集。

```/etc/sudoers
#Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Defaults    env_keep += "PATH"
Defaults    env_keep += "PYENV_ROOT"
```

## Step5: Pyenvの使い方

ヘルプを見る限りrbenvと使えるコマンドは同じらしい。

```
$ pyenv --help
pyenv 20141211-6-g995da2d
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   commands    List all available pyenv commands
   local       Set or show the local application-specific Python version
   global      Set or show the global Python version
   shell       Set or show the shell-specific Python version
   install     Install a Python version using python-build
   uninstall   Uninstall a specific Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   version     Show the current Python version and its origin
   versions    List all Python versions available to pyenv
   which       Display the full path to an executable
   whence      List all Python versions that contain the given executable

See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/yyuu/pyenv#readme
$
```



## Step6: Pythonインストール

インストールできるバージョンの確認。

```
$ pyenv install --list
```

2014/12/28時点で最新の3.4.2をインストール。

```
$ sudo pyenv install -v 3.4.2
$ pyenv versions
* system (set by /usr/local/pyenv/version)
  3.4.2
$
```

各ユーザーのデフォルトのpythonのバージョンを3.4.2に変更。

```
$ sudo pyenv global 3.4.2
$ pyenv versions
  system
* 3.4.2 (set by /usr/local/pyenv/version)
$ python --version
Python 3.4.2
$
```

## Step7: virtualenvの作成
以下のコマンドで既存のpythonバージョンを利用した環境を作成することができる。
pipなどでインストールしたパッケージは環境によって異なるので手軽にパッケージインストールできる。

```
$ sudo pyenv virtualenv 3.4.2 dev01-3.4.2
$ pyenv versions
  system
* 3.4.2 (set by /usr/local/pyenv/version)
  dev01-3.4.2
$ sudo pyenv local dev01-3.4.2 # 現在の環境をdev01-3.4.2に変更
$ pyenv versions
  system
  3.4.2
* dev01-3.4.2 (set by /usr/local/pyenv/plugins/.python-version)
$
```

pipでgunicornをインストールしてみる。

```
$ sudo pip install gunicorn
$ pip list
gunicorn (19.1.1)
pip (1.5.6)
setuptools (2.1)
$ sudo pyenv local 3.4.2 
$ pip list # 3.4.2環境にはgunicornはインストールされていない。
pip (1.5.6)
setuptools (2.1)
$
```

以下のコマンドでdev01-3.4.2を削除することができる。

```
$ sudo pyenv uninstall dev01-3.4.2
pyenv: remove /usr/local/pyenv/versions/dev01-3.4.2? y
$ pyenv versions
  system
* 3.4.2 (set by /usr/local/pyenv/plugins/.python-version)
$
```

## おわりに
pyenvを用いればシステム初期時のpython環境を気にせずにpython3.x系を簡単にインストールでき、python2.x系とpython3.x系の動作検証を一つのOS上に簡単に構築できそう。

あとrbenvやpyenvのラッパーであるanyenvというものがあり、複数言語のenvツールを利用するならこちらのほうが便利そう。
[anyenvで開発環境を整える](http://qiita.com/luckypool/items/f1e756e9d3e9786ad9ea)

おしまい。