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

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

流れ

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

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

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

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

pyenv の導入

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

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

その後,Git で pyenv を取得します.

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

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

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

Anadonda3 の導入

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

terminal
# pyenv install --list

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

terminal
# pyenv install anaconda3-5.0.0

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

Python バージョンの切り替え

terminal
# 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 という記述があったので消してみたら消えました.

terminal
# 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 を参照していれば良いので,これで合ってます.)

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

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

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

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

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

terminal
# 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 っていつできたんだ....

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

Flask のインストール

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

terminal
# pip install flask

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

参考