🐰

【図解】作業が倍速!pipenvの使い方【Python】

2021/11/01に公開

Python を使っていると、次のようなことに悩まされませんか。

遅かれ早かれ、Python 使いならこの問題には必ずぶち当たる日が来ます。これらの悩みは pipenv を使うことで解決することができます。

今回は、今注目されている pipenv の使い方とイメージを図解して解説します。


Python の基礎を本にまとめています。併せてご覧いただけるととても嬉しいです ↓
https://zenn.dev/nekoallergy/books/python-basic
DeepLearning の基礎を本にまとめています。手に取って頂けるととても喜びます ↓
https://zenn.dev/nekoallergy/books/904df952389317



Created by NekoAllergy

pipenv ってなに?

pipenv とは、Python のパッケージ管理と仮想環境の構築を簡単に、自動で行ってくれる便利なツールです.pipvirtualenv の 2 つがセットになって使いやすくなったと考えれば、分かりやすいです。

【参考】pip って?

python を使ったことがある方ならパッケージを入れる際に pip install 〇〇 というコマンドを使ったことがあるでしょう。pip はパッケージのインストールや管理などができるツール(パッケージ)です。

【参考】virtualenv って?

仮想環境を作りたいなら virtualenv を使えば対応できます。異なるバージョンの Python を同時に入れたり、使い終わった環境をすぐに削除したりすることができます。

環境を分けると何が嬉しいの?

作業環境を分けると、いいことがたくさんあります。

もし環境を分けないと,,

もし環境を分けないと、次のようなことが起こってしまいます。

pipenv で環境を分けると,,

一方で、pipenv を使うと、このような問題をスマートに解決できます。


pipenv のインストール

pipenv のインストールは pip から行えます。

pipenv のインストール
pip install pipenv

これで、pipenvが使えるようになりました。

今回作る環境のイメージ

今回は 以下の 2 つの環境を作ってみます。 pipenv の使い方をなんとなく理解することを目標にしています。

環境 A : 機械学習ができる環境
環境 B : Web バックエンド開発ができる環境


今回作る環境のイメージ


pipenv の仮想環境は、1 つのフォルダに 1 つの環境が対応しています。今回の例では、ProjectA というフォルダに機械学習の環境が対応しています。ProjectB というフォルダに Web 開発の環境が対応しています。


1 つのフォルダに 1 つの環境が対応している

PipfilePipfile.lockについては、このあと説明します。

【環境 A】 機械学習の環境を作ろう

まずは、機械学習をするための仮想環境を作ってみます。

現在の状態は、以下の図のようなイメージです。まだ何もありません。

この状態から、pipenv を使って、仮想環境を作る & パッケージをインストールします。
最終的には以下のような構成になります。


最終的なファイル構成 と 環境の完成イメージ図

なお、作成する 4 つのファイルは以下の役割を持っています。


ファイルの役割

以下のような流れで進めます。


環境構築の手順

ひとつずつ順を追って解説します。

Step01 requiremenets.txt に入れたいパッケージを書く

Desktop に ProjectA というフォルダを作って、その中に requiremenets.txt を作ります。Desktop じゃなくてもいいですが、分かりやすいので今回はそうしています。

ProjectAフォルダを作る
~/Desktop $ mkdir ProjectA
~/Desktop $ cd ProjectA
requirements.txtを作る
~/Desktop/ProjectA $ touch requirements.txt
~/Desktop/ProjectA $ ls
requirements.txt

今回は機械学習の環境を作りたいので、機械学習に必要なパッケージを requiremenets.txt に書いておきます。以下のように好きなパッケージを書いてください。

requirements.txt
numpy
scipy
pandas
matplotlib
sklearn

これで前準備は完了です。


Step02 仮想環境を生成(初期化)する


pipenv を使って仮想環境を作っていきます。

ターミナルで以下のコマンドを実行すると、仮想環境を作ることができます。
3.6の部分は python のバージョンです。お好きなバージョンを入れてみてください。

仮想環境を生成
pipenv --python 3.6

このコマンドを実行すると、Pipfile というファイルが自動生成されます。Pipfile仮想環境の「設計図」 です。テキストエディタなどで中をのぞいてみれば分かりますが、Python のバージョンやインストールしたパッケージなどがここに書き込まれます。このPipfileファイルをもとに、他の PC に今作った環境を再現することができます。


Step03 仮想環境にパッケージをインストールする

環境はできましたが、まだパッケージが入っていません。パッケージを環境の中にインストールするために、下記のコマンドを実行しましょう。この時インストールされるのは、さっき requirements.txt に書いたパッケージです。

仮想環境にパッケージをインストール
pipenv install -r requirements.txt

また、このコマンドを実行すると、新しくPipfile.lock というファイルが自動生成されます。Pipfile.lockには、実際にインストールしたパッケージの詳細なバージョンや依存パッケージの情報などが自動で記録されます。このPipfile.lockファイルをもとに、他の PC に今作った環境を再現することもできます。


【補足】このパッケージは環境を破壊しません

pipenv installコマンドでインストールしたパッケージは、ローカル PC の環境には影響しません。完全に分離されているため、ローカルの環境を汚すこともないし、使い終わったら環境ごと削除することもできます。

試しに pip listコマンドでパッケージ一覧を表示してみてください。今インストールしたパッケージたちは入っていないはずです。(もともとローカル環境にインストールされているなら別です)

pipenv installコマンドでインストールしたパッケージは、仮想環境の中でのみ使えます。次の STEP で環境の中に入ってみましょう。


Step04 仮想環境の中に入る

下記のようにpipenv shellコマンドを実行すると、仮想環境の中に入ることができます。

仮想環境の中に入る
~/Desktop/ProjectA $ pipenv shell
(ProjectA)のように、ディレクトリの名前が仮想環境の名前になる
(ProjectA) ~/Desktop/ProjectA $
仮想環境の中で `pip list` を使うと?

仮想環境の中に入った状態で、pip listを使うと、仮想環境の中で使えるパッケージの一覧が表示されます。

インストール済みのパッケージを確認
(ProjectA) ~/Desktop/ProjectA $ pip list
Package                           Version
--------------------------------- ---------
backports.entry-points-selectable 1.1.0
certifi                           2021.5.30
cycler                            0.10.0
distlib                           0.3.3
filelock                          3.3.0
importlib-metadata                4.8.1
importlib-resources               5.2.2
joblib                            1.1.0
kiwisolver                        1.3.2
matplotlib                        3.4.3
numpy                             1.21.2
pandas                            1.3.3
Pillow                            8.4.0
pip                               21.3
pipenv                            2021.5.29
platformdirs                      2.4.0
pyparsing                         2.4.7
python-dateutil                   2.8.2
pytz                              2021.3
scikit-learn                      1.0
scipy                             1.7.1
setuptools                        39.0.1
six                               1.16.0
sklearn                           0.0
threadpoolctl                     3.0.0
typing-extensions                 3.10.0.2
virtualenv                        20.8.1
virtualenv-clone                  0.5.7
wheel                             0.37.0
zipp                              3.6.0

requirements.txt に書いたパッケージが正しくインストールされていることが確認できます。環境の中に入った状態でコマンドを打つことに注意してください。

仮想環境の外で `pip list` を使うと?

仮想環境の外に出るためには、exit コマンドを実行します。

仮想環境の外に出る
(ProjectA) ~/Desktop/ProjectA $ exit

仮想環境に入っていない状態で、pip listを使ってみましょう。

~/Desktop/ProjectA $ pip list

今インストールしたパッケージたちは入っていないはずです。(もともとローカル環境にインストールされているパッケージが表示されます。)


Step05 Python のプログラムを実行する

環境ができて、パッケージを入れることができたので、あとはプログラムが正しく動くか確認です。以下の機械学習プログラムを作成して実行してみます。

プログラム
my_ml_code.py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from sklearn import datasets
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split

# Load datasets
iris = datasets.load_iris()

# Load as pandas.DataFrame
df_iris = pd.DataFrame(data=iris.data, columns=iris.feature_names)

# Add target
df_iris['target'] = iris.target

print(df_iris)

# Split the dataset
data_train, data_test, target_train, target_test = train_test_split(
    iris.data, iris.target, test_size=0.2, random_state=0)

# Define Neural Neowork model
clf = MLPClassifier(hidden_layer_sizes=10, activation='relu',
                    solver='adam', max_iter=1000)

# Lerning model
clf.fit(data_train, target_train)

# Calculate prediction accuracy
print(clf.score(data_train, target_train))

# Predict test data
print(clf.predict(data_test))

# Show loss curve
plt.plot(clf.loss_curve_)
plt.title("Loss Curve")
plt.xlabel("Iteration")
plt.ylabel("Loss")
plt.grid()
plt.show()

エラーなくプログラムが通れば、成功です。


【補足】パッケージを追加したい

追加したいパッケージがあればpipenv install 〇〇でインストールできます。このコマンドは、仮想環境に入った後でも同じように実行できます。

パッケージを追加する
~/Desktop/ProjectA $ pipenv install seaborn
【補足】仮想環境から出たい

仮想環境の外に出るためには、exit コマンドを実行します。

仮想環境から出る
(ProjectA) ~/Desktop/ProjectA $ exit

出た後は、コマンドラインの最初に(ProjectA)という表記がなくなっていると思います。試しにpip listを実行してみると今インストールしたパッケージたちは入っていないはずです。(もともとローカル環境にインストールされているなら別です)

pip listでパッケージを表示
~/Desktop/ProjectA $ pip list
【補足】仮想環境を消したい

pipenv で作った機械学習の環境は、簡単に削除することができます。下記のようにpipenv --rmコマンドを打つと、ProjectA ディレクトリに対応している環境が削除されます。

仮想環境を消す
~/Desktop/ProjectA $ pipenv --rm

【環境 B】 Web バックエンド開発の環境を作ろう

続いて、簡単な Web 開発の環境を作ってみます。やることはほとんど一緒で、変わるのは python のバージョンと requirements.txt に書くパッケージくらいです。さっき作った機械学習の環境の中にまだいる場合は、exit コマンドを実行して、仮想環境の外に出てください。

ProjectAの仮想環境から出る
(ProjectA) ~/Desktop/ProjectA $ exit

現在の状態は、以下の図のようなイメージです。


現在のファイル構成と環境のイメージ

この状態から、pipenv を使って、仮想環境を作る & パッケージをインストールします。
最終的には以下のような構成になります。


最終的なファイル構成と環境のイメージ

さっきと同様に、以下のような流れで進めます。

Step01 requiremenets.txt に入れたいパッケージを書く

Destop に ProjectB というフォルダを作って、その中に requiremenets.txt を作ります。

ProjectBフォルダを作る
~/Desktop $ mkdir ProjectB
~/Desktop $ cd ProjectB
requirements.txtを作る
~/Desktop/ProjectB $ touch requirements.txt
~/Desktop/ProjectB $ ls
requirements.txt

今回は Web バックエンド開発の環境を作りたいので、Web 開発に必要なパッケージを requiremenets.txt に書いておきます。以下のように好きなパッケージを書いてください。

requirements.txt
numpy
flask

Step02 仮想環境を生成(初期化)する

ターミナルで以下のコマンドを実行すると、仮想環境を作ることができます。
python のバージョンはお好きなバージョンを入れてみてください。今回は 3.8 を入れました。pipenv を使うと、環境ごとに python の状態も変えることができるので便利です。

仮想環境を生成
pipenv --python 3.8

このコマンドを実行すると、Pipfile というファイルが自動生成されます。


Step03 仮想環境にパッケージをインストールする

環境はできましたが、まだパッケージが入っていません。パッケージを環境の中にインストールするために、下記のコマンドを実行しましょう。この時インストールされるのは、さっき requirements.txt に書いたパッケージです。

仮想環境にパッケージをインストール
pipenv install -r requirements.txt

このコマンドを実行すると、新しくPipfile.lock というファイルが自動生成されます。


Step04 仮想環境の中に入る

下記のようにpipenv shellコマンドを実行すると、仮想環境の中に入ることができます。

仮想環境の中に入る
~/Desktop/ProjectB $ pipenv shell
(ProjectB)のように、ディレクトリの名前が仮想環境の名前になる
(ProjectB) ~/Desktop/ProjectB $

Step05 Python のプログラムを実行する

以下のプログラムを実行して、ローカルサーバを立ち上げてみましょう。

プログラム
sample.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    name = "Hello World"
    return name

@app.route('/good')
def good():
    name = "Good"
    return name

## おまじない
if __name__ == "__main__":
    app.run(debug=True)

エラーなくサーバが起動したら、http://localhost:5000/ にアクセスしてみましょう。
Hello Worldの文字が表示されたら成功です。

まとめ

今回は pipenv の使い方とイメージを図解で解説しました。

また、今回は詳しく紹介しませんでしたが、以下のようなことも可能です。

【補足】pip でインストールしたパッケージを全て削除する方法

pipenv が使えれば、環境やパッケージを自由に 作る&消す ができます。
ローカル PC にパッケージがたくさんインストールされているのは、ややこしいので、私は全て削除しました。

pipでインストールしたパッケージを全て削除
pip freeze > piplist.txt
sudo pip uninstall -r piplist.txt

消していいか聞かれるので、全部 Y で実行します。実行は自己責任でお願いします。
その後、pip listで確認すると、今までインストールしたパッケージがなくなっています。

pip listで確認した結果
%pip list
Package    Version
---------- -------
pip        21.2.4
setuptools 39.0.1

その後、pipenv だけを入れます。これさえ入れとけば、必要なパッケージを使いたい環境で必要な分だけ入れることができます。

pipenvのインストール
pip install pipenv
最終的なpipの環境
%pip list
Package                           Version
--------------------------------- ---------
backports.entry-points-selectable 1.1.0
certifi                           2021.5.30
distlib                           0.3.3
filelock                          3.3.0
importlib-metadata                4.8.1
importlib-resources               5.2.2
pip                               21.2.4
pipenv                            2021.5.29
platformdirs                      2.4.0
setuptools                        39.0.1
six                               1.16.0
typing-extensions                 3.10.0.2
virtualenv                        20.8.1
virtualenv-clone                  0.5.7
zipp                              3.6.0

これで PC の環境が超スッキリしました。とっても快適です。


機械学習をもっと詳しく

Python の基礎を本にまとめています。併せてご覧いただけるととても嬉しいです ↓
https://zenn.dev/nekoallergy/books/python-basic
DeepLearning の基礎を本にまとめています。手に取って頂けるととても喜びます ↓
https://zenn.dev/nekoallergy/books/904df952389317


ねこアレルギーのAI

ねこアレルギーの AI
YouTube で機械学習について発信しています。お時間ある方は覗いていただけると喜びます。





Created by NekoAllergy

Discussion