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の書き方が変わったこと。
っていうか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
ユーザーのキャンセルで終了しています
ま た お ま え か
…ということで、むやみやたらに既存をいじってはいけません。