Python
Pipenv

Python開発の"常識"として知っておきたい、Pipenv

Pipenvとは?

Pythonのプロジェクト管理ツールです。

例えるならば、

  • JavaのMaven/Gradle
  • node.jsのnpm/Yarn
  • Railsのbundler

などに当たるものです。

何ができるのか?

Pipenvは、例えば以下のようなことができます。

  • 本番用/開発用それぞれ向けにライブラリのバージョンを Pipfile に残せます。

    • Pythonそのもののバージョンも含めて、残せます。
    • Pipfile.lockも残して、常に同じ結果にできます。(requirements.txtだけでは大変手間!)
    • バージョンの指定は、requirements.txt同様、厳密にしたり柔軟にしたりできます。
  • Pipfile に合わせて、自動でプロジェクト用の仮想環境を作れます。

    • virtualenvと連携して作成されます。
    • 作った環境は、エディタ(VS CodeやPyCharmなど)からも認識されます。
    • その他ツール(CircleCIやtoxなど)などとの連携も増えてきているようです。
    • もしpyenvをインストールしておけば、指定したPythonバージョンを自動で用意してくれます。
  • Pipfilerequirements.txt からインポート/エクスポートできるので、すぐ始められます。

    • requirements.txtpip freezeで作れるので、なくても大丈夫
    • anacondaなどのPythonディストリビューションを使っていても、再利用できます。

その他機能もあるので、具体的には本家サイトも見てみてください。
2017年ぐらいからの、比較的新しいツールですが、
トップページにあるリンク(目次)を見るだけでも、十分な機能とドキュメントが用意されているのがわかります。

個人的に、使い心地もよく気に入っています。ぜひ使ってみてください。

本家サイト

ドキュメント(英語)
https://pipenv.readthedocs.io/en/latest/

ドキュメント(日本語訳)
https://pipenv-ja.readthedocs.io/ja/translate-ja/

Github
https://github.com/pypa/pipenv

Pipenvを使ってみる

インストール

システム全体に関わるパッケージが壊れないよう、--userオプションを付けています。

$ pip install --user pipenv
気にしない人向け
$ pip install pipenv
Macユーザ向け
$ brew install pipenv

使い方

プロジェクトを新規作成する場合

実行すると、Pipfileが作成されます。

Python3系の場合
$ pipenv --three
Python2系の場合
$ pipenv --two
Pythonのバージョンを指定したい場合
$ pipenv --python 3.6.5

requirements.txtが既にあるプロジェクトの場合

プロジェクトを新規作成する場合と全く同じです。
requirements.txtがあれば読み込んで、Pipfileを作成し、かつインストールも行います。

明示的にパスを指定することも可能です。
-r path/to/requirements.txtを追加してください。

ライブラリを新たにインストールする場合

基本的には、よくあるpipによるインストールコマンドをpipenvに読み替えるだけです。
実行すると、更新されたPipfilePipfile.lockが作成されます。

最新バージョンをインストール
$ pipenv install requests
開発用にインストール
$ pipenv install --dev autopep8
バージョンを厳密に指定
$ pipenv install "requests==2.20.0"
マイナーバージョンの違いを許容
$ pipenv install "requests~=2.20.0" # 2.20.1がインストールされる
開発中のモジュールをeditableモードでインストール(※要setup.py)
$ pipenv install --dev -e .

仮想環境を作成する

git cloneなどでPipfileなどをダウンロードしてきた場合に実行します。
プロジェクトを新規作成する場合を実行済みならば、既に作成済みの状態です。

開発向け仮想環境
$ pipenv install --dev
本番と同じ仮想環境
$ pipenv install
デプロイ(Pipfile.lockを更新せずエラーにする)
$ pipenv install --deploy

もし仮想環境をリセットしたければ、削除して再作成すればよいです。

削除
$ pipenv --rm

仮想環境を使う

1コマンド実行すればよいならば、以下を実行します。

$ pipenv run <コマンド> <オプション>...

作成された仮想環境をactivateするならば、以下を実行します。

$ pipenv shell

もし、よく使うコマンドがあれば、Pipfileにショートカットを書いておくことができます。
CIツールなどと連携する際に有用そうです。

Pipfile
[scripts]
hello = "python -c \"print('Hello')\""

と書いた前提で、以下を実行します。

$ pipenv run hello
出力結果
Hello

requirements.txtを作成する

実行すると、依存ライブラリ含めてバージョン付きで生成されます。

$ pipenv lock -r > requirements.txt

参考

本家サイト

A Better Pip Workflow
https://www.kennethreitz.org/essays/a-better-pip-workflow

pipfile-vs-setuppy
https://pipenv-ja.readthedocs.io/ja/translate-ja/advanced.html#pipfile-vs-setuppy