CentOS7にApache+Flask(+Anaconda)の環境を作る

Flask を使おうということで以前 mod_wsgi をインストールしたので、今回はいよいよ Flask 本体をインストールしていきたいと思います。

流れ

  1. CentOS7 + Apache の状態でスタート
  2. Python 実行可能にする
    1. Apache のモジュール mod_wsgi をインストール
  3. Python のバージョンを 3 にする (←今回はここからやりたい)
    1. pyenv をインストール
    2. Anaconda3 をインストール
  4. Flask を導入する

Python 3 系をインストールする

CentOS7 には予め Python がインストールされていますが、手元にある環境のバージョンは 2.7.5 でした。2020 年辺りに完全に Python 3 系に移行する的な話らしいので、ここから始める場合 2 系を使うメリットがほとんどありません。

しかし、現在の環境を下手に汚すのは嫌なので、pyenv で両方のバージョンを切り替えられるようにしてから Flask を入れたいと思います。

pyenv の導入

まず、pyenv をインストールするためには依存パッケージをインストールする必要があります。pyenv を Git で取得したいので一緒にインストールしています。

# yum install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel git

その後、Git で pyenv を取得します。

# git clone https://github.com/yyuu/pyenv.git ~/.pyenv

.bash_profile に環境変数を追加し、設定を反映させます。

# vim .bash_profile
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
# source .bash_profile

Anadonda3 の導入

インストールできる Python のバージョンを検索してみます。

# pyenv install --list

さっきまでは Python の最新バージョン (3.6.2) をインストールするつもりでしたが、そこに我が友 Anaconda3 の文字を発見してしまい、急遽変更。

# pyenv install anaconda3-5.0.0

よく考えるとメモリ 1GB, SSD 30 GB の VPS に Anaconda3 入れる意味ないよな…と、コマンド打ってから思いました。

Python バージョンの切り替え

# python --version
Python 2.7.5
# pyenv versions
pyenv: version '2.7.5' is not installed (set by /home/mktia/.python-version)
  system
  anaconda3-5.0.0

初っ端からエラー。/home/mktia/.python-version を開くと 2.7.5 という記述があったので消してみたら消えました。

# pyenv versions
* system (set by /home/mktia/.python-version)
  anaconda3-5.0.0
# pyenv global anaconda3-5.0.0
# pyenv rehash
# python --version
Python 2.7.5 (!?!?!?!?!?)

pyenv でバージョンを切り替えられないときの対処法

パスが正しく通ってるか調べる

なぜか切り替えがうまくいかず。調べてみると、優先度が違うとかパスが違うとか…。とりあえず Python のパスを表示してみると、こんな感じでした。

(追記:パスは下のように .pyenv 下の Python を参照していれば良いので、これで合ってます。)

# which python
/root/.pyenv/shims/python

さっき書いた .bash_profile の二行目を修正して反映させます。

export PATH="$PYENV_ROOT/shims:$PATH"

(追記:嘘。/root/.pyenv/bin/pyenv のパスが通っていないので、pyenv コマンドが使えなくなります。ちゃんとパスの通し方を学べよ俺)

ところが、これでもうまくいかず、次は global を local に変更してみます。

# pyenv local anaconda3-5.0.0
# pyenv rehash
# python --version
Python 3.6.2 :: Anaconda, Inc.
# pyenv versions
  system
* anaconda3-5.0.0 (set by /home/mktia/.python-version)

切り替え成功!しかし、このファイル内部では Python 3.6.2 を適用する一方、その外では 2.7.5 を適用することになっては意味がないのではないか?

global の Python バージョンを変えるにはどうすれば?

色々ググった結果、上の出力に原因がバッチシ載ってたことがわかりました。set by /home/mktia/.python-version が問題だったんですね。

最初のエラーもこのファイルが原因でしたが、そもそもこのファイルの存在自体が要らないらしいです。理由は、Python のバージョンを読み取るときの優先順位にあるようです。

local で設定 (/home/mktia/.python-version) > global で設定 (/root/.pyenv/version) となってるらしい…。.python-version を消したら、set by の参照先が変わりました。そもそも .python-version っていつできたんだ…。

# rm .python-version
rm: remove regular file '.python-version'? y
# pyenv versions
  system
* anaconda3-5.0.0 (set by /root/.pyenv/version)

Flask のインストール

pip が使えればコマンドを打つだけです。

# pip install flask

思った以上に長くなりすぎて Flask を実際に動かすのはまた次回に。

(参考)