Python 3.4.* をソースからビルドして科学計算用環境を構築するまでまとめ


Anaconda (https://store.continuum.io/cshop/anaconda/) で何とかしようと思ったら，pandasで大きなテーブルを読み込む際に `munmap_chunk(): invalid pointer` と怒られてしまったので，諦めてPython 3.4系をソースからビルドして科学計算用環境を構築したのでそのまとめ．
※canopyは凄く重いらしいと聞いたのでそもそも試してません．
※この時は気づかなかったのですが，エラー自体はpandasの `read_json()` メソッドのエラーだったようです。。。


# 用意した環境
- Scientific Linux release 6.5 (Carbon)

# Pythonのビルド
※詳細は以下のサイトを見た方が早いです
http://toomuchdata.com/2014/02/16/how-to-install-python-on-centos/

Python本体をビルドする前に，必要なライブラリ等を導入しておく．
これらが入っていなくてもPythonのインストール自体は無事に通ったりするが，後々ライブラリのnot foundエラーで苦しめられたりしてPythonの再インストールをするはめになったりするので，とにかく先に入れておく (自戒)

```bash
$ sudo yum groupinstall --skip-broken "Development tools"
$ sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
```

Python本体のビルドを行う． (今回は現在の最新バージョン3.4.2を導入する)
今回は `/usr/local` 以下にインストールする．バージョンの確認は以下のサイトから．
https://www.python.org/downloads/source/

```bash
$ wget https://www.python.org/ftp/python/3.4.2/Python-3.4.2.tgz
$ tar xzvf Python-3.4.2.tgz
$ cd Python-3.4.2
$ ./configure --prefix=/usr/local --enable-unicode=ucs4 --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
$ make
$ sudo make install
```

以下のコマンドが実行出来れば導入完了．

```bash
$ which python3
/usr/local/bin/python3
```

Pythonのビルドがうまくいけば，自動的にpipも導入されているはずなので，以下のコマンドで確認しておく．

```bash
$ which pip3
/usr/local/bin/pip3
```

# 各種パッケージのインストール
## 科学計算用パッケージのインストール
Scipyをインストールするために必要なパッケージをあらかじめ導入しておく．

```bash
sudo yum install blas-devel lapack-devel
```

特定のパッケージ以外はpip3で順調に導入できる．
※sudoersにenv_keepしてなかったので，pip3を絶対パスでよんでます．

```bash
$ sudo /usr/local/bin/pip3 install nose pytest numpy scipy scikit-learn pandas
```

## matplotlibのインストール
matplotlibをインストールするために必要なパッケージをあらかじめ導入しておく．

```bash
$ sudo yum install libpng-devel
```

matplotlibをpip3にてインストールしようとすると，以下の様なメッセージでビルドがfailedする．

```bash
============================================================================

                        * The following required packages can not be built:

                        * freetype

----------------------------------------
Cleaning up...
Command python setup.py egg_info failed with error code 1 in /tmp/pip_build_root/matplotlib
Storing debug log for failure in /root/.pip/pip.log

```

エラーメッセージをよくよく見ると，次のようなメッセージを発見．

```bash
REQUIRED DEPENDENCIES AND EXTENSIONS
...
              freetype: no  [Requires freetype2 2.4 or later.  Found

                        2.3.11.]
```

matplotlibを入れるためには，freetype2の2.4以上が必要だが，デフォルトでは2.3.11が入っているっぽい．
ここでは，freetypeをソースからビルドすることにした．
ソースは以下のサイトからダウンロード出来る．
http://download.savannah.gnu.org/releases/freetype/


```bash
$ wget http://download.savannah.gnu.org/releases/freetype/freetype-2.5.3.tar.gz
$ tar xzvf freetype-2.5.3.tar.gz
$ cd freetype-2.5.3
$ ./configure
$ make
$ sudo make install
```

ここまで終わったところで再度pip3を行うと，今度は以下のようなエラーが発生した．

```bash
Downloading/unpacking matplotlib
  Downloading matplotlib-1.4.0.tar.gz (51.2MB): 51.2MB downloaded
  Running setup.py (path:/tmp/pip_build_root/matplotlib/setup.py) egg_info for package matplotlib
    Traceback (most recent call last):
      File "<string>", line 17, in <module>
      File "/tmp/pip_build_root/matplotlib/setup.py", line 154, in <module>
        result = package.check()
      File "/tmp/pip_build_root/matplotlib/setupext.py", line 945, in check
        min_version='2.4', version=version)
      File "/tmp/pip_build_root/matplotlib/setupext.py", line 433, in _check_for_pkg_config
        if (not is_min_version(version, min_version)):
      File "/tmp/pip_build_root/matplotlib/setupext.py", line 166, in is_min_version
        return found_version >= expected_version
      File "/usr/local/lib/python3.4/distutils/version.py", line 76, in __ge__
        c = self._cmp(other)
      File "/usr/local/lib/python3.4/distutils/version.py", line 343, in _cmp
        if self.version < other.version:
    TypeError: unorderable types: str() < int()
```

このエラーについて調査したところ，どうやらPython 3.3／3.4系における既知のバグらしいことが分かった．
詳細については以下のissueを参照．
http://bugs.python.org/issue14894

ここであげられている`14894.patch`をダウンロードしてきてPythonにあてる．(この変更がPython本体にあてられてリリースされるのはいつになるのだろう。。。)

```bash
$ wget http://bugs.python.org/file25808/14894.patch
$ cd /usr/local/lib/python3.4/distutils/
$ sudo patch -p3 < /path/to/patch/14894.patch 
```

ここまで終わったところでpip3を実行することで，matplotlibが入れられる．

```bash
$ sudo /usr/local/bin/pip3 install matplotlib
```

## IPython Notebookを動かすためのパッケージをインストール
以下のパッケージ群を導入．

```bash
$ sudo /usr/local/bin/pip3 install ipython jinja2 tornado pyzmq
```

#おわり
この後IPython Notebook Serverを動かしたりpytest/Theano/wabbit_wappa入れたりしたのですが，まとめるのが大変な感じになってきたのでここらで終わります．
IPython Notebook Serverについては，以下のサイトがよくまとまっているので参考までに．
http://akiniwa.hatenablog.jp/entry/2013/11/25/001805

Enjoy PyData!