やりたいこと
Pythonでアプリケーションプログラムを開発するための環境を構築します。
目標は、さしあたり以下のように設定します。
- 開発プロジェクトに応じて、自由にPythonのバージョンやライブラリを変えることができるようにすること
- プロジェクトの切り替えを手軽にできること
- 他のプロジェクトとは異なるバージョンのPythonを導入する際など、開発環境の構築の手間が面倒でないこと
従来、このような用途には、pyenv-virtualenv などが使われてきました。
pyenv-virtualenv は便利なのですが、コマンド引数の与えかたなどがイマイチ私の直観に合ってなかったことから、今回は pythonz , virtualenv, direnv を組み合わせて使うことにします。 direnv を使うことで、Python以外の環境構築にも役に立つというメリットもあります。
各ツールの役割
- pythonz : 様々なバージョンのPythonを、システムで用意されたPythonとは別にインストールします。
- virtualenv : 他とは切り離されたPythonの実行環境を用意します。システムのPython実行環境とは異なるライブラリを導入した実行環境を用意することもできます。(「今日のPython」 の説明がわかりやすい)
- direnv : ディレクトリと環境変数を対応付けます。これによって、プロジェクトのディレクトリに
cd
するだけで、自動的に環境を切り替えることができます。
1. 導入の手順
1-0 導入の準備
Linux環境を想定しますが、他のOSでもほぼ同様の手順で大丈夫だと思います。私は Debian 7 (Wheezy)を使っています。Windowsでこの方法を使う場合はvagrant等で仮想環境を作ると良いでしょう。
前提として、以下の準備ができているものとします。
- シェルとして bash を使っていることを想定します。
- システムに Python がインストールされていること。
- システムに pip (1.6以上)がインストールされていること。 Python 2.7.9以降もしくは3.4以降ならば同梱されているはず。そうでなければ pipの公式サイト を参照してインストールしてください。
- curl (または wget) を使用できること。
- virtualenv, direnv のパッケージがシステムに用意されている場合もありますが、最新のバージョンを導入したいので公式サイトから入手します。
- 新しいPythonやライブラリをコンパイル・インストールするために、Cコンパイラや依存ライブラリがインストールされていることが必要です。
準備の例:
- Debian, Ubuntuなどの場合
$ sudo apt-get install build-essential zlib1g-dev libbz2-dev libssl-dev libreadline-dev libncurses5-dev libsqlite3-dev libgdbm-dev libdb-dev libexpat-dev libpcap-dev liblzma-dev libpcre3-dev curl python-pip
- CentOS, RHELなどの場合
$ sudo yum install zlib-devel bzip2-devel openssl-devel readline-devel ncurses-devel sqlite-devel gdbm-devel db4-devel expat-devel libpcap-devel xz-devel pcre-devel curl
$ curl -L https://bootstrap.pypa.io/get-pip.py | sudo python
1-1 pythonz のインストール
pythonzをインストールする方法としては、以下の二つの方法があります。
- 管理者権限を持つユーザでインストールする
- 一般ユーザでインストールする
ここでは、一般ユーザの権限でインストールを行います。
$ curl -kL https://raw.github.com/saghul/pythonz/master/pythonz-install | bash
$ echo '[[ -s $HOME/.pythonz/etc/bashrc ]] && source $HOME/.pythonz/etc/bashrc' >> $HOME/.bashrc
$ exec $SHELL
このようにすることで、新しいPythonがインストールされる際には、各ユーザのホームディレクトリ内にインストールされるようになります。
1-2 virtualenv のインストール
virtualenv のインストールには pip の使用が推奨されています。
$ sudo pip install virtualenv
pipを使用できない場合や、一般ユーザでインストールを行う場合は、 公式サイト の手順を参照して、ソースコードからインストールするのが良いでしょう。
1-3 direnv のインストール
direnvの公式githubサイトで、OS, CPU種別ごとに実行ファイルが配布されています。
適切な実行ファイルをダウンロードし、PATHが通っているディレクトリにコピーします。
$ curl -L -o direnv https://github.com/zimbatm/direnv/releases/download/v2.5.0/direnv.linux-amd64
$ sudo install direnv /usr/local/bin
$ echo 'type direnv > /dev/null 2>&1 && eval "$(direnv hook bash)" ' >> $HOME/.bashrc
$ exec $SHELL
ここでは管理者権限を持つユーザでインストールしていますが、PATHが通っていればユーザのホームディレクトリ内にインストールしても構いません。
Go言語を使うことができる環境であれば、ソースコードからインストールするのも簡単です。
2. Python開発環境の構築
Python 2.7.9で開発を行う「プロジェクト SandBox」を想定して、新しい開発環境を作る練習をしてみます。
2-1 Python 2.7.9 のインストール
pythonz list -a
でインストールできるPythonのバージョンを確認してから、バージョンを指定してインストールします。
インストールには少し時間がかかるので、気長に待ってください。
$ pythonz list -a
# Available Python versions
# cpython:
2.4
2.4.1
2.4.2
2.4.3
...
$ pythonz install 2.7.9
インストール済みのPythonの一覧は pythonz list
で確認できます。
$ pythonz list
# Installed Python versions
CPython-2.7.9
インストールされたPythonインタープリタの場所は、 pythonz locate バージョン番号
で確認できます。
$ pythonz locate 2.7.9
/home/jnotoya/.pythonz/pythons/CPython-2.7.9/bin/python
もし、インストールしたPythonを直接実行したいならば、シェルのコマンド置換機能を使って
$(pythonz locate バージョン番号 )
のように書くと良いでしょう。$ $(pythonz locate 2.7.9) --version Python 2.7.9 $ $(pythonz locate 2.7.9) -c 'print("Hello, world")' Hello, world
2-2 プロジェクトディレクトリの作成と設定
プロジェクトの開発をその中で行うために、ディレクトリを作成します。プロジェクトディレクトリの名前や場所は自由に決めることができます。
ここでは、ユーザのホームディレクトリに「sand_box」という名前でプロジェクトディレクトリを作成します。
$ pwd
/home/jnotoya
$ mkdir sand_box
プロジェクトディレクトリを作成したら、ディレクトリの設定ファイル .envrc
を作成します。
設定ファイルは direnv edit
コマンドで作成・編集できますが、ここでは簡単にコマンドラインから作成します。
$ echo 'layout python $(pythonz locate 2.7.9)' > sand_box/.envrc
$ direnv allow sand_box
layout python
の後には、pythonzの機能を使ってPythonインタープリタの場所を $(pythonz locate バージョン番号 )
のように指定します。.envrc
はシェルに渡されるので、シェルのコマンド置換機能 $(...)
を使うことができます。
設定ファイルの書き方はdirenvのマニュアルページ等で確認してください。
2-3 開発環境の初期化
作成したプロジェクトディレクトリを初めて訪れると、 virtualenvが自動的に実行され、開発環境の初期化作業が行われます。
初期化作業では、pythonzでインストールしたPythonのインタプリタがプロジェクトディレクトリの中にコピーされます。
$ cd sand_box
direnv: loading .envrc
Running virtualenv with interpreter /home/jnotoya/.pythonz/pythons/CPython-2.7.9/bin/python
New python executable in /home/jnotoya/sand_box/.direnv/python-2.7.9/bin/python
Installing setuptools, pip...direnv: ([direnv export bash]) is taking a while to execute. Use CTRL-C to give up.
done.
direnv: export +VIRTUAL_ENV ~PATH
プロジェクトディレクトリの中で python
コマンドを実行すると、システムに元からあったPythonではなく、初期化作業でコピーされた適切なPythonインタプリタが実行されます。
$ pwd
/home/jnotoya/sand_box
$ type python
python is /home/jnotoya/sand_box/.direnv/python-2.7.9/bin/python
$ python -c 'import sys;print(sys.version)'
2.7.9 (default, Jan 31 2015, 08:18:30)
[GCC 4.7.2]
2-4 ライブラリのインストール
プロジェクトで使用するライブラリを pip
コマンドでインストールします。
プロジェクトディレクトリ内でpipを実行した場合、ライブラリはこの環境でのみ使用されるようにプロジェクトディレクトリの中にインストールされ、システム全体には影響を及ぼさないので、気軽にライブラリをインストールできます。
ここでは、PrettyTableライブラリをインストールしてみます。
$ pwd
/home/jnotoya/sand_box
$ pip install PrettyTable
$ python -c 'import prettytable as pt; help(pt.PrettyTable)'
2-5 開発作業の中断
プロジェクトディレクトリから出ることで、開発作業を中断できます。プロジェクトディレクトリの外では、これまで通りシステムに用意されたPythonインタプリタを使用できます。
$ pwd
/home/jnotoya/sand_box
$ cd ..
direnv: unloading
$ type python
python is /usr/bin/python
$ python --version
Python 2.7.3
2-6 日常の作業
普段は特に環境の切り替えを意識することなく開発作業をおこなうことができるので非常に楽チンです。virtualenvwrapperのように workon, deactivateコマンドで環境の切り替えを行う必要はありません。
上手く動作しないときは、.bashrc
のどこかにpythonzとdirenvの設定読み込みを行う以下のような記述があることを確認してください。
[[ -s $HOME/.pythonz/etc/bashrc ]] && source $HOME/.pythonz/etc/bashrc
type direnv > /dev/null 2>&1 && eval "$(direnv hook bash)"
初期化の後でプロジェクトディレクトリの名前を変更した場合には調整が必要となります。ご注意ください。