はじめに
Python でプログラムを作成するとき、あるいはデプロイするとき、プロジェクトに応じて都度外部のパッケージを使用する事が多いと思います。また、1つのホストに複数のプロジェクトをデプロイすることもよくあると思います。ホスト共通の領域に追加のパッケージをインストールしてしまうと、すべてのプロジェクトで同じバージョンのものを使う必要が出てきます。
このとき問題になるのが、使用したいパッケージのバージョンがプロジェクト毎に異なる場合です。こういうときはプログラム毎に個別のバーチャル環境 venv を用意して、他のプロジェクトとは独立した環境を構築して対応できます。
今回、デフォルトでインストールされている Python に影響を与えずに、Python 2.7 と Python 3.5、Python3.6 の環境を構築する手順を紹介します。この手順は CentOS5~CentOS7、AmazonLinux 、Ubuntu14.04LTS(Desktop) に適用できます。
2016/09/08 時点の状況
OS | デフォルトの Python のバージョン |
CentOS5 | 2.4.3 |
CentOS6 | 2.6.6 |
CentOS7 | 2.7.5 |
AmazonLinux(2016.03) | 2.7.11 |
Ubuntu14.04LTS(Desktop) | 2.7.6 |
Ubuntu16.04LTS(Desktop) | 2.7.12 |
新しいバージョンの Python のインストールについて
目的のバージョンの Python ソースコードをダウンロードしてビルドします。
OS 標準の Python 環境には影響が出ないよう、新たに追加する Python のホームを /opt/Python2.7/ や /opt/Python3.5/ のように、/opt/ 以下にインストールする事にします。
INSTALL_DEST_DIR="/opt"
依存ライブラリのインストール
Python のビルドにはいくつか依存するライブラリが必要です。
CentOS5 の場合
CentOS5 64ビット版の yum コマンドは余分な 32 ビット版のパッケージもインストールすることがありますので、事前に余分な 32 ビット版のパッケージをインストールしないように yum の設定を調整します。具体的には、「multilib_policy=best」を /etc/yum.conf に追加するだけです。
$ sudo bash -c "echo 'multilib_policy=best' >> /etc/yum.conf"
$ sudo yum install gcc
$ sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel httpd-devel mysql-devel gdbm-devel xz-devel
CentOS6 の場合
$ sudo yum install gcc
$ sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel httpd-devel mysql-devel gdbm-devel xz-devel
CentOS7 の場合
$ sudo yum install gcc
$ sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel httpd-devel mysql-devel gdbm-devel xz-devel
AmazonLinux (2016.03) の場合
$ sudo yum install gcc
$ sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel libX11-devel httpd-devel mysql-devel gdbm-devel xz-devel
Ubuntu 14.04 LTS (Desktop) の場合
$ sudo apt-get install libbz2-dev libncurses5-dev libgdbm-dev liblzma-dev libsqlite3-dev tk-dev libreadline-dev libssl-dev
Ubuntu 16.04 LTS (Desktop) の場合
$ sudo apt-get install libbz2-dev libncurses5-dev libgdbm-dev liblzma-dev libsqlite3-dev tk-dev libreadline-dev libssl-dev
Python2.7 環境構築
Python2.7 で venv を利用するには、まず Python2.7 の最新版をビルドして既存の Python とは別のディレクトリにインストールします。次に、インストールした Python2.7 用の virtualenv をインストールして、venv 環境を新規構築できるようにします。
ビルド
Python のソースコードを公式サイトからダウンロードしてビルドします。
$ mkdir -p ~/src
$ cd ~/src
$ curl -LO https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz
$ tar fxz Python-2.7.11.tgz
$ cd Python-2.7.11
$ ./configure \
--prefix=${INSTALL_DEST_DIR}/python2.7 \
--with-ensurepip=install \
--with-threads \
--enable-shared \
LDFLAGS="-Wl,-rpath=${INSTALL_DEST_DIR}/python2.7/lib"
$ make
インストール
configure 実行時に指定したディレクトリ /opt/python2.7 以下にインストールします。
$ sudo make altinstall
$ sudo ${INSTALL_DEST_DIR}/python2.7/bin/pip2.7 install virtualenv
venv 環境 新規作成
Python2.7 を使用したいプロジェクトのディレクトリを作成して、このプロジェクト専用の venv 環境を作成します。
(venv 環境新規構築)
$ mkdir -p ~/work-with-python2.7
$ cd ~/work-with-python2.7
$ ${INSTALL_DEST_DIR}/python2.7/bin/virtualenv venv
Python3.5 環境構築
Python3.5 で venv を利用するには、ビルド後にデフォルトでインストールされる pyvenv コマンドで venv 環境を新規構築します。
ビルド
Python のソースコードを公式サイトからダウンロードしてビルドします。
$ mkdir -p ~/src
$ cd ~/src
$ curl -LO https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz
$ tar fxz Python-3.5.2.tgz
$ cd Python-3.5.2
$ ./configure \
--prefix=${INSTALL_DEST_DIR}/python3.5 \
--with-ensurepip=install \
--with-threads \
--enable-shared \
LDFLAGS="-Wl,-rpath=${INSTALL_DEST_DIR}/python3.5/lib"
$ make
インストール
configure 実行時に指定したディレクトリ /opt/python3.5 以下にインストールします。
$ sudo make altinstall
venv 環境 新規作成
Python3.5 を使用したいプロジェクトのディレクトリを作成して、このプロジェクト専用の venv 環境を作成します。
(venv 環境新規構築)
$ mkdir -p ~/work-with-python3.5
$ cd ~/work-with-python3.5
$ ${INSTALL_DEST_DIR}/python3.5/bin/pyvenv-3.5 venv
venv 環境 操作方法
今回の手順で構築した venv 環境はどちらも同じ手順で操作できます。
venv 環境有効化
$ source venv/bin/activate
venv 環境の Python のバージョン確認
(venv)$ python --version
Python 2.7.10
venv 環境無効化
(venv)$ deactivate
おわりに
お気づきかもしれませんが、Python 2.7 のインストール手順と Python 3.5 のインストール手順を比較すると、Python 本体のインストールまではほとんど共通であることがわかると思います。違うのは venv 環境を新規作成するためのコマンド virtualenv と pyvenv くらいでしょうか。
一度 venv を作成してしまえば、あとは venv 環境内で pip install などを実行しても、その venv 環境の外には影響がありません。開発前に、使用する pip パッケージを選定・評価する場合などにも便利に利用できます。
ここで作成した venv 環境を Nginx にデプロイする手順も追って紹介したいと思います。