python(pyenv + pyenv-virtualenv) + CentOS7インストール

## 環境
- CentOS 7.1

## 関連記事
- [【Python2to3アップデート方法】Python3系のインストール](https://qiita.com/Esfahan/items/913fdf27ee4a564b1936)

## 依存関係インストール

```
$ sudo yum -y groupinstall "Development Tools"
$ sudo yum -y install readline-devel zlib-devel bzip2-devel sqlite-devel openssl-devel \
    libXext.x86_64 libSM.x86_64 libXrender.x86_64 gcc gcc-c++ libffi-devel python-devel bzip2
```

下記のみでもOK。

```
$ sudo yum -y install zlib tk-devel tcl-devel ncurses-devel gdbm-devel db4-devel readline-devel zlib-devel \
  bzip2-devel sqlite-devel openssl-devel libXext.x86_64 libSM.x86_64 libXrender.x86_64 gcc gcc-c++ libffi-devel python-devel patch bzip2
```

### matplotlib使うなら下記も先にインストール
あとから入れるとpythonをリビルドしないといけないみたい。

```
$ sudo yum install -y tk.x86_64 tk-devel.x86_64 tkinter.x86_64
```


## pyenv install

```sh
$ pyenv_install() {
  # skip installation when pyenv is already installed.
  if [ `pyenv --version > /dev/null 2>&1; echo $?` == 0 ]; then
    echo '.pyenv is already installed.(skipping...)'
    return
  fi

  # pyenv
  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;
  
  # pyenv-virtualenv
  git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv;
  echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile;

  source ~/.bash_profile;
}

$ pyenv_install
```

## pythonインストール

インストール可能なもの一覧

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

python2系

```
$ pyenv install 2.7.12
$ pyenv global 2.7.12
```

anaconda2系

```
$ pyenv install anaconda2-4.1.0
$ pyenv global anaconda2-4.1.0
```

python3系

```
$ pyenv install 3.5.2
$ pyenv global 3.5.2
```

anaconda3系

```
$ pyenv install anaconda3-4.1.0
$ pyenv global anaconda3-4.1.0
```

インストールされているバージョン確認

```
$ pyenv versions
```

## pyenv-virtualenv

前述のpyenv_install関数に組み込み済だが、pyenv-virtualenvを使って、アプリケーションごとに管理するpipを分ける場合は、下記を実行

```
# pyenv-virtualenv
git clone https://github.com/yyuu/pyenv-virtualenv.git  ~/.pyenv/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
```

下記コマンドで、アプリケーション別のenvを生成

```
$ pyenv virtualenv 3.5.2 application-name
```

インストールされたか確認

```
$ pyenv versions

  system
* 3.5.2
  3.5.2/envs/application-name
  application-name
```

切り替え

```
$ pyenv local 3.5.2/envs/application-name
```


## pythonをソースからビルドする場合

### pythonのダウンロード
こちらからダウンロード
https://www.python.org/downloads/

例）Python-2.7.10をインストールする場合

```
$ curl -OL https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz
$ tar zxfv Python-2.7.10.tgz
```

### インストール
/usr/local/bin/にpythonをインストールする場合
`--with-ensurepip`でpipをインストールする。

```
$ cd Python-2.7.10
$ sudo ./configure --enable-unicode=ucs4 --prefix=/usr/local --with-ensurepip
$ sudo make
$ sudo make altinstall
```

> 警告 make install は python3 バイナリを上書きまたはリンクを破壊してしまうかもしれません。そのため、make install の代わりに exec_prefix/bin/pythonversion のみインストールする make altinstall が推奨されています。

### pipのインストール

```
$ curl -OL https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
```

### pipのインストール先を変更する場合
デフォルトだとroot権限が必要だが、ユーザー権限でpipを実行したい場合は、インストール先を、ユーザー権限で操作できる場所に変更する必要がある。

```
$ mkdir -p ~/local/lib/python/site-packages/
$ echo 'export PYTHONPATH=$HOME/local/lib/python/site-packages:$PYTHONPATH' >> ~/.bash_profile
```

pip installをする際には、 `--install-option` でパスを指定する。

```
$ pip install --install-option="--prefix=$HOME/local" awscli
```

参考：[pipのインストール先を指定する](http://hacknote.jp/archives/19074/)

## venv
### venvのインストール

```
$ pip install virtualenv
```

### samle-envというvenvを作成
virtualenvwrapperを使う場合はこの手順は飛ばして[こちらへ](https://qiita.com/Esfahan/items/0dfe70357549f92b23da#virtualenvwrapper)

- 参考：[venvを使ったmacOSのPython開発環境2016](https://qiita.com/shinespark/items/1d6ec0de89aa537da505)

```bash
# Python 3.5以前
$ virtualenv sample-env

# Python 3.6以降
$ python3 -m venv sample-env
```

### 以下にsample-env関連のファイルが作成される

```
$ ll ~/sample-env/
total 8
drwxr-xr-x  12 user  staff  384 Apr 30 13:50 bin
drwxr-xr-x   2 user  staff   64 Apr 30 13:50 include
drwxr-xr-x   3 user  staff   96 Apr 30 13:50 lib
-rw-r--r--   1 user  staff   75 Apr 30 13:50 pyvenv.cfg
```

### activate 仮想環境の有効化

```
$ source sample-env/bin/activate
$ (sample-env) user@MacBook:~$
```

### deactivateする

```
$ deactivate
```

## Virtualenvwrapper
venvの管理を楽にしてくれるもの

- 参考：[Virtualenvwrapperの導入](https://qiita.com/_rdtr/items/5f3a9a9e2cb5a24f284e)

### Install

```
$ sudo pip install virtualenvwrapper
```

### ~/.bashrcなどに追記
インストールしただけでは使えないので、以下を設定する

`/usr/bin/virtualenvwrapper.sh`かも

```bash
if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then
    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/local/bin/virtualenvwrapper.sh
fi
```

### env作成
`--python`で、使用するpythonを指定。python3を使うなら`/usr/local/bin/python3`など。

```
$ mkvirtualenv --python=/usr/local/bin/python sample-env
```

### 以下のコマンドで作成したenv一覧が見れる

```
$ workon
sample-env
```

### activate

```
$ workon sample-env
```

### deactivate

```
$ deactivate
```

### env削除

```
$ rmvirtualenv sample-env
```


## その他便利ライブラリ

### pp

```
import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(alarms)
```

[参考] [【Python 2.7】日本語を要素に含むオブジェクトの標準出力は、print( pp ( オブジェクト ) ) 書式で、日本語文字列として出力可能](http://qiita.com/HirofumiYashima/items/4a5d6f1f0a23e787bc34)

### inspect
オブジェクトのアトリビュート一覧を名前と中身をペアにして返す関数

```
import inspect
print(inspect.getmembers(alarms))
```

## pip.conf
pip.confを設置する場合、OSによって場所が異なる。

参考：https://pip.pypa.io/en/stable/user_guide/#configuration

| OS | path |
| --- | --- |
| MacOS | $HOME/.pip/pip.conf |
| Unix | $HOME/.pip/pip.conf |
| Windows | %HOME%\pip\pip.ini |
| Unixでpyenv-virtualenvごとに設定する場合 | ~/.pyenv/versions/[venv_name]/pip.conf |
| Macでpyenv-virtualenvごとに設定する場合 | /usr/local/opt/pyenv/versions/[venv_name]/pip.conf |
" virtualenv | ~/.virtualenvs/[venv_name]/pip.conf |


## Dockerfile

```Dockerfile
From centos:7

# parameters
ARG PY_VER='3.7.1'

# python
WORKDIR /src
RUN curl -L https://www.python.org/ftp/python/${PY_VER}/Python-${PY_VER}.tgz -o /src/Python-${PY_VER}.tgz
RUN tar zxfv Python-${PY_VER}.tgz

RUN yum -y install make zlib tk-devel tcl-devel ncurses-devel gdbm-devel db4-devel readline-devel zlib-devel \
  bzip2-devel sqlite-devel openssl-devel libXext.x86_64 libSM.x86_64 libXrender.x86_64 gcc gcc-c++ libffi-devel python-devel patch bzip2

WORKDIR /src/Python-${PY_VER}
RUN ./configure --enable-unicode=ucs4 --prefix=/usr/local --enable-optimizations
RUN make && make altinstall

RUN ln -s /usr/local/bin/python3 /usr/local/bin/python

# pip
RUN curl -L https://bootstrap.pypa.io/get-pip.py -o /src/get-pip.py
WORKDIR /src
RUN python get-pip.py
```


## 参考
- [Pythonアプリケーション毎に環境を分ける (pyenv + virtualenv (or venv) + pip)](http://c4se.hatenablog.com/entry/2016/07/29/151931)
- [Python Tips：オブジェクトのメソッドを調べたい ](http://www.lifewithpython.com/2014/10/python-get-methods-in-object.html)
- [matplotlibが描画されない](http://dragstar.hatenablog.com/entry/2016/09/23/110714)