virtualenvでpython環境を管理する

## はじめに

pythonには`virtualenv`という仮想環境が簡単に作れるモジュールがある。お試しに何かモジュールをインストールしたい場合、`virutalenv`で環境を作ってそちらにインストールして試せば、システム環境は無傷で使える。いくつも環境が作れるのでpythonのバージョンで分けたりと色々と便利なのだ。
気に入らなければその環境を消すか使わなければいいだけ。

`virtualenv`とそれを簡単に管理できる`virtualenvwrapper`をセットで導入するのが便利なのでそちらをメモ。

- ubuntu14.04
- Mac OSX Yosemite（10.10.3）

## install and setup

### ubuntu

```sh
# pipがなければインストール
$ sudo apt-get install python-pip
# pythonを使うなら依存関係でエラーが出るかもしれないのでこちらもインストール
$ sudo apt-get install python2.7-dev

# virtualenv / virtualenvwrapperのインストール
$ sudo pip install virtualenv
$ sudo pip install virtualenvwrapper
```

### mac

Macは`pip`は最初から使えるはず。

```sh
# virtualenv / virtualenvwrapperのインストール
$ sudo pip install virtualenv
$ sudo pip install virtualenvwrapper
```

## setup

`virtualenvwrapper`を使うには以下のスクリプトを`bashrc`に追加する必要がある。

```sh
$ vim ~/.basrhc  # macは`~/.bash_profile`
    source /usr/local/bin/virtualenvwrapper.sh
    export WORKON_HOME=~/.virtualenvs
```

## 使ってみる

### 作成

オプションは色々とあるが、システムのまっさらな状態で使ってみたいので、基本的に自分は`--nosite-package`のみつける。

```sh
# mkvirtualenv <option> <環境名>
$ mkvirtualenv --no-site-package hoge
    # --never-download        : ネットワークからDLをしない
    # --system-site-packages  : インストール済みモジュールを使用する
    # --no-site-packages      :  インストール済みモジュールを全て外した状態で仮想環境が作成される

# 作成されるとコマンドプロンプトに一番左に環境名が追加される
(hoge)$
```


### 作成した環境ディレクトリを確認

- 環境ディレクトリに移動

```sh
(hoge)$ cdvirtualenv
# ディレクトリを調べてみる
(hoge)$ pwd
    /home/hoge/.virtualenvs/hoge
# 中身はこんな感じ
(hoge)$ ls
    bin  include  lib  local
```

### モジュールをインストールしてみる

- `git`でバックアップをとって他のモジュールをインストールしてみる

```sh
# 環境全体をローカルgitにコミットしておく
(hoge)$ git init; git add -A; git commit -a -m "init"
# 何かと便利な`Twisted`モジュールをインストールしてみる
(hoge)$ pip install twisted
```
- `git`で差分を見てみると、いろいろ新しく追加されている。

```sh
(hoge)$ git status
     On branch master
    # Untracked files:
    #   (use "git add <file>..." to include in what will be committed)
    #
    #	bin/cftp
    #	bin/ckeygen
    #	bin/conch
    #	bin/lore
    #	bin/mailmail
    #	bin/manhole
    #	bin/pyhtmlizer
    #	bin/tap2deb
    #	bin/tap2rpm
    #	bin/tapconvert
    #	bin/tkconch
    #	bin/trial
    #	bin/twistd
    #	lib/python2.7/site-packages/Twisted-15.1.0-py2.7.egg-info/
    #	lib/python2.7/site-packages/twisted/
    #	lib/python2.7/site-packages/zope.interface-4.1.2-py2.7-nspkg.pth
    #	lib/python2.7/site-packages/zope.interface-4.1.2-py2.7.egg-info/
    #	lib/python2.7/site-packages/zope/
    #	pip-selfcheck.json
    #
```

- 早速インストールしたモジュールを使ってみる

```sh
# importできる
(hoge)$ python -c "import twisted"
```

- 環境を離れて使ってみる

```sh
# 環境の停止
(hoge)$ deactivate
# 元のシステムで使ってみるとエラーが出る
$ python -c "import twisted"
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    ImportError: No module named twisted
```

これにより、システム環境にはインストールされていないことがわかる。


## よく使うコマンド一覧

### `deactivate` : 環境の停止

```sh
# 環境の停止
(hoge)$ deactivate
$
```

### `workon` : 環境に移行する

すでに環境があるならば`workon`コマンドでその環境に移行することができる

```sh
$ workon hoge
(hoge) $
```

### `lssitepackages` : インストールしたパッケージ一覧

```sh
(hoge)$ lssitepackages
    Twisted-15.1.0-py2.7.egg-info  pip-6.1.1.dist-info        zope
    _markerlib                     pkg_resources              zope.interface-4.1.2-py2.7-nspkg.pth
    easy_install.py                setuptools                 zope.interface-4.1.2-py2.7.egg-info
    easy_install.pyc               setuptools-15.0.dist-info
    pip                            twisted
```

### `rmvirtualenv` : 環境を消す

フォルダをまるごと消しても事は済むのだが、もちろん環境を削除するコマンドもある。

```sh
$ rmvirtualenv hoge
```

## おしまい

これ使っていていいのは、色々と試しても環境ごと削除すれば綺麗さっぱりできる。ドジな自分にはもってこいな環境なのである (;^_^