はじめに
Python でプログラムを作成するとき、あるいはデプロイするとき、プロジェクトに応じて都度外部のパッケージを使用する事が多いと思います。また、1つのホストに複数のプロジェクトをデプロイすることもよくあると思います。ホスト共通の領域に追加のパッケージをインストールしてしまうと、すべてのプロジェクトで同じバージョンのものを使う必要が出てきます。
このとき問題になるのが、使用したいパッケージのバージョンがプロジェクト毎に異なる場合です。こういうときはプログラム毎に個別のバーチャル環境 venv を用意して、他のプロジェクトとは独立した環境を構築して対応できます。
今回、デフォルトでインストールされている Python に影響を与えずに、Python 2.7 と Python 3.5、Python3.6 の環境を構築する手順を紹介します。この手順は CentOS5~CentOS7、AmazonLinux 、Ubuntu14.04LTS(Desktop) に適用できます。
(2017/08/24 更新)
Python3.6 のインストール手順について、新しい投稿があります。Python3.6ビルドとvenv環境構築
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 |
(2016/04/10 更新)
2015/10/15 時点の情報から、2016/04/10 時点の情報に更新しました。
また、(venv環境ではない) Python のインストール先を変更しやすいよう、インストール先ディレクトリを環境変数にしました。
新しいバージョンの Python のインストールについて
目的のバージョンの Python ソースコードをダウンロードしてビルドします。
OS 標準の Python 環境には影響が出ないよう、新たに追加する Python のホームを /opt/Python2.7/ や /opt/Python3.5/ のように、/opt/ 以下にインストールする事にします。
$ INSTALL_DEST_DIR="/opt"
通常、自前でインストールするものは /usr/local/ 以下にすることが多いと思います。ただ、今回のように既存のシステムと競合してしまいそうなプログラムをインストールする場合、私は /opt/ に置くようにしています。
インストール先をユーザーホーム以下 (/home/user/opt/ 以下など、root権限が不要なディレクトリ) へインストールすることもできます。この場合は、sudo を付けないでください。sudo を付けると、ユーザー権限で管理できなくなります。
依存ライブラリのインストール
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
gcc のインストール時にインストールされるパッケージ (5 ファイル)
gcc, cpp, glibc-devel, glibc-headers, kernel-headers
依存ライブラリのインストール時にインストールされるパッケージ (41 ファイル)
bzip2-devel, gdbm-devel, httpd-devel, mysql-devel, ncurses-devel, openssl-devel, readline-devel, sqlite-devel, tk-devel, xz-devel, zlib-devel, apr, apr-devel, apr-util, apr-util-devel, cyrus-sasl-devel, db4-devel, e2fsprogs-devel, expat-devel, httpd, keyutils-libs-devel, krb5-devel, libX11-devel, libXau-devel, libXdmcp-devel, libXxf86vm, libdrm, libselinux-devel, libsepol-devel, libtermcap-devel, mesa-libGL, mesa-libGL-devel, mysql, openldap-devel, perl-DBI, pkgconfig, postgresql-libs, tcl-devel, tk, xorg-x11-proto-devel, xz-libs
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
gcc のインストール時にインストールされるパッケージ (9 ファイル)
gcc, cloog-ppl, cpp, glibc-devel, glibc-headers, kernel-headers, libgomp, mpfr, ppl
依存ライブラリのインストール時にインストールされるパッケージ (55 ファイル)
bzip2-devel, gdbm-devel, httpd-devel, mysql-devel, ncurses-devel, openssl-devel, readline-devel, sqlite-devel, tk-devel, xz-devel, zlib-devel, apr, apr-devel, apr-util, apr-util-devel, apr-util-ldap, cyrus-sasl-devel, db4-cxx, db4-devel, expat-devel, fontconfig, fontconfig-devel, freetype, freetype-devel, httpd, httpd-tools, keyutils-libs-devel, krb5-devel, libX11, libX11-common, libX11-devel, libXau, libXau-devel, libXft, libXft-devel, libXrender, libXrender-devel, libcom_err-devel, libselinux-devel, libsepol-devel, libxcb, libxcb-devel, mailcap, mysql, openldap-devel, perl, perl-Module-Pluggable, perl-Pod-Escapes, perl-Pod-Simple, perl-libs, perl-version, tcl, tcl-devel, tk, xorg-x11-proto-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
gcc のインストール時にインストールされるパッケージ (7 ファイル)
gcc, cpp, glibc-devel, glibc-headers, kernel-headers, libmpc, mpfr
依存ライブラリのインストール時にインストールされるパッケージ (76 ファイル)
bzip2-devel, gdbm-devel, httpd-devel, mariadb-devel, ncurses-devel, openssl-devel, readline-devel, sqlite-devel, tk-devel, xz-devel, zlib-devel, apr, apr-devel, apr-util, apr-util-devel, cyrus-sasl, cyrus-sasl-devel, expat-devel, fontconfig, fontconfig-devel, fontpackages-filesystem, freetype-devel, httpd, httpd-tools, keyutils-libs-devel, krb5-devel, libX11, libX11-common, libX11-devel, libXau, libXau-devel, libXft, libXft-devel, libXrender, libXrender-devel, libcom_err-devel, libdb-devel, libselinux-devel, libsepol-devel, libverto-devel, libxcb, libxcb-devel, mailcap, openldap-devel, pcre-devel, perl, perl-Carp, perl-Encode, perl-Exporter, perl-File-Path, perl-File-Temp, perl-Filter, perl-Getopt-Long, perl-HTTP-Tiny, perl-PathTools, perl-Pod-Escapes, perl-Pod-Perldoc, perl-Pod-Simple, perl-Pod-Usage, perl-Scalar-List-Utils, perl-Socket, perl-Storable, perl-Text-ParseWords, perl-Time-HiRes, perl-Time-Local, perl-constant, perl-libs, perl-macros, perl-parent, perl-podlators, perl-threads, perl-threads-shared, tcl, tcl-devel, tk, xorg-x11-proto-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
gcc のインストール時にインストールされるパッケージ (9 ファイル)
gcc, cpp48, gcc48, glibc-devel, glibc-headers, kernel-headers, libgomp, libmpc, mpfr
依存ライブラリのインストール時にインストールされるパッケージ (37 ファイル)
bzip2-devel, gdbm-devel, httpd-devel, libX11-devel, mysql-devel, ncurses-devel, openssl-devel, readline-devel, sqlite-devel, xz-devel, zlib-devel, apr, apr-devel, apr-util, apr-util-devel, apr-util-ldap, cyrus-sasl-devel, db4-cxx, db4-devel, expat-devel, httpd, httpd-tools, keyutils-libs-devel, krb5-devel, libXau-devel, libcom_err-devel, libselinux-devel, libsepol-devel, libverto-devel, libxcb-devel, mailcap, mysql-config, mysql55, mysql55-devel, mysql55-libs, openldap-devel, xorg-x11-proto-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
AWS EC2 の Ubuntu にインストールする場合は、こちらの投稿も参照してください。
依存ライブラリのインストール時にインストールされるパッケージ (50 ファイル)
build-essential, dpkg-dev, fakeroot, g++, g++-4.8, libalgorithm-diff-perl, libalgorithm-diff-xs-perl, libalgorithm-merge-perl, libbz2-dev, libexpat1-dev, libfakeroot, libfontconfig1-dev, libfreetype6-dev, libgdbm-dev, libice-dev, liblzma-dev, libncurses5-dev, libpng12-dev, libpthread-stubs0-dev, libreadline-dev, libreadline6-dev, libsm-dev, libsqlite3-dev, libstdc++-4.8-dev, libtinfo-dev, libx11-dev, libx11-doc, libxau-dev, libxcb1-dev, libxdmcp-dev, libxext-dev, libxft-dev, libxrender-dev, libxss-dev, libxt-dev, tcl-dev, tcl8.6-dev, tk-dev, tk8.6-dev, x11proto-core-dev, x11proto-input-dev, x11proto-kb-dev, x11proto-render-dev, x11proto-scrnsaver-dev, x11proto-xext-dev, xorg-sgml-doctools, xtrans-dev, zlib1g-dev, libssl-dev, libssl-doc
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
依存ライブラリのインストール時にインストールされるパッケージ (41 ファイル)
bzip2-doc libbz2-dev libexpat1-dev libfontconfig1-dev libfreetype6-dev libgdbm-dev libice-dev liblzma-dev libncurses5-dev libpng12-dev libpthread-stubs0-dev libreadline-dev libreadline6-dev libsm-dev libsqlite3-dev libssl-dev libssl-doc libtinfo-dev libx11-dev libx11-doc libxau-dev libxcb1-dev libxdmcp-dev libxext-dev libxft-dev libxrender-dev libxss-dev libxt-dev tcl-dev tcl8.6-dev tk-dev tk8.6-dev x11proto-core-dev x11proto-input-dev x11proto-kb-dev x11proto-render-dev x11proto-scrnsaver-dev x11proto-xext-dev xorg-sgml-doctools xtrans-dev zlib1g-dev
Python2.7 環境構築
Python2.7 で venv を利用するには、まず Python2.7 の最新版をビルドして既存の Python とは別のディレクトリにインストールします。次に、インストールした Python2.7 用の virtualenv をインストールして、venv 環境を新規構築できるようにします。
ビルド
Python のソースコードを公式サイトからダウンロードしてビルドします。
$ version="2.7.11"
$ mkdir -p ~/src
$ cd ~/src
$ curl -LO https://www.python.org/ftp/python/${version}/Python-${version}.tgz
$ tar fxz Python-${version}.tgz
$ cd Python-${version}
$ ./configure \
--prefix=${INSTALL_DEST_DIR}/python${version} \
--with-ensurepip=install \
--with-threads \
--enable-shared \
LDFLAGS="-Wl,-rpath=${INSTALL_DEST_DIR}/python${version}/lib"
$ make
インストール
configure 実行時に指定したディレクトリ /opt/python2.7 以下にインストールします。
$ sudo make altinstall
$ sudo ${INSTALL_DEST_DIR}/python2.7.11/bin/pip2.7 install virtualenv
venv 環境 新規作成
Python2.7 を使用したいプロジェクトのディレクトリを作成して、このプロジェクト専用の venv 環境を作成します。
(venv 環境新規構築)
$ mkdir -p ~/work-with-python2.7
$ cd ~/work-with-python2.7
$ ${INSTALL_DEST_DIR}/python${version}/bin/virtualenv venv
Python3.5 環境構築
Python3.5 で venv を利用するには、ビルド後にデフォルトでインストールされる pyvenv コマンドで venv 環境を新規構築します。
ビルド
Python のソースコードを公式サイトからダウンロードしてビルドします。
$ version="3.5.2"
$ mkdir -p ~/src
$ cd ~/src
$ curl -LO https://www.python.org/ftp/python/${version}/Python-${version}.tgz
$ tar fxz Python-${version}.tgz
$ cd Python-${version}
$ ./configure \
--prefix=${INSTALL_DEST_DIR}/python${version} \
--with-ensurepip=install \
--with-threads \
--enable-shared \
LDFLAGS="-Wl,-rpath=${INSTALL_DEST_DIR}/python${version}/lib"
$ make
Ubuntu 14.04 LTS と Ubuntu 16.04 LTS の場合、configure 実行後、最初の make 実行時に下記の様なメッセージが表示されますが、特に問題ありません。
# Substitution happens here, as the completely-expanded BINDIR
# is not available in configure
sed -e "s,@EXENAME@,/opt/python3.5/bin/python3.5m," < ./Misc/python-config.in >python-config.py
# Replace makefile compat. variable references with shell script compat. ones; ->
sed -e 's,\$(\([A-Za-z0-9_]*\)),\$\{\1\},g' < Misc/python-config.sh >python-config
# On Darwin, always use the python version of the script, the shell
# version doesn't use the compiler customizations that are provided
# in python (_osx_support.py).
if test `uname -s` = Darwin; then \
cp python-config.py python-config; \
fi
インストール
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.2/bin/pyvenv-3.5 venv
venv 環境 操作方法
今回の手順で構築した venv 環境はどちらも同じ手順で操作できます。
venv 環境有効化
$ source venv/bin/activate
venv 環境の Python のバージョン確認
(venv)$ python --version
Python 2.7.11
venv 環境無効化
(venv)$ deactivate
おわりに
お気づきかもしれませんが、Python 2.7 のインストール手順と Python 3.5 のインストール手順を比較すると、Python 本体のインストールまではほとんど共通であることがわかると思います。違うのは venv 環境を新規作成するためのコマンド virtualenv と pyvenv くらいでしょうか。
一度 venv を作成してしまえば、あとは venv 環境内で pip install などを実行しても、その venv 環境の外には影響がありません。開発前に、使用する pip パッケージを選定・評価する場合などにも便利に利用できます。
ここで作成した venv 環境を Nginx にデプロイする手順も追って紹介したいと思います。