💻

Pipenv を導入して requirements.txt を利用したパッケージ管理をやめる

2022/09/23に公開

前提

  • 作業環境は Mac (macOS Monterey 12.6 Apple M2)
    • Homebrew が既に使えるようになっていること
  • pyenvは既にインストールされていること

requirements.txt を利用する方式の問題点

  • pip install した後に反映し忘れる
  • 前項の反映に関して、 pip freeze > requirements.txt ってしたら dev dependencies的なパッケージ(フォーマッターやテスティングフレームワークなど開発やテスト関係のパッケージで、本体の実行に必須ではないもの)も全部吐き出される
    • この兼ね合いで、本番環境にデリバリーする際に不要なパッケージが混入する

Pipenvとは

概要

  • パッケージ管理ツール
  • パッケージのインストール・アンインストール用のインターフェースの提供や、プロジェクト用の仮想環境を作成などを実施してくれる
    • pipvenv をラッピングしている

特徴

  • pyenv が使える場合は必要なバージョンのPythonを自動でビルドしてくれる
  • 仮想環境を自動で生成してくれる
  • パッケージがインストール・アンインストールされたときは Pipfile を自動で更新してくれる
  • .env ファイルの自動読み込み

→ 冒頭で挙げた問題点は解消できる(= 今回導入した動機)

Pipenvのインストール

$ brew install pipenv

正常にインストールできたら以下でバージョンを取得できる

$ pipenv --version
pipenv, version 2022.9.21

Pipenvによる仮想環境構築

プロジェクトのルートに移動して pipenv コマンドを実行する

$ cd /path/to/somewhere/project
$ pipenv --python 3 

今回脱却しようとしている旧来の方式では以下のようなステップを踏む必要があった

  • pyenv でPythonをビルド
  • venv で仮想環境の作成
  • 前項の環境で pip install requirements.txt を実行し、パッケージをインストールする

既出の pipenv コマンドではこれらをまとめてやってくれる
(pyenv がインストールしてあったら便利なのはこの辺の理由から)

パッケージのリストである Pipfile もこの際に作られる

既に requirements.txt がプロジェクトルートにあるなら、そこから内容の転記もしてくれるが、
この点に関しては以下のようなverboseなメッセージが出力されるので、それに則って適宜編集すればハマることもなかった

$ pipenv --python 3
Creating a virtualenv for this project...
Pipfile: /Users/k0kishima/work/fuji/boatrace/boatrace.official/Pipfile
Using /opt/homebrew/bin/python3 (3.10.6) to create virtualenv...
⠴ Creating virtual environment...created virtual environment CPython3.10.6.final.0-64 in 398ms
  creator CPython3Posix(dest=/Users/k0kishima/.local/share/virtualenvs/boatrace.official-8L5PVWn-, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/k0kishima/Library/Application Support/virtualenv)
    added seed packages: pip==22.2.2, setuptools==65.3.0, wheel==0.37.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

✔ Successfully created virtual environment! 
Virtualenv location: /Users/k0kishima/.local/share/virtualenvs/boatrace.official-8L5PVWn-
requirements.txt found in /Users/k0kishima/work/fuji/boatrace/boatrace.official instead of Pipfile! Converting...
✔ Success! 
Warning: Your Pipfile now contains pinned versions, if your requirements.txt did. 
We recommend updating your Pipfile to specify the "*" version, instead.

仮想環境構築での操作

Pipenvvirtualenv をラップすることによって仮想環境構築を行なっているようだが、プロジェクトをアクティベートするには以下を実行する

$ pipenv shell 

パッケージの管理

本番環境で利用するパッケージのインストール

$ pipenv install numpy

開発やテストで利用するパッケージのインストール

$ pipenv install --dev pytest

Discussion