TSUBOCK★LABO-ツボックラボ-

とあるセキュリティエンジニアの技術メモブログ

MENU

PipenvでPythonのパッケージ管理を行う

f:id:panda-loves-smile:20200204162932p:plain

プロジェクトごとのパッケージ管理はrequirements.txtで行うことが多かったのですが、requirements.txtへの記入が漏れてインストール作業でゴタゴタすることもあるため、最近ではパッケージ管理ができるツールを使用することが多いです。

今回はいくつかあるパッケージ管理ツールの中からPipenvというパッケージ管理ツールを紹介したいと思います。

Pipenvとは

Pipenvはpip + venv + requirementsを組み合わせた、Pythonの外部モジュールの依存関係管理やパッケージングを行うためのツールです。今回はUbuntu18.04の環境にインストールしてみます。

Pipenvのインストール

Pipenvのインストールはpipコマンドで行えます。pipenvは管理者権限でグローバルにインストールしないと動かないので、sudoをつけて実行しましょう。ローカルユーザへインストールするとPathが通ってなくて、pipenv: command not foundと表示されるてハマります。(ハマりました。)

$ sudo pip install pipenv

実行完了したら下記コマンドでpipenvコマンドがインストールされていることを確認してみましょう。

$ pipenv --version

Pipenvを使う

プロジェクトの初期化

Pipenvではまず、Pipenvで管理するプロジェクトを初期化する必要があります。

管理したいプロジェクトへ移動して、初期化コマンドを実行します。

$ cd <管理したいプロジェクトのPath>
$ pipenv --python 3

pipenv --pythonで指定するPythonバージョンはpipenv --python 3.6のように細かく指定することも可能です。

初期化を行うのと、カレントディレクトリにPipfileというpipenvでの構成管理ファイルが生成されます。

$ ls
Pipfile

Pipfileには構成情報が記載されています。

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

[dev-packages]

[packages]

[requires]
python_version = "3.6"

Pythonパッケージの追加

初期化したプロジェクトでPythonパッケージを追加する場合は以下のコマンドで実行します。

$ pipenv install <インストールしたいPythonパッケージ>

例えば、requestsパッケージをインストールしたい場合は下記のように実行します。

$ pipenv install requests

実行するとインストールが始まります。

インストール完了後Pipfile.lockというファイルが自動生成されます。

$ ls
Pipfile  Pipfile.lock

Pipfile.lockにはインストールされた詳細なバージョンや依存パッケージの情報が記録されています。

{
    "_meta": {
        "hash": {
            "sha256": "8739d581819011fea34feca8cc077062d6bdfee39c7b37a8ed48c5e0a8b14837"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.6"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {
        "certifi": {
            "hashes": [
                "sha256:1d987a998c75633c40847cc966fcf5904906c920a7f17ef374f5aa4282abd304",
                "sha256:51fcb31174be6e6664c5f69e3e1691a2d72a1a12e90f872cbdb1567eb47b6519"
            ],
            "version": "==2020.4.5.1"
        },
        "chardet": {
            "hashes": [
                "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
                "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
            ],
            "version": "==3.0.4"
        },
        "idna": {
            "hashes": [
                "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb",
                "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"
            ],
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
            "version": "==2.9"
        },
        "requests": {
            "hashes": [
                "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee",
                "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"
            ],
            "index": "pypi",
            "version": "==2.23.0"
        },
        "urllib3": {
            "hashes": [
                "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527",
                "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"
            ],
            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
            "version": "==1.25.9"
        }
    },
    "develop": {}
}

Pipfileを確認すると[packages]に先ほどインストールしたrequestsが追加されていることが確認できます。

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

[dev-packages]

[packages]
requests = "*"

[requires]
python_version = "3.6"

バージョンを指定してPythonパッケージを追加する

バージョンを指定してインストールすることもできます。requestsは執筆日現在の最新バージョンは2.23.0ですが、例えば2.20.0をインストールしたい場合、は下記の通りに指定します。

$ pipenv install requests==2.20.0

Pipfileを確認すると[packages]に先ほどインストールしたrequestsがバージョン2.20.0で追加されていることが確認できます。

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

[dev-packages]

[packages]
requests = "==2.20.0"

[requires]
python_version = "3.6"

Gitリポジトリを指定してインストールを行うこともできます。

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

追加したパッケージを削除する

追加されているパッケージはコマンドで削除することができます。

先ほど追加したrequestsを削除してみます。

$ pipenv uninstall requests

削除ができたか、Pipfileを確認します。

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

[dev-packages]

[packages]

[requires]
python_version = "3.6"

[packages]から削除されていることが確認できました。

開発環境用にパッケージを追加する

実際のリリースには追加したくないが、開発環境でのみ使いたいパッケージもあるかと思います。例えばautopep8やflake8などです。開発環境用にインストールする場合はpipenv install --devのように--devを追加する。

$ pipenv install --dev autopep8 flake8

Pipfileには下記の通り、[packages]ではなく[dev-packages]に追加されていることが確認できると思います。

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

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

[packages]

[requires]
python_version = "3.6"

requirements.txtからのインストール

requirements.txtで管理されているパッケージもPipenvを使用してインストールすることができます。

$ pipenv install -r requirements.txt

Pipfileから環境を再現する

既にパッケージ管理されているPipfileがカレントディレクトリに存在する場合、下記コマンドで環境を再現することができます。

$ ls 
Pipfile
$ pipenv install 

Pipenvで管理している仮想環境でプログラムを実行する。

下記コマンドを使うとPipenvで管理している仮想環境を使ってプログラムを実行できます。

$ pipenv run python3 hogehoge.py

上記の場合は仮想環境の外から実行するコマンドとなっていますが、仮想環境内に入ってからプログラムを実行することもできます。

$ pipenv shell
$ python hogehoge.py

任意のコマンドを設定して実行する。

PipenvではPipfileに[scripts]というカテゴリを追加すると、独自のコマンドを設定して実行することができます。書き方は[呼び出しコマンド] = "[省略したいコマンド]"です。あまり好ましい使い方ではないですが、例えばLinuxのdateコマンドで日付を確認できるようにしてみます。

[scripts]
date = "date"

実行するときは[scripts]に指定した[呼び出しコマンド]pipenv runの引数で指定してあげれば実行できます。上記の設定の場合は

$ pipenv run date

とすると、Linuxコマンドのdateが呼び出されます。私がよく使う使い方だと、

[scripts]
test = "pytest"

としておいて、開発中に単体テストを行う時に

$ pipenv run test

として、pytestを呼び出すようにしています。

仮想環境の中からコマンド実行を行うので、通常の実行より遅いかもしれないですが、ショートカット的に使うには結構便利だと思います。