Python + pipenv + DjangoをPyCharmで開発する

## pipenv
簡単に言えば、複数のプロジェクトでpipを使う際にバージョン関係などを管理してくれるものです。pythonだと`pyenv`、rubyなら`rbenv`などがあります。

## 環境
* Mac
* Python(pyenv)
* pip

Pythonはpyenvを使っています。pyenvについては省略します。

```
# pyenvのバージョン
nomunomu:virtual_pip nomunomu$ pyenv --version
pyenv 1.2.8

# Pythonのバージョン
nomunomu:virtual_pip nomunomu$ python --version
Python 3.5.2

# pipのバージョン
nomunomu:virtual_pip nomunomu$ pip --version
pip 9.0.1 from /Users/nomunomu/.pyenv/versions/3.5.2/lib/python3.5/site-packages (python 3.5)
```

## 手順
### pipenvのインストール

```
$ pip install pipenv
```

### pipenvで仮想環境を作成
```sh
$ cd Desktop/
$ mkdir virtual_pip      # 検証用ディレクトリの作成
$ cd virtual_pip         # 検証用ディレクトリに移動
$ pipenv install         # 仮想環境 と Pipfile を作成
$ ls -a
.       ..      .venv       Pipfile     Pipfile.lock
```

`pipenv install`で扱われるPythonのバージョンは、そのディレクトリで認識しているPythonのバージョンとなります。そのためディレクトリごとにPythonのバージョンを変更したい場合には、pyenvなどで`pyenv local x.xx.xxx`して、各自設定しておいてください。

`Pipfile`や`Pipfile.lock`は`Gem`と同様で`Gemfile`, `Gemfile.lock`と同じように扱います。そのためインストールしたいものがあれば、`Pipfile`に記述するか、コマンドでインストールすることになります。

仮想環境に入る場合には

```
$ pipenv shell
```
で、仮想環境に入る事ができます。

### ライブラリ群のインストール
ライブラリのバージョンを指定する場合にはバージョンを`==`の後に指定すればOKです

```
nomunomu:virtual_pip nomunomu$ pipenv install requests django==1.11.16 djangorestframework django-filter

Installing requests…
Adding requests to Pipfile's [packages]…
Installing django==1.11.16…
✔ Installation Succeeded 

Adding django to Pipfile's [packages]…
Installing djangorestframework…
✔ Installation Succeeded 

Adding djangorestframework to Pipfile's [packages]…
Installing django-filter…
✔ Installation Succeeded 

Adding django-filter to Pipfile's [packages]…
✔ Installation Succeeded 

Pipfile.lock (2aa341) out of date, updating to (a79791)…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
✔ Success! 

Updated Pipfile.lock (2aa341)!
Installing dependencies from Pipfile.lock (2aa341)…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 9/9 — 00:00:03
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
```

仮想環境に入って、ライブラリ群が正常にインストールされているか確認します。`pipenv shell`を実行すると`pipenv install`を実行したディレクトリ名の基でShellが起動します。`(virtual_pip) $`みたいな感じで

```bash
$ pwd
/Users/nomunomu/Desktop/virtual_pip

$ pipenv shell
(virtual_pip) bash-3.2$ pip list
Package             Version   
------------------- ----------
certifi             2018.11.29
chardet             3.0.4     
Django              1.11.16   
django-filter       2.0.0     
djangorestframework 3.9.0     
idna                2.7       
pip                 18.1      
pytz                2018.7    
requests            2.20.1    
setuptools          40.6.2    
urllib3             1.24.1    
wheel               0.32.3  
```
依存パッケージも同時にインストールされているので、実際に指定したライブラリより多くなっているはずです。

## Djangoプロジェクトの作成
Djangoプロジェクトは仮想環境から作成します。そのため、作業する前に仮想環境に入っておきます。

```
$ pipenv shell
(virtual_pip) bash-3.2$
```

今回作成するDjangoプロジェクトの名前を`django-sample`としておきます。

```
(virtual_pip) bash-3.2$ django-admin startproject django_sample
```

作成が完了したら、一旦仮想環境を抜けて、仮想環境が保存されているパスを確認します。このパスを次のPyCharmの設定の時に使うのでメモかコピーをしておいてください。

```
(virtual_pip) bash-3.2$ exit
exit

$ pipenv --venv
/Users/nomunomu/.local/share/virtualenvs/virtual_pip-zYG2eaTO
```
`pipenv --venv`によって出力されるパスはそれぞれ異なりますので、この記事のを指定しても正常に動作しません。

## PyCharmのセッティング
PyCharmを起動したら、起動画面より`Open`を選択して作成したDjangoプロジェクトを選択します。この時選択するのは`pipenv --venv`で出力されたものではなく、Djangoプロジェクト本体です。この記事では`/Users/nomunomu/Desktop/virtual_pip/django_sample`になります。

<img width="779" alt="スクリーンショット 2018-12-09 23.18.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/110131/9c47b8f9-7007-e955-f847-4f57a5e9d804.png">

プロジェクトを開いたら、`Command + ,`でPreferenceを開きます。そしたら、検索のところで`project interpreter`と打ち込むと以下のような画面がでてきます。この画面で、右上のギアマークを選択し、`Add Local`を選択します。
<img width="1134" alt="スクリーンショット 2018-12-09 23.21.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/110131/bf6c39d5-61eb-c47a-3433-3481544442fc.png">

そうしたら、フォルダ選択画面になるので、先ほどメモしたディレクトリまで移動します。そのフォルダの中に`bin`フォルダが存在していて、その中に`python`というファイルが存在します。そのファイルを選択して、OKします。
<img width="536" alt="スクリーンショット 2018-12-09 23.32.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/110131/5fc2176d-b32e-af4d-a762-69d61359d1ec.png">

そうすると、`Project Interpreter`の画面がこのような感じに変わると思います。
<img width="1090" alt="スクリーンショット 2018-12-09 23.35.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/110131/804eaee3-28da-22f8-1756-2c718d129bb2.png">

ウィンドウ右下のOKを押すと、このプロジェクトをPyCharmで開くと自動的に仮想環境の設定を読み込んでくれるようになります。なので、PyCharm付属のターミナルを設定後に開くと、自動的に仮想環境内でターミナルを開いているのと同じ状態になります。
<img width="1552" alt="スクリーンショット 2018-12-09 23.41.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/110131/821c86a0-b483-3e20-007b-17ea1ff57f8e.png">

これによって自動的にデバッグも仮想環境のDjangoを使って起動する事ができます。
<img width="1183" alt="スクリーンショット 2018-12-09 23.44.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/110131/9f43b8dc-faad-ec06-da5f-cca685896d0e.png">

## まとめ
とりあえず、この設定方法さえできてしまえば、複数プロジェクトでバージョンの異なるライブラリを利用する時にも、簡単に複数のpipを共存させる事ができます。以上です！