私が歌川です

@utgwkk が書いている

Python の依存パッケージ管理/環境切り分けツール pipenv の紹介

この記事は 2017/9 に書かれたものであり、2019/11/26 現在とは状況が変わっています。公式ドキュメント(日本語訳)を参照してください。

もう誰も,requirements.txt や,source ENV/bin/activate に頭を悩まされる時代は終わった! というわけで virtualenv の時代は終わり*1,pipenv の時代になりました.

この記事は Python を書く人間が全員 pipenv を使うべきだという思いを込めて書きました.日本語で書かれた記事がまだぜんぜんないという事情もあります.

pipenv とは

Python のパッケージ管理ツールの pip と,環境切り分けツールの virtualenv を融合させたツールです.Ruby でいうところの Bundler を想像すると分かりやすいと思います*2.

github.com

Python Packaging User Guide でも pipenv が推奨されています.

インストール

もし pip コマンドがなければ ensurepip を試してください.

$ pip install pipenv

環境を作る

カレントディレクトリに Python3 の環境を作るには,

$ pipenv --three
# Windows の場合は下記
# pipenv --python <python.exe へのパス>

を実行します*3. これによって環境が作られ,カレントディレクトリに Pipfile が作成されます.

サブコマンド一覧

pipenv check

Pipfile が PEP 508 (Python の依存パッケージ指定の書式) に従っているか確認します. 多くの場合は打たなくてもいいのではないでしょうか.

pipenv install

パッケージをインストールし,Pipfile に追加します.

$ pipenv install (package-name)

パッケージ名を指定しない場合は,Pipfile に記述されたうち dev-dependencies を除く パッケージがインストールされます.

pipenv lock

Pipfile.lock (後述) を作成します.

pipenv run

カレントディレクトリの Python の環境でコマンドを叩くことができます.Bundler で言うところの bundle exec です. たとえばこのディレクトリの環境で main.py を実行したい場合は,このように.

$ pipenv run python main.py

もう activate してからコマンドを叩く必要はありません.グローバル環境に pipenv がインストールされており,かつ事前に pipenv install を済ませてさえいればよいのです. これを使うためだけに pipenv を入れたといっても過言ではありません.

pipenv shell

やっぱりまだ virtualenv を使いたい,activate したいという人のためのコマンドです.要するに source ENV/bin/activate をします. 当方の環境ではプロンプトの表示は変わりませんでしたが,普通に exit などで抜け出すことができます.

pipenv uninstall

パッケージをアンインストールし,Pipfile から削除します.

pipenv update

pip を最新版にアップデートし,環境を作成しなおします.

pipenv のいろいろ

dev-packages について

開発のみに使い,デプロイ時には使わない依存パッケージです.テスト用ライブラリとか. これまでは requirements-dev.txt のようなファイルに分かれていたものが1ファイルで済むようになりました.

$ pipenv install -d

で dev-packages を含めた全ての依存ライブラリをインストールできます.

Pipfile について

パッケージの依存関係などが TOML で記述されているファイルです. 自動で書き換えられていくのでそんなに触ることはなさそう(ほんとうか?).

Pipfile.lock について

$ pipenv lock

を叩くことで生成されるファイルです.Gemfile.lock とおおよそ同じ役割を果たしています.

環境はどこに保存されているの?

$ pipenv --venv

で確認することができます.~/.local/share/virtualenvs/ 以下に適当なディレクトリが作成され,そこに保存されています. Bundler みたくディレクトリを指定することはできないようです.

作成される環境の Python のバージョンは?

pipenv をインストールした Python のバージョンに依存します. pipenv --three ができるのは Python3 系に pipenv をインストールしたときだけです. まあ今時 Python2 しか使えないような不幸な環境というのはそうそうないと思い込んでいますが…….

まとめ

もう誰も,requirements.txt や,source ENV/bin/activate に頭を悩まされる時代は終わった!(再掲) というわけで,環境切り分けのために2つのコマンドを駆使する時代は終わりました. どんどん pipenv を使っていきましょう.

*1:追記: virtualenv 自体はまだ終わっておらず,pipenv の内部で用いられています

*2:と言ったけど,pip と virtualenv をもっと快適に扱うためのラッパとしての機能が強いと思う

*3:余談ですが,これをしないで勝手に pipenv install を実行しても環境は作られます