2016/08/26

シェルスクリプトでCentOSにPython3の開発環境を自動構築する(pip, pyenv, virtualenv)

フロントエンドエンジニアとして生き残りをはかるため、サーバサイドにも手を伸ばそう!と決め、Python3+falcon+SQLAlchemy+MySQL+gunicorn+NginxでWebAPIサーバを立てようとしていた。
でもサーバのOSにCentOS7を選んでしまったので、python3がはいっていない。

手作業でPython3の開発環境を構築してもいいが、初心者なのでサーバを作って壊してを繰り返す予定だし、最近シェルスクリプトを覚えて「なんでもシェルスクリプトで書きたいマン」になっていたので、自動化するためにスクリプトをつくった。


開発環境は以下を想定している。
  • CentOS 7.2 64bit
  • Python 3.5.1
  • pyenv 1.0.0
  • pyenv-virtualenv 1.0.0
  • pip 7.1.2

自動構築するシェルスクリプト


#! /bin/bash
# 開発に必要な依存関係のパッケージをインストール
sudo yum -y install git
sudo yum -y install zlib-devel readline readline-devel bzip2 bzip2-devel splite sqlite-devel openssl openssl-devel


# pyenvをインストール
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source .bash_profile


# pyenvを使ってPython3をインストール
pyenv install 3.5.1
pyenv rehash
pyenv global 3.5.1


# pyenv-virtualenvをインストール
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
exec "$SHELL"

サーバの適当なディレクトリに配置して実行すれば、あっという間にPython3の開発環境ができあがる!


以降でそれぞれの処理の詳細を説明する。



開発に必要な依存関係のパッケージをインストール


Pythonの開発環境をセットアップするのに必要なパッケージをまとめてインストールする。
$ sudo yum -y install git
$ sudo yum -y install zlib-devel readline readline-devel bzip2 bzip2-devel splite sqlite-devel openssl openssl-devel

gitは、pyenvやpyenv-virtualenvのようにyumでインストールできないパッケージをGitHubからクローンするために使う。
zlib-devel readline readline-devel bzip2 bzip2-devel splite sqlite-devel openssl openssl-develは、Pythonの開発環境に必要なパッケージ。
(それぞれがどのパッケージに依存しているかはわからないが、多くの場合上記のパッケージをインストールしている)



pyenvをインストール


pyenv(バージョンが異なるPythonを複数インストールするための管理ツール)をインストールする
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

パスを通すために.bash_profileに以下の設定を追記する。
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

最後に.bash_profileの変更を反映する。
$ source .bash_profile

pyenvを使うメリットは、たとえばCentOS7.2にはPython2.7.5がインストールされている。Python2.8がリリースされたとき、そのままインストールすると同じメジャーバージョンの場合は上書きされてしまう。
もし破壊的なバージョンアップが含まれていると、過去にPython2.7.5でつくったプログラムが動かなくなってしまう。でもこれから開発するのは最新のPython2.8を使いたい。

「あー、どっちのバージョンにすればいいんだァァァあ!!!!」

「両方使えるようにすればいいんじゃない?」

「?!」

こんなシチュエーションで威力を発揮するのがpyenv。
この管理ツールを使えば、他に影響を与えることなくPythonのバージョンを管理できる。



pyenvを使ってPython3、pipをインストール


Pythonの最新バージョンをインストールする。
$ pyenv install 3.5.1
$ pyenv rehash
$ pyenv global 3.5.1
pyenv rehashでもろもろの設定情報を更新し、pyenv global 3.5.1でglobal環境(システム全体)のPythonバージョンを3.5.1に変更している。
インストール可能なバージョン一覧が見たいときはpyenv install --listを実行するとドバァーっと表示される。


Python3をインストールすると、pipも一緒にインストールされる。
pipとは、JavaScriptのnpm、Rubyのgem、Perlのcpanのようなパッケージ管理ツール。
pip install {package} というコマンドを実行すると、対象のパッケージをインストールしてくれる。



pyenv-virtualenvをインストール


pyenvのプラグイン、pyenv-virtualenv(環境管理ツール)をインストールする。
pyenv-virtualenvをインストールする。
$ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
パスを通すために、.bash_profileに以下の設定を追記する。
eval "$(pyenv virtualenv-init -)"
最後にシェルを再起動して終了。
$ exec "$SHELL"
さきほどインストールしたpipをそのまま使うと、すべてグローバル環境にインストールされてしまう。それではグローバル環境が汚染されたり、パッケージ間で競合が起きたり、本番環境とインストールされているパッケージが違ったりと、いろんな問題が発生する可能性がある。

そこで使うのがvirtualenv。(今回はpyenvのプラグインであるpyenv-virtualenvを使う。無印のvirtualenvもあるので注意)

これを使うと、閉鎖した環境をいくつもつくることができる。
たとえば、このディレクトリはPython3でDjangoを使う。でも別のディレクトリではPython2とFlaskを使う。といったことが可能になる。

使い方は以下のとおり。

$ pyenv virtualenv 3.5.1 webapp
$ mkdir webapp-dir
$ cd webapp-dir
$ pyenv local webapp
(webapp) $ _



以上

written by @bc_rikko

0 件のコメント :

コメントを投稿