私のanaconda重すぎ…？だったのでPipenv使う【Windows10 Python環境構築】

# Anacondaの仮想環境起動めんどくさい

初心者向け記事です。
今までWindowsではインストールするだけで簡単だったのでAnaconda使ってたのですが、重すぎでした。
Windows PCが先日お亡くなり😇になったタイミングでPipenvで環境構築するようにしました。

[👉よく使うコマンド一覧だけ知りたい場合](#補足3-コマンド一覧)

# Pipenvにするといいこと
雑に特徴を説明。

- Anacondaより軽い。すぐ起動する
- ダウンロード用のpipと環境という意味のenvくっついてPipenv。つまりライブラリの管理と仮想環境構築できるってこと
- ファイル渡せば他の人、PCでもすぐ環境作れる
- スクリプト便利に使える


# Pythonをダウンロード
安定版のstableをDLしておくといいと思います。

> https://www.python.org/downloads/windows/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260345/eeda89bc-83ec-9e00-a502-7df859d5503b.png)

記事書いたときにはver 3.9出てますが、3.8入れます。
新しいの入れると動かないライブラリとかあるので、新しければいいというわけではない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260345/66fd6f24-28bf-25cb-7b49-ea76b3384fbe.png)

Add Python バージョン Path ってところにチェック入れておくと便利

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260345/9e33a103-6a75-44cb-46fc-720add26039f.png)

一応これ押しておく。

windowsボタンの横の検索窓のところに
`cmd`って入れるとあの黒い画面出るので`python`と入力して`Python 3.8.7`みたいなのがでればOK。`exit()`で抜けて、`pip`と入力したら

```
Usage:
  pip <command> [options]
```

みたいなのがダーと出てきたらOK


## 一応Update
pipを最新にしときます。管理者として実行しないとエラーになるはずなので
先ほどと同じように`cmd`と打って出てきた表示を
`右クリック→管理者として実行`をしてください

```
C:\WINDOWS\system32> pip install --upgrade pip
```

あとはいらないので閉じてください。

そして、また普通のコマンドプロンプト開く。
※ 最初に開いたコマンドプロンプト開きっぱなしの人は閉じてもう一度起動させる。


# pipenv インストール
Pipenvをインストールします

```
pip install pipenv
```
インストール終わったら、

```
pip env
```

と入力して

```
Usage: pipenv [OPTIONS] COMMAND [ARGS]...

Options:

```

みたいなのがいっぱいでたらOK

# 1. 簡単に使い方説明

Django(WEBアプリのフレームワーク)で初期画面表示させるまでテストとしてやってみます。

プロジェクト保存するフォルダ(今回はdjango)作ってそのフォルダ内でshift押しながら右クリックしてpowershellで起動すると楽に開けます。



```
pipenv --python 3
```

こうすればすでに入っている私の場合はpython 3.8で仮想環境が作れます。
pipfileがつくられて、構成が記述されてます。

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

[packages]

[dev-packages]

[requires]
python_version = "3.8"

```
3.8が入ってますね。


もし、複数のバージョンをすでに入れた場合は

```
pipenv --python 3.9
```

みたいに指定することが可能です。

# 2. インストールする
pipenvで何かを入れるときは`pipenv install 〇〇`です
django入れてみます。

```
pipenv install django
```

## バージョンを指定したい場合
詳細に指定したい場合はこんな感じで。

```
pipenv install django==2.2.16
```

## リポジトリから取得する場合

```
pipenv install git+https://github.com/<ユーザ>/<リポジトリ>.git@<リビジョン>#egg=<パッケージ名>
```

# 3. 仮想環境に入る
仮想環境に入ります。普段はここからやればOK

```
pipenv shell
```

あとは普通に開発できます。仮想環境から抜けるときは、

```
exit
```

とりあえず環境構築するだけならここで完了です。

## 実践： Djangoを試してみる
WEBアプリのフレームワーク使ってテストしてみます。
`pipenv shell`した後に

```
django-admin startproject testapp .
python manage.py runserver
```

> http://127.0.0.1:8000/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260345/d8ce6b0d-6615-06fd-614e-60ed86b5eaae.png)

はい、OK

# 4. Pipfile，Pipfile.lockで、他の人、PCの環境を一瞬で構築
すでに誰かが環境構築していて、gitとかから取得した場合などに使う。

## Pipfileから環境構築する場合
これ使うとPipfile.lockが更新されます。

```
pipenv install
```

## Pipfile.lockから構築
詳細なバージョンなども合わせて環境構築する場合はpipfile.lock使うこともできます。

```
pipenv sync
```

# 5. Scriptで開発を便利に
スクリプト使うことができます。
たとえば、djangoのサーバー起動するのに`python manage.py runserver`とか面倒だし、コマンド覚える必要もあります。

なので

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

[packages]
django = "*"

[dev-packages]

[scripts]
start = "python manage.py runserver"
test = "python manage.py test"

[requires]
python_version = "3.8"

```

## スクリプトを起動

```
$ pipenv run start

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
January 28, 2021 - 17:57:09
Django version 3.1.5, using settings 'testapp.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
```

ちゃんとサーバー起動しました。こんな感じで簡単に使えます。

もちろんtestも

```
$ pipenv run test
System check identified no issues (0 silenced).

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK
```

# 6. バージョン指定

```:Pipfile
[packages]
django = "==3.1.7"

[dev-packages]
django = "==3.1.*"
djangorestframework = "==3.*"
```

django 3.1.7を入れるなら`django = "==3.1.7"`
3.1系で最新を入れたいなら`django = "==3.1.*"`のように書く。
指定しないなら`django = "*"`

`Pipfile.lock`に書いてあるバージョンを入れたい場合は

```
pipenv sync
```
を実行。

# 補足1
開発環境だけでつかうようなものを入れるとき

```
pipenv install --dev flake8
```

コードきれい規約の通りキレイにかけてるか見てくれるflake8ですが、本番環境ではいらないのでこんな感じで開発環境のみで使うように入れることも可能。

```:Pipfile
[dev-packages]
flake8 = "*"
```

こんな記述が追加されてます。スクリプトに追記してテストしてみます。

```
[scripts]
start = "python manage.py runserver"
test = "python manage.py test"
lint = "flake8 --show-source ."
```

```
$ pipenv run lint
.\testapp\settings.py:89:80: E501 line too long (91 > 79 characters)
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
                                                                               ^
.\testapp\settings.py:92:80: E501 line too long (81 > 79 characters)
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
                                                                               ^
.\testapp\settings.py:95:80: E501 line too long (82 > 79 characters)
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
                                                                               ^
.\testapp\settings.py:98:80: E501 line too long (83 > 79 characters)
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
```

Django、一行長すぎってひっかかってるぞ。

まあ、こんな感じで使えます。

## 開発環境のライブラリも入れる場合

```
pipenv install --dev
```
とすれば、今回の場合

```
[dev-packages]
flake8 = "*"
```

も入ることになります。
同じようにPipfile.lockからの場合

```
pipenv sync --dev
```

# 補足2　Pathについて
詰まるとしたらPathの登録だと思います。PythonとかpipとかうってもうまくいかないのはPathが通っていないからです。
windowsのホームボタンの隣にある検索の「ここに入力して検索」とか書いてあるところに**システム環境変数の編集**って入力して環境変数ってボタン押す。

Pathってところ選んで、編集押す。

```
C:\Users\ここにユーザー名\AppData\Local\Programs\Python\Python38\Scripts\
```

```
C:\\Users\ここにユーザー名\AppData\Local\Programs\Python\Python38\
```

みたいなのがなかったら新規で追加してください。Python38というのはver 3.8系を今回入れたのでPython38 になってます。
3.9系入れたらPython39です。

複数のバージョン入っていた場合上に書いてあるものが実行されます。

# 補足3 コマンド一覧
今回使ったコマンドと、もしかしたら使うかもしれないコマンド

## pipenv install
ディレクトリ内にPipfile Pipfile.lockを作成。
既にある場合はPipfileの記述された環境で仮想環境作成

```
pipenv install
```

仮想環境にライブラリをインストール。Pipfileに記述が追加される。
このコマンドで一つ一つ入れるのが面倒ならPipfileに記述して`pipenv install`しよう。
version指定と、開発環境のみに入れる指定も可能。

```
pipenv install [package]
pipenv install django
pipenv install django==2.2.16
pipenv install --dev flake8
```

## pipenv uninstall
仮想環境のライブラリ削除するコマンドで、Pipfileからも削除される。
依存ライブラリは削除されないので注意

```
pipenv uninstall [package]
```

## pipenv uninstall
仮想環境使うためのコマンド。毎回作業開始はこれ。

```
pipenv shell
```

## pipenv run
仮想環境でコマンドを実行する。

[詳しくはここ](#5-scriptで開発を便利に)

```
pipenv run [コマンド]
```

## その他たまに使うかもしれないコマンド

```
pipenv update
# pipfileに書いたライブラリをアップデート
pipenv update --dev
# 開発環境で使うライブラリならこっち
```
例えば、

```:pipfile
[packages]
django = "==3.1.*"

[dev-packages]
django = "==3.1.*"
djangorestframework = "==3.*"
```

`pipenv update`でdjangoが3.1系で最新あったらアップデート。

`pipenv update --dev`でdjangoが3.1系とdjangorestframework 3系で一番新しいものにアップデートできる

```
pipenv --rm
# 仮想環境を削除

pipenv --venv
# 仮想環境のパスを確認できる
```