PipenvによるPythonのパッケージ管理

Pipenvのインストール方法と使い方を説明します。

Pythonの開発支援ツール

パッケージ管理を扱う前に、Pythonの開発支援ツールについて概観します。 この部分は読み飛ばしていただいても問題ありません。

Pythonは古くから使われているため、バージョン管理やパッケージ管理に関連するツールは時代とともに徐々に発展してきました。 このため、Pythonの開発環境は新旧様々なツールを組み合わせて構築します。 特に入門者は多くのキーワードが飛び交い困惑するかもしれません。 関連ツールのキーワードを体系的に整理しましたので、ざっと確認しましょう。 なお、括弧で括られたツールは2019年現在廃れており、新規利用には非推奨です。

パッケージ利用者向け

パッケージを導入するためのツール群。

pip / (easy_install)

パッケージをインストールするツール。

wheel / (egg)

パッケージの配布フォーマット。 ビルド済みのバイナリをパッケージすることも可能。 pipではwheel、easy_installではeggを利用する。

requirements.txt

pipが出力する、インストールしたパッケージの名前とバージョンの一覧が記載されたファイル。 pip installで追加したパッケージとその依存パッケージ全てが出力される。 出力するファイル名は任意だが、慣例としてこの名前が使われる。

venv / virtualenv

通常pipはグローバルな環境でパッケージを管理するが、仮想環境と呼ばれる用途に応じた別個の環境でパッケージを管理するためのツール。

Pipenv

pipのrequirements.txtが抱える、次の問題を解決するツール。

  • 『ユーザがpip installでインストールしたパッケージ』と『pipが依存関係として自動インストールしたパッケージ』の区別がつかない
  • 『バージョンを固定したいパッケージ』と『あるバージョンの範囲で更新可能なパッケージ』の区別がつかない

Pipenvは、pyenv、pip、virtualenvと連携して動作する。

パッケージ開発者向け

パッケージの作りを統一し、どのパッケージでも同じ方法でインストールするための仕組み。

setup.py / setup.cfg

パッケージをインストールするためのスクリプトとパッケージの定義ファイル。

setuptools / distutils / (distribute)

setup.py / setup.cfgから利用されるモジュール。

Pythonのバージョン管理

Pythonを複数バージョン利用するための仕組み。

pyenv

複数のアプリを開発していると、アプリの都合により利用するPythonのバージョンが異なるため、同一マシンでいくつかのバージョンを扱う必要が出てくる。 pyenvは、同一マシンにPythonを複数バージョン混在させて、開発するアプリに応じてバージョンを切り替えて利用できる。

pyenv-virtualenv

pyenvでvirtualenvを利用するためのpyenvプラグイン。virtualenvとは別物。

Pipenvを用いたPythonのパッケージ管理

Pythonのアプリケーションを開発するためのPipenvを用いたパッケージ管理について説明します。

Pipenvのインストール

Pythonとpipがインストールされた環境で、Pipenvをインストールします。

pipを使ってインストールします。

pip install --user pipenv

ユーザのバイナリディレクトリにPATHを通します(Linux/Mac用)。

cat << 'EOF' >> ~/.bash_profile
# user base
export PATH="$HOME/.local/bin:$PATH"
EOF
exec $SHELL -l

更新するときは--upgradeオプションを使用します。

pip install --user --upgrade pipenv

仮想環境の初期化

Pipenvの利用を開始するには、仮想環境の初期化が必要です。

プロジェクトのディレクトリに移動して次のコマンドを実行します。 以降、このプロジェクトのディレクトリで行われるパッケージ操作は、今回作成した仮想環境上で行われます。

PIPENV_VENV_IN_PROJECT=true pipenv --three

実行したコマンドの動作やオプションの意味は次の通りです。

  • パッケージのインストール先
    • デフォルト:ユーザのグローバルなディレクトリ(Linux/Macの場合、$HOME/.local/share/virtualenvs
    • 環境変数PIPENV_VENV_IN_PROJECTを設定:プロジェクト直下の.venvディレクトリ
  • 利用するPythonのバージョン指定するオプション
    • Python3:--three--python 3
    • Python2:--two--python 2
    • Python3.6:--python 3.6
  • Pipenvが作成・利用するリソース
    • Pipenvファイル(仮想環境の情報。人手による編集が可能)
    • Pipenv.lockファイル(パッケージのバージョン情報。人手による編集はしない)
    • .venvディレクトリ(仮想環境本体。人手による編集はしない)
  • バージョン管理
    • するもの:PipenvPipenv.lock(単一バージョンのPythonを対象とする場合)
    • しないもの:仮想環境本体(.venv)。理由はPipenvPipenv.lockから再現可能なため

パッケージの追加

pip installコマンドと互換性があります。

pipenv install flask
# 開発用途のパッケージは`-d`オプションを指定
pipenv install -d flake8
pipenv install -d mypy
pipenv install -d pylint
pipenv install -d autopep8
pipenv install -d isort
pipenv install -d rope

パッケージの更新

更新があるパッケージを表示します。

pipenv update --outdated

全てのパッケージを更新します。

pipenv update

パッケージを指定して更新します。

pipenv update PACKAGES...

パッケージの削除

全てのパッケージを削除します。

pipenv uninstall --all

全ての開発用パッケージを削除します。

pipenv uninstall --all-dev

パッケージを指定して削除します。

pipenv uninstall PACKAGES...

別マシンでパッケージを再現

Pipfileからパッケージを再現します。

PIPENV_VENV_IN_PROJECT=true pipenv install

Pipfileからパッケージを再現(開発用パッケージを含む)します。

PIPENV_VENV_IN_PROJECT=true pipenv install -d

Pipfile.lockからパッケージを再現します。

PIPENV_VENV_IN_PROJECT=true pipenv sync

Pipfile.lockからパッケージを再現(開発用パッケージを含む)します。

PIPENV_VENV_IN_PROJECT=true pipenv sync -d

pip(requirements.txt)から移行

requirements.txtがない場合、作成します。

pip freeze > requirements.txt

requirements.txtからパッケージをインストールします。

PIPENV_VENV_IN_PROJECT=true pipenv install -r requirements.txt

バージョン固定について

requirements.txtのバージョンに合わせてPipenvファイルのバージョンが固定されます。 Pipenvファイルのバージョン固定は解除し、Pipenv.lockファイルのバージョンのみrequirements.txtに合わせるには、次の操作をします。

# `Pipenv`ファイルを編集し、バージョン固定を解除
# vi Pipenv

# `Pipenv.lock`ファイルを更新
pipenv lock --keep-outdated

(参考)

pipで依存パッケージ以外を確認するコマンドです。

# 別環境で再現する場合、pip/setuptools/wheelは不要のため削除
pip list --local --not-required --format=freeze

定型的に実行するコマンドの登録

定型的に実行するコマンドをショートカットとして登録できます。 コマンドはPipfileに記載し、pipenv runコマンドで呼び出します。

コマンド登録の例です。

[scripts]
# flake8とautopep8の登録例
vet = "flake8 --show-source"
fmt = "autopep8 -ir ."

コマンドの呼び出しの例です。

pipenv run vet
pipenv run fmt

その他のコマンド

仮想環境のシェルを起動(venvのbin/activate相当)します。

# exitでログアウト
pipenv shell

仮想環境でコマンドを実行します。

pipenv run python
pipenv run pip list

インストール済みパッケージのセキュリティの脆弱性をチェックします。

pipenv check

不要(Pipenv.lockにない)パッケージを削除します。

pipenv clean

パッケージ依存関係を表示します。

pipenv graph

requirements.txtを生成します。

pipenv run pip freeze > requirements.txt