MacでPythonの開発環境構築をわりと楽にできる方法（2018年版）

![python_environment.png](https://qiita-image-store.s3.amazonaws.com/0/303786/adedad31-6c51-eb4f-710b-986fa007ee7e.png)
[“Python Environment” by xkcd](https://xkcd.com/1987/)

# はじめに

* Pythonの仮想環境が作れるツールが多い。
* Pythonがインストールできる方法が多い。
* パッケージのインストールやプロジェクトの依存を管理してくれるツールも多い。
* あまり時間がないけど、とりあえずPythonの開発環境をいい感じにしたい。

# 参考にした記事

* [Why you should use pyenv + Pipenv for your Python projects](https://hackernoon.com/reaching-python-development-nirvana-bb5692adf30c)
* [2018年のPythonプロジェクトのはじめかた](https://qiita.com/sl2/items/1e503952b9506a0539ea)

# こういう環境を作ります

* なるべく公式推薦されているツールを使います。
* SystemのPythonは触らないです。
* 複数の異なるバージョンのPythonをインストールして使い分けることができる環境を作ります。
* プロジェクト毎にパッケージや依存の管理ができる環境を作ります。

# Step 1: pyenv

* pyenvは複数の異なるバージョンのPythonをインストールできるツールです。

## インストール

```
brew install pyenv
```

## 設定

* 以下を`~/.bash_profile`、または`~/.bashrc`に追加

```bash
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

## インストール可能バージョンを表示

```
pyenv install --list
```

## 3.6.6をインストール

```
pyenv install 3.6.6
```

* `$HOME`の下にインストールされます

```
Installed Python-3.6.6 to /Users/chris/.pyenv/versions/3.6.6
```

## グローバルPythonの変更

```bash
# Global Pythonはまだ3.6.6になっていません
$ python --version
Python 2.7.15
# 変更します
$ pyenv global 3.6.6
$ python --version
Python 3.6.6
```

## インストールされているPythonを表示

```bash

$ pyenv versions
  system
* 3.6.6 (set by /Users/chris/.pyenv/version)
```

## 3.7.0も入れて`my_scripts`のPythonに設定する

### 注：以下は`pipenv`を使わない場合の手順。`pipenv`でプロジェクト管理する場合は以下を飛ばします。

```bash
# 3.7.0をインストール
$ pyenv install 3.7.0

# Project Directoryを作る
$ mkdir my_scripts && cd my_scripts

# 最初は3.6.6になっています
$ python --version
Python 3.6.6

# このDirectoryだけ3.7.0に設定
$ pyenv local 3.7.0
$ python --version
Python 3.7.0

# Directoryを変えるだけでバージョンが変わります
$ cd ..
$ python --version
Python 3.6.6
$ cd my_project/
$ python --version
Python 3.7.0
```

# Step 2: pipenv

* プロジェクトやパッケージの管理をやってくれます。
* 公式推薦されています。
  * [参考](https://packaging.python.org/tutorials/managing-dependencies/#managing-dependencies)

## インストール

```bash
# pyenvでインストールしたPythonがGlobal Pythonになっています。
$ python --version
Python 3.6.6

# pipでpipenvをインストール。homebrewを使わないです。
$ pip install -U pipenv

# pyenvでインストールしたPythonのsite-packagesに入ります。
$ pip show pipenv
Name: pipenv
Version: 2018.10.13
Summary: Python Development Workflow for Humans.
Home-page: https://github.com/pypa/pipenv
Author: Kenneth Reitz
Author-email: me@kennethreitz.org
License: MIT
Location: /Users/chris/.pyenv/versions/3.6.6/lib/python3.6/site-packages
Requires: virtualenv, virtualenv-clone, setuptools, pip, certifi
```

## Projectの新規作成を行う
```bash
$ mkdir new_project && cd new_project

$ pipenv install

Creating a virtualenv for this project…
Pipfile: /Users/chris/Workspace/new_project/Pipfile
Using /Users/chris/.pyenv/versions/3.6.6/bin/python3.6 (3.6.6) to create virtualenv…
⠙Already using interpreter /Users/chris/.pyenv/versions/3.6.6/bin/python3.6
Using base prefix '/Users/chris/.pyenv/versions/3.6.6'
New python executable in /Users/chris/.local/share/virtualenvs/new_project-g-JvAQrk/bin/python3.6
Also creating executable in /Users/chris/.local/share/virtualenvs/new_project-g-JvAQrk/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: /Users/chris/.local/share/virtualenvs/new_project-g-JvAQrk
Creating a Pipfile for this project…
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (ca72e7)!
Installing dependencies from Pipfile.lock (ca72e7)…
  🎃   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
```

## パッケージをプロジェクトにインストール

```
pipenv install django
```

## 仮想環境の中でシェルを起動

```
pipenv shell
```

## 仮想環境の中でコマンドを実行

```
pipenv run python manage.py runserver
```

# 注意

* pyenvでインストールしたpythonのpipで入れたpipenvはそのバーションでしか使えないです。

```bash
$ pyenv install 3.6.6

$ pyenv install 3.7.0

$ pyenv global 3.6.6

$ python --version
 Python 3.6.6

$ pip install pipenv

$ pip show pipenv
 Name: pipenv
 Version: 2018.10.13
 Location: /Users/chris/.pyenv/versions/3.6.6/lib/python3.6/site-packages

$ pyenv global 3.7.0

$ pip show pipenv

[沈黙]
```

# 最後に
* 詳しいことは以下の記事に書いてありますのでご参照くださいー
  * [Why you should use pyenv + Pipenv for your Python projects](https://hackernoon.com/reaching-python-development-nirvana-bb5692adf30c)
  * [2018年のPythonプロジェクトのはじめかた](https://qiita.com/sl2/items/1e503952b9506a0539ea)