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
ディレクトリ
- デフォルト:ユーザのグローバルなディレクトリ(Linux/Macの場合、
- 利用するPythonのバージョン指定するオプション
- Python3:
--three
、--python 3
- Python2:
--two
、--python 2
- Python3.6:
--python 3.6
- Python3:
- Pipenvが作成・利用するリソース
Pipenv
ファイル(仮想環境の情報。人手による編集が可能)Pipenv.lock
ファイル(パッケージのバージョン情報。人手による編集はしない).venv
ディレクトリ(仮想環境本体。人手による編集はしない)
- バージョン管理
- するもの:
Pipenv
とPipenv.lock
(単一バージョンのPythonを対象とする場合) - しないもの:仮想環境本体(
.venv
)。理由はPipenv
とPipenv.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