ソースからPythonをインストール

yumからpythonを入れてもいいけど、最新版があるとも限らないし、
かといってむやみやたらにリポジトリを増やすのが嫌いなので、ソースからインストゥール。
なお、OSはCentOS7。

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

## 0.全手順

```
# cd /usr/local/src
# curl -O https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz
# tar Jxf Python-3.6.2.tar.xz
# cd Python-3.6.2
# ./configure --prefix=/usr/local/python362 --with-ensurepip
# yum -y install zlib-devel openssl-devel tk-devel
# make
# make test
# make install
# ln -s /usr/local/python362/bin/python3.6 /bin/python3
# ln -s /usr/local/python362/bin/pip3.6 /bin/pip3
```

## 1.最新版のソースを入手する
いちいちブラウザを開くのは面倒なので？curlで探す。
-sでプログレス表示を抑止。

```
# curl -s https://www.python.org/downloads/source/ | grep -i latest
            <li><a href="/downloads/release/python-362/">Latest Python 3 Release - Python 3.6.2</a></li>
            <li><a href="/downloads/release/python-2713/">Latest Python 2 Release - Python 2.7.13</a></li>
```

最新版は3.6.2なので、ダウンロードする。
-Oはリモートと同じ名前でローカルにoutput。
手前のコンパイルなので、置き場所は、ユーザ/usr/local/srcにしておく。

```
# cd /usr/local/src
# curl -O https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz
```

解凍する。xz形式はtarのJオプションで解凍可能。

```
# tar Jxf Python-3.6.2.tar.xz
```

## 2.インストール
configureを実行する。
インストール先は、後々最新バージョンを入れることを考えて、
/usr/local/python362にしたいので、configureでprefixを指定する。
ついでに、pipはよく使うので、併せてインストールするように指定する。

```
# cd Python-3.6.2
# ./configure --prefix=/usr/local/python362 --with-ensurepip
```

configureを実行することで、システムのライブラリやらコマンドやら、
コンパイルに必要なものをチェックして、
オプションで与えられたprefixやらを盛り込んだMakefileを作成する。

次に、pip前提パッケージを導入しておく(なければ)。

```
# yum -y install zlib-devel openssl-devel tk-devel
```

続いて、makeでMakefileをもとにコンパイルする。

```
# make
```

その次に、make testでちゃんとmakeしたものが動くかテストする。

```
# make test
(略)
zipimport.ZipImportError: can't decompress data; zlib not available
(略)
Tests result: FAILURE
make: *** [test] エラー 1
```

ダメならこんな感じになる。(pip前提のzlibが入ってないときのエラー)

SUCCESSしたらようやくmake installでインストール。

```
# make install
```


## 3.リンクの作成
/bin配下に、python3とpip3へのリンクを作ってやる。

```
# ln -s /usr/local/python362/bin/python3.6 /bin/python3
# ln -s /usr/local/python362/bin/pip3.6 /bin/pip3
```

最後にバージョンを表示して確認。

```
# python3 -V
Python 3.6.2
# pip3 -V
pip 9.0.1 from /usr/local/lib/python3.6/site-packages (python 3.6)
```

以上でおしまい。

*怪談話を見たい人は以降も読み進めて頂きたく。*

## 4.リンクの貼り換えはやっちゃダメ
**最初こっちをやったらハマったので、教訓として残しとく。**

既存のリンクがバージョン2へのリンクなので、これを切り替える。
ついでに、pipのリンクも作ってやる。

```
# which python
/bin/python
# ls -l /bin/python
lrwxrwxrwx. 1 root root 7  5月  2 13:00 /bin/python -> python2
# mv /bin/python /bin/_python
# ln -s /usr/local/python362/bin/python3.6 /bin/python
# ln -s /usr/local/python362/bin/pip3.6 /bin/pip
```

最後にバージョンを表示して確認。

```
# python -V
Python 3.6.2
# pip -V
pip 9.0.1 from /usr/local/python362/lib/python3.6/site-packages (python 3.6)
```

*では終わらなかった…。*

じゃあインストールしたし、試しにpipでscipyでも入れてみるか、と。

```
# pip install scipy
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
```

ああなるほど、SSLが必要なんすね。ということで、yumでopenssl-develを入れよう。(※本当は再makeが必要)

```
# yum -y install openssl-devel
  File "/bin/yum", line 30
    except KeyboardInterrupt, e:
                            ^
SyntaxError: invalid syntax
```

**(゜ホ゜)…**という顔でしばし固まった。
理由は、[Python3からexceptの書き方が変わったこと。](https://docs.python.org/3.0/whatsnew/2.6.html#pep-3110)
*っていうかyumがpythonで実装されているなんて知らなかった…。*

従って、応急処置でshebangを以下の通り変更。本当は人様のスクリプトに手を加えたくないが…。

```
#!/usr/bin/python2
```

で動くかなと思ったら

```
# yum -y install openssl-devel
(略)
Downloading packages:
  File "/usr/libexec/urlgrabber-ext-down", line 28
    except OSError, e:
                  ^
SyntaxError: invalid syntax


ユーザーのキャンセルで終了しています
```

**ま　た　お　ま　え　か**

…ということで、むやみやたらに既存をいじってはいけません。