pythonz+direnvでMacのPython開発環境を構築してみた


# はじめに
この記事は[Hamee Advent Calendar 2015](http://qiita.com/advent-calendar/2015/hamee)の17日目の記事です。

主に自分用の作業メモとして`Mac`で`pythonz`と`direnv`を使って`Python`の開発環境を構築する手順をまとめてみました。

ここでは、例としてディレクトリ`~/dev/myproject`でバージョン`3.5.0`の`Python`を使用するための設定をしていきます。また、`bash`で環境構築した手順について説明していますので、必要に応じてご自身が使用しているシェルに置き換えてお読みください。

## `pythonz`とは

色々なバージョンの`Python`をユーザのホームディレクトリにインストールできるツールです。詳細は[こちら](https://github.com/saghul/pythonz)をご覧ください。

## `direnv`とは

ディレクトリごとに環境を切り替えるためのツールです。詳細は[こちら](https://github.com/direnv/direnv)をご覧ください。

# 下準備

`pythonz`と`direnv`を使用するために必要なツール・ライブラリ等がいくつか存在するので、事前に以下のインストールを済ませておいてください。

## コマンドラインツール
`pythonz`を使用するためにコマンドラインツールが必要です。

```sh
$ xcode-select --install
```

を実行し、[インストール]を選択してインストールしてください。

## `homebrew`

`direnv`のインストールに`homebrew`を使用するので、

```sh
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

を実行して`homebrew`をインストールしてください。

## `virtualenv`

`direnv`を実行するのに`virtualenv`という`Python`のモジュールが必要なので、

```sh
$ sudo pip install virtualenv
```

を実行して`virtualenv`をインストールしてください。もし`pip`が使用できない場合は、先に

```sh
$ sudo easy_install pip
```

を実行して`pip`をインストールしてください。

# `pythonz`と`direnv`のインストール

## `pythonz`のインストール
```sh
$ curl -kL https://raw.github.com/saghul/pythonz/master/pythonz-install | bash
```

を実行して`pythonz`をインストールします。（`~/.pythonz`にインストールされます。）

次に、以下のコマンドを実行して`~/.bashrc`に必要な設定を追記します。

```sh
$ echo '[[ -s $HOME/.pythonz/etc/bashrc ]] && source $HOME/.pythonz/etc/bashrc' >> ~/.bashrc
```


## `direnv`のインストール
`homebrew`を使って`direnv`をインストールします。`direnv`をインストールするには以下のコマンドを実行します。

```sh
$ brew install direnv
```

インストールが完了したら、以下のコマンドを実行して`~/.bashrc`に`hook`を追加します。（`bash`以外のシェルを使用している場合、適宜読み替えてください。）

```sh
$ echo 'export EDITOR={使用するエディタ}' >> ~/.bashrc
$ echo 'eval "$(direnv hook bash)"' >> ~/.bashrc
```

これらの設定を有効にするために

```sh
$ source ~/.bashrc
```

を実行してください。また、もし`~/.bash_profile`というファイルが存在して
いない場合は、以下の内容の`~/.bash_profile`を作成してください。

```bash:~/.bash_profile
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
```


# 環境構築

## `pythonz`で任意のバージョンの`Python`をインストール
```sh
$ pythonz list --all
```
を実行すると、`pythonz`でインストールできる`Python`のバージョンの一覧が以下のように表示されます。

```sh
# Available Python versions
  # cpython:
     3.1.3
     3.1.2
     3.1.5
     3.1.4
     2.4.3
...
```

任意のバージョンの`Python`をインストールするには

```sh
$ pythonz install {インストールしたいバージョン}
```

を実行してください。バージョン`3.5.0`の`Python`をインストールするには

```sh
$ pythonz install 3.5.0
```

を実行します。（`~/.pythonz/pythons/CPython-3.5.0`にインストールされます。）

ちなみに、`pythonz`を使用してインストールされた`Python`のバージョン一覧は

```sh
$ pythonz list
```

を実行することで確認できます。（以下のように表示されます。）

```sh
# Installed Python versions
  CPython-3.5.0
```

その他の使い方については

```sh
$ pythonz help
```

を実行して確認してみてください。


## `direnv`で環境変数の設定
まず、以下のコマンドを実行してください。

```sh
$ direnv edit ~/dev/myproject
```

すると`export EDITOR={使用するエディタ}`で指定したエディタが起動するので、環境変数の設定を書き込みます。先ほど`pythonz`でインストールしたバージョン`3.5.0`の`Python`をこのディレクトリで使用するには、以下の設定を記述してください。（この設定は`~/dev/myproject/.envrc`に保存されます。）

```bash:~/dev/myproject/.envrc
layout python $(pythonz locate 3.5.0)
```

設定が完了したら`~/dev/myproject`ディレクトリに移動します。すると、環境の初期化が行われるかと思います。もし初期化されずに

```sh
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
```

のようなメッセージが出力されてしまった場合は

```sh
$ direnv allow
```

を実行することで初期化されるかと思います。

以上で`~/dev/myproject`でバージョン`3.5.0`の`Python`を使用するための設定が完了しました。今後は、このディレクトリに移動すればバージョン`3.5.0`の`Python`が使用できます。


## ディレクトリごとに使用される`Python`のバージョンを確認
本当に`~/dev/myproject`でバージョン3.5.0の`Python`が使用できるかを確認してみます。

まずは現在のディレクトリ（`~/dev/myproject`）で

```sh
$ python --version
```

を実行します。すると

```sh
Python 3.5.0
```

と表示されるかと思います。次に、この設定が現在のディレクトリでのみ有効かどうかを確かめるため他のディレクトリに移動して

```
$ python --version
```

を実行してみます。今度は

```sh
Python 2.7.10
```

のように表示され、`~/dev/myproject`以外のディレクトリではバージョン`3.5.0`の`Python`が使用されていない（システムの`Python`が使用されている）ことが確認できるかと思います。


# まとめ
`pythonz`と`direnv`を使用して、任意のディレクトリ（`~/dev/myproject`）で任意のバージョン（`3.5.0`）の`Python`を使用するための設定手順についてまとめました。

このような記事を書くのは初めてなので、至らない点は多々あったかと思います。ですが、この記事が少しでも ~~社内のPython使いの人口を増やすきっかけになれば~~ 自分以外の誰のお役に立てば幸いです。