root権限がないときのpython・numpy・scipyのソースからのインストール on Linux

root権限がない一般人が，python2系列をインストールする手順についてのメモ．

# 一言概要

ソースからビルドします．

# なぜ必要か

root権限を持つユーザはこんなことを考える必要はほとんどない．

しかし，root権限のないただの人の場合，pipやeasy_installなどでたった1行で済むパッケージのインストールすらできない（というのは一部嘘ですが :-p ）．また，共用マシン環境の場合，自分の都合だけで勝手にpythonのバージョンを上げたりパッケージを追加更新したりできない点もネックになる．

# インストールする

* インストール先: /home/akisato/src/downloads/python-2.7.6rc1とする．
* python: ちょっと古いけど，python 2.7.6 RC1を想定．
* OS: CentOS 6系列を想定するが，たぶん他のlinux OSでもOK.

## bzip2

これがないと，あとで痛い目に遭う．
参考：
* CentOS5.5にPython2.7＆Mercurialをインストールしようとしたら色々とハマったので http://d.hatena.ne.jp/banana-umai/20110813/1313210348
* Python: Source install of 2.6 and mercurial, bz2 error http://stackoverflow.com/questions/5873544/python-source-install-of-2-6-and-mercurial-bz2-error

```
# cd ~/tmp
# wget http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz
# tar xzf bzip2-1.0.6.tar.gz
# cd bzip2-1.0.6
# make -f Makefile-libbz2_so
# make
# make install PREFIX=/home/akisato/src/downloads/bzip2-1.0.6
# export CFLAGS=-I/home/akisato/src/downloads/include
# export CPPFLAGS=$CFLAGS
# export LDFLAGS=-L/home/akisato/src/downloads/lib
```

## python本体

[たまにtheanoのようにダイナミックリンクライブラリを要求するパッケージがあったりする](http://stackoverflow.com/questions/21342931/error-importing-theano)ので，要注意．この問題の回避のために，[単にconfigureで--enable-sharedをするだけだと副作用が出る](http://qiita.com/methane/items/bf0b74550bee125cdea4)ので，-rpathを指定して回避する[^1].

[^1]: 一つ前のLDFLAGSに上書きされていないと良いなと思いつつたぶん大丈夫だろう．

```
# cd ~/tmp
# wget https://www.python.org/ftp/python/2.7.6/Python-2.7.6rc1.tgz
# tar xzf Python-2.7.6rc1.tgz
# cd Python-2.7.6
# ./configure --prefix=/home/akisato/src/downloads/python-2.7.6rc1 --with-threads --enable-shared LDFLAGS=-Wl,-rpath,/home/akisato/src/downloards/python-2.7.6rc1/lib
# vi Makefile
CCSHARED=-fPIC
# make
# make install
# export PATH=/home/akisato/src/downloads/python-2.7.6rc1/bin:${PATH}
# export PYTHONPATH=/home/akisato/src/downloads/python-2.7.6rc1/lib/python2.7/site-packages
```

PATHやPYTHONPATHは，後々のために ~/.bashrc とかに書いておいた方が良い．

## BLAS

参考：
yumを使わずにCentOS5.5にnumpyとscipyをインストールする http://yuku-tech.hatenablog.com/entry/20110325/1301048750

```
# cd ~/tmp
# wget http://www.netlib.org/blas/blas.tgz
# tar xzf blas.tgz
# cd BLAS
# gfortran -O3 -m64 -fPIC -c *.f
# ar r libfblas.a *.o
# ranlib libfblas.a
# rm -rf *.o
# cp libfblas.a /home/akisato/lib    # 永続的に残す場所へコピー
# gfortran -O3 -m64 -fPIC -shared *.f -o libfblas.so
# cp libfblas.so /home/akisato/lib    # 永続的に残す場所へコピー
# export BLAS=/home/akisato/lib/libfblas.so    # scipyインストールの時だけ見えていればOK
```

## LAPACK

```
# cd ~/tmp
# wget http://www.netlib.org/lapack/lapack.tgz
# tar xzf lapack.tgz
# cd lapack
# cp INSTALL/make.inc.gfortran make.inc
# vi make.inc
OPTS = -O2 -m64 -fPIC
NOOPT = -m64 -fPIC
# make lapacklib
# cp liblapack.a /home/akisato/lib    # 永続的に残す場所へコピー
# export LAPACK=/home/akisato/lib/liblapack.a    # scipyインストールの時だけ見えていればOK
```

## numpy

BLAS, LAPACKなしでもインストールできるが，あるなら見えていた方が良い．キチンとパス設定をしておかないと，さっきインストールしたpythonを使ってくれないので，注意．

```
# which python
/home/akisato/src/downloads/python-2.7.6rc1/bin/python
# wget http://sourceforge.net/projects/numpy/files/NumPy/1.8.0/numpy-1.8.0.tar.gz/download --no-check-certificate
# tar xzf numpy-1.8.0.tar.gz
$ cd numpy-1.8.0
$ python setup.py build
$ python setup.py install
```

## scipy

環境変数CFLAS, CCFLAGS, LDFLAGSを設定していると，scipy buildスクリプトの設定を上書きしてしまうらしいので，buildの前に消去しておいた方が良い．

```
# unset CFLAGS
# unset CCFLAGS
# unset LDFLAGS
# wget http://sourceforge.net/projects/scipy/files/scipy/0.14.0/scipy-0.14.0.tar.gz/download
# tar xzvf scipy-0.14.0.tar.gz
# cd scipy-0.14.0
# python setup.py build
# python setup.py install
```

## easy_install

これさえあれば，easy_install <ライブラリ名>で簡単にpythonライブラリがインストールできる．

```
# cd ~/tmp
# wget https://pypi.python.org/packages/source/s/setuptools/setuptools-3.4.1.tar.gz --no-check-certificate
# tar xzf setuptools-3.4.1.tar.gz
# cd setuptools-3.4.1
# python ez_setup.py
```

## pip

easy_installよりこっちの方が便利．

```
# easy_install pip
# pip freeze
（すでにインストールしたパッケージが表示されればOK）
```

easy_install経由でpipがインストールできない場合には，get-pip.pyを使う．

```
# wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate
# python get-pip.py
```