Pipenvを用いたPythonの環境構築

Pipenvについての記事が少ないので、ユーザーが増えることを願って投稿します。間違っている所があれば教えて頂けると嬉しいです。

# Pipenvとは

Pythonを用いたアプリケーション開発のための環境構築は
1. ライブラリ依存関係の管理
2. 仮想環境の構築

以上で分けてみるとわかりやすいです。つまり、2つのツールを使うことになりますが、それらを一つにしたのがpipenvです。

## 1. ライブラリ依存関係の管理
ライブラリは、依存関係というものが存在します。「aライブラリは、bライブラリを使用している。そのため、aライブラリを使いたければbライブラリのインストールが必要になる」といったものです。しかし、話はインストールすれば終わりではなく「aライブラリのバージョンを上げた。運悪くそれが原因で、bライブラリに不具合が出た（動かなくなった）。またcライブラリは、bに依存しているため、bライブラリに不具合が出るとcライブラリも不具合が出る」といったことがありえます。そのために依存関係を管理してくれるのがpipです。

## 2. 仮想環境の構築
プロジェクトによって「このプロジェクトではaライブラリはこのバージョンを使って、bライブラリではあのバージョンを使って」ということがあります。また、パソコンのシステムを汚したくない、ということもあるでしょう。そのために仮想環境を構築します。環境を別個に分離でき、不要になったときもディレクトリ削除でことが済みます。それを実現するのがvirtualenvです。

それらを一つのコマンドで操作したい場合に使うツールです。

# 実際に使ってみる

## 1. 仮想環境を構築

実際にコマンドを用いて、説明に入っていきます。

pipenvのインストールがすでにされているかどうか、バージョンで確認。

```shell
# 数字が出ればインストールはされています。
$ pipenv --version
```

もしインストールがされていなければ、以下のコマンドでインストール可能です。

```shell
# homebrewを用いた場合。
$ brew install pipenv

# pipを用いた場合。
$ pip install pipenv
```

実際にpipenvを使ってみましょう。何かしらディレクトリを作って、そのディレクトリ内で以下のコマンドを実行します。

```shell
# qiitaディレクトリを作成します。
$ mkdir qiita

# qiitaディレクトリに移動します。
$ cd qiita

# 仮想環境の構築（※Pipfileがあった場合には、Pipfileの内容で仮想環境を構築します）をします。
$ pipenv install

# どのようなファイルが作成されたか確認してみましょう。
$ ls
```

以上の作業で、PipfileとPipfile.lockが作成されました。どのような内容なのか、確認してみます。
Pipfileの中身は以下のような状態になっています。

```toml

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages]

[dev-packages]

[requires]
python_version = "3.6"
```

Pipfile.lockの中身は以下のような状態になっています。


```json
{
    "_meta": {
        "hash": {
            "sha256": "4e55147db217bb4120f6e68cb8cad7bc37011457441ce0eb9d97308315625834"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.6"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.python.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {},
    "develop": {}
}
```

上述のとおり、Pipfileがカレントディレクトリに無い状態で $ pipenv install コマンド実行をすると、ほぼ空っぽの状態のPipfileとPipfile.lockが作成されます。それぞれのファイルの役割ですが、

- Pipfile => 設定ファイル
- Pipfile.lock => インストールしたライブラリの情報

という構成になっています。 2つのファイルでpipで言う　requirements.txt　の代替をすると考えていただければわかりやすいでしょう。仮想環境のシェルに入ります。 .venv があるディレクトリで以下のようにコマンドを実行してください。

```shell
# シェルに入ります。
$ pipenv shell

# 仮想環境内のPythonのバージョンを確認します。
$ python --version
```

以上で仮想環境が使えるようになりました。

## 2. ライブラリ管理

次に、Pipenvを用いてライブラリの管理をしてみましょう。まずライブラリを追加してみます。ここでは、例として django を追加します。

```shell
# Djangoライブラリを追加
$ pipenv install django
```

Pipfile.lockがインストール済みライブラリの情報が記述されているはずなので、確認してみます。以下のようにPipfle.lockが更新されました。

```json
{
    "_meta": {
        "hash": {
            "sha256": "e0eba63583a7777ad2aec379073e7fbabad9eb003c979b8cd4a85f63f7374a8f"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.6"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.python.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {
        "django": {
            "hashes": [
                "sha256:26b34f4417aa38d895b6b5307177b51bc3f4d53179d8696a5c19dcb50582523c",
                "sha256:71d1a584bb4ad2b4f933d07d02c716755c1394feaac1ce61ce37843ac5401092"
            ],
            "index": "pypi",
            "version": "==2.0.5"
        },
        "pytz": {
            "hashes": [
                "sha256:65ae0c8101309c45772196b21b74c46b2e5d11b6275c45d251b150d5da334555",
                "sha256:c06425302f2cf668f1bba7a0a03f3c1d34d4ebeef2c72003da308b3947c7f749"
            ],
            "version": "==2018.4"
        }
    },
    "develop": {}
}
```

※djangoの依存関係にあるpytzライブラリも同時にインストールされています。

逆にアンインストール作業をするには、下記のコマンドです。ここでも、djangoをアンインストールしてみます。

```shell
$ pipenv uninstall django
```

ここでは割愛しますが、djangoライブラリとpytzライブラリの両方がアンインストールされていることを、Pipfile.lockを見て確認してみてください。

また、ライブラリの依存関係含め、ライブラリ全体のバージョンアップをするときは、以下のコマンドを実行します。

```shell
$ pipenv update
```

## 3. 仮想環境内でのコマンドの実行方法

基本的にrunコマンドのあとに、コマンドは実行する必要があります。具体例としては、以下のようになります。

```shell
# hoge コマンドを仮想環境内で引数 fuga をつけて実行する場合
$ pipenv run hoge fuga 
```

# まとめ
ここまでで、仮想環境構築、ライブラリ管理、仮想環境内でのコマンド実行についてまとめました。発展的内容に関しては、公式サイトをご覧いただくのがベストです。

[Pipenv公式](https://docs.pipenv.org/ "Pipenv公式")