Engineer in Tokyo

ipython と virtualenv を同時に使う方法

概要

python の皆さんはみんな使っている ipython は virtualenv を使う時に virtualenv に入っているモジュールをインポートできないことが起こります。 ipython は特に virtualenv に対応していないわけです。 ipython をグローバルじゃなくて、virtualenv 毎にインストールすると解決できるのですけど、 ipython を落とすのが重いし、PIP_DOWNLOAD_CACHE ( pipを使うべきだぞ ) を使わない限り、絶対にイライラする。

ipython と virtualenv を使う方法第一

ということで、第一方法は PIP_DOWNLOAD_CACHE を設定して、virtualenvを作る時に、virtualenvwrapper (virtualenvwrapperも使うべきだぞ)のフックを使ってipythonを自動的にインストールする。自分の virtualenvディレクトリ(WORKON_HOME) に postmkvirtualenvというスクリプトを入れると、環境を作った後に実行してくれます。それで、作るときに、毎回ipython入れます。

自分の.bashrcかどこかで、PIP_DOWNLOAD_CACHEを設定する。これで、一回ダウンロードしたら、毎回ダウンロードしなくてもいい。

PIP_DOWNLOAD_CACHE=~/.pip_cache

それから、${WORKON_HOME}/postmkvirtualenv にこう書きます。

# virtualenv毎に pip をインストールする場合
#easy_install pip

pip install ipython

# pudb も便利かもよ
#pip install pudb

それで、mkvirtualenv hogehoge を実行するときにvirtualenvをちゃんと使うipythonをインストールしてくれます。

ipython と virtualenv を使う方法第二

ipythonはPythonで書くユーザ設定ファイル機能があります。それを使えば、PYTHONPATHをいじれたりすることができるので、それでvirtualenvを使うこともできます。ユーザ設定は ~/.ipython/ipy_user_conf.pyに入っています。

こう書きます。

# Most of your config files and extensions will probably start with this import
import os

import IPython.ipapi
ip = IPython.ipapi.get()

# You probably want to uncomment this if you did %upgrade -nolegacy
# import ipy_defaults

def main():
    # Handy tab-completers for %cd, %run, import etc.
    # Try commenting this out if you have completion problems/slowness
    # import ipy_stock_completers

    # uncomment if you want to get ipython -p sh behaviour
    # without having to use command line switches

    # import ipy_profile_sh


    o = ip.options
    # An example on how to set options
    #o.autocall = 1
    o.system_verbose = 0

    import_all("os sys")
    execf('~/.ipython/virtualenv.py')

# some config helper functions you can use
def import_all(modules):
    """ Usage: import_all("os sys") """
    for m in modules.split():
        ip.ex("from %s import *" % m)

def execf(fname):
    """ Execute a file in user namespace """
    ip.ex('execfile("%s")' % os.path.expanduser(fname))

main()

main()の中、virtualenv.pyという設定ファイルを呼び出す。virtualenv.pyというファイルはこう書きます。

import site
from os import environ
from os.path import join
from sys import version_info

if 'VIRTUAL_ENV' in environ:
    virtual_env = join(environ.get('VIRTUAL_ENV'),
                       'lib',
                       'python%d.%d' % version_info[:2],
                       'site-packages')
    site.addsitedir(virtual_env)
    print 'VIRTUAL_ENV ->', virtual_env
    del virtual_env
del site, environ, join, version_info

これで、VIRTUAL_ENVという環境変数が設定してある場合、それをPythonのサイトディレクトリとして登録する。

これで、ipythonを実行するときに こうなるはず。

土  5月 08 10:22:57
ian@macbook-ian:~$ workon django-hgwebproxy
(django-hgwebproxy)土  5月 08 10:23:15
ian@macbook-ian:~$ ipython
VIRTUAL_ENV -> /home/ian/.virtualenvs/django-hgwebproxy/lib/python2.6/site-packages
Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15)
Type "copyright", "credits" or "license" for more information.

IPython 0.10 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object'. ?object also works, ?? prints more.

In [1]:

ここに、VIRTUAL_ENV -> /home/ian/.virtualenvs/django-hgwebproxy/lib/python2.6/site-packagesが出て、virtualenv を使っていることが確認できる。

それでは、それでは、