virtualenvを使ってPython2.5とDjango0.96が動く環境を作ってみる

【追記】紛らわしそうなのでタイトル変更しました。

注意
これはvirtualenvを試しに使ってみるためにむりやりGAE用の〜とこじつけているだけで、実際にここで作った環境で即GAEのプロジェクトを始めることができるわけではないです。virtualenvのチュートリアルだと思っていただけると幸いです。

virtualenvって何?

最近(結構前から?)何かと話題のPythonモジュールvirtualenv
こいつを使うと、一つのマシン上で異なるPythonの環境を簡単に作ることができるらしい。
例えばあるプロジェクトはPython2.6で開発、あるプロジェクトはPython3.1で開発、みたいなことを簡単にできる。
しかも、各環境にインストールされているサードパーティー製のライブラリを設定したファイルを作ることで、それを使って同じ環境を他のマシンに構築することなどもできる。プロジェクトに新しくメンバーが加わった時などに便利そうだ。(Creating Your Own Bootstrap Scriptsを参照)

Django on GAE

Google App Engine(GAE)が世に出て2年近くが経ったがGAEではPython2.5じゃなきゃいけない。PCに入っているのはPython2.6だ。変な所で干渉したりしたらどうしよう。そういえばGAEではDjango 0.96が動くけど、PCのはv1.1だなぁ...
こういう時こそvirtualenvの出番じゃないですか!
というわけで、virtualenvを使ってPython 2.5.5とDjango 0.96.5が動く仮想環境を作ってみたいと思います。

virtualenvのインストール

僕のPCに入っているのはPython 2.6.5でした。まずは2.6.5にvirtualenvをインストールします。あと、virtualenvが便利になるvirtualenvwrapperというのもインストール。

$ python -V
Python 2.6.5
$ sudo pip install virtualenv
$ sudo pip install virtualenvwrapper
$ which virtualenv
/usr/local/bin/virtualenv
$ which virtualenvwrapper.sh
/usr/local/bin/virtualenvwrapper.sh

Python 2.5のインストール

Ubuntu 10.04LTSを使っていますが、apt-getで2.5をインストールしようとしたら

$ sudo apt-get install python2.5
パッケージ python2.5 はデータベースには存在しますが、利用できません。
おそらく、そのパッケージが見つからないか、もう古くなっているか、
あるいは別のソースからのみしか利用できないという状況が考えられます
E: パッケージ python2.5 にはインストール候補がありません

と言われたので、諦めてソースからいれることにしました。

$ wget http://www.python.org/ftp/python/2.5.5/Python-2.5.5.tar.bz2
$ tar -jxf Python-2.5.5.tar.bz2
$ cd Python-2.5.5
$ ./configure
$ make
$ sudo make install
...
$ which python2.5
/usr/local/bin/python2.5
$ python2.5 -V
Python 2.5.5

Python2.5用の仮想環境を作成する

virtualenvをインストールしたらvirtualenvというコマンドが使えるようになります。普通はこれを使って仮想環境を作りますが、今回はいきなりvirtualenvwrapperを使った*便利*な方で作っていきます。
まず、virtualenvwrapperを使うにはインストールされたvirtualenvwrapper.shを読み込む必要があります。なので、.bashrcなり.zshrcなりに以下を追加します。

#export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

WORKON_HOMEで指定されるディレクトリがvirtualenvの設定ファイルが置かれる場所になります。もし.virtualenvsディレクトリ以外の場所にしたい場合は指定しなおす必要があります。今回はデフォルトのまま.virtualenvsディレクトリにします。ディレクトリを作ってシェルを再読み込みしましょう。

$ mkdir ~/.virtualenvs
$ zsh
...

次は仮想環境を作成します。djgaeという名前のpython2.5を使用する環境を作ります。

$ mkvirtualenv --python=/usr/local/bin/python2.5 djgae
...
$ cd ~/.virtualenvs/djgae
$ ls
bin/    include/    lib/
$ ls bin/
activate        activate.fish        easy_install*        get_env_details*  pip-2.6*         postdeactivate*  predeactivate*
activate.csh  activate_this.py  easy_install-2.6*  pip*                     postactivate*  preactivate*       python*
$ bin/python -V
Python 2.5.5
$ # mkvirtualenvを実行すると、そのまま作成した環境に入る。なので...
$ which python
/home/yuku_t/.virtualenvs/djgae/bin/python
$ # 当然pipも...
$ which pip
/home/yuku_t/.virtualenvs/djgae/bin/pip

djgaeにDjango 0.9.6などをインストール

以上でとりあえず仮想環境が動き始めたので、あとはpipを使ってどんどん必要なライブラリをインストールしていけばいいわけですが、せっかくなのでpipのrequirement機能を使ってみましょう。(これはvirtualenvのbootstrap機能とは別ものです)
次のようなrequirements.txtを作成します

$ cat requirements.txt
# PyPIに登録されている中で最新のものを取ってくる
mysql-python # GAEでは不要
# バージョンを指定する場合は以下のようにする。
#Django == 0.96.5
# 今回はPyPIに0.96.5が登録されていないため以下のように直接ダウンロードURLを指定する。
# ただしtar.gzで圧縮され、setup.pyを含んでいないとだめらしい
http://www.djangoproject.com/download/0.96.5/tarball/
$ pip install -r requirements.txt
...
$ pip freeze
Django==0.96.5
MySQL-python==1.2.3
wsgiref==0.1.2

この時sudoで実行しないように気をつけましょう。sudoを使うとPATHが異なるため、仮想環境外のpipを実行してしまう可能性があります。調べてみたら、PIP_RESPECT_VIRTUALENV環境変数にtrueを設定するとvirtualenvの中にpipが空気を読んでインストールしてくれるようになるみたい。なので.zshrcなどに

export PIP_RESPECT_VIRTUALENV=true

と書いておくと幸せになれるのかも。

Django 0.96.5 プロジェクトを作ってみる

ここまでで必要な準備がだいたいそろいましたが、インストールした瞬間ではdjango-admin.pyが仮想環境外のやつを参照しているので、djgaeを再読み込みします。すると

$ workon djgae
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named virtualenvwrapper.hook_loader
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named virtualenvwrapper.hook_loader

といわれました。どういうわけかdjgaeにもあらためてvirtualenvwrapperを入れる必要があるようです。(もしかしたらやり方を間違えているだけかも)

$ pip install virtualenvwrapper
$ workon djgae
$ django-admin.py --version
0.96.5

これで晴れてDjangoプロジェクトを作成する準備が整いました。

$ django-admin.py startproject myproject
$ cd myproject
$ python manage.py runserver
Validating models...
0 errors found.

Django version 0.96.5, using settings 'myproject.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

仮想環境から出る

最後にdjgaeを終了しましょう。

$ deactivate

これでOK。再び入る時は

$ workon djgae

Google App Engine

こうしてPython2.5.5の環境にDjango0.96.5が入りました。
実際にGAEのコードを書く場合はSDKとかを使うのでこのままではダメ(というか、SDKに付属してるDjangoを使うことになる)なのですが、こんな感じでvirtualenvは使うものなんだなぁ、ということが分かったのでよしとしといてください。
余力があれば、そのうちvirtualenv上でGAEのSDKを動かしてみようと思います。