🐍

Pythonのパッケージ管理ツールの私的まとめ(2023)

2023/12/26に公開

はじめに

Pythonのパッケージ管理ツールについて調べる機会があったので備忘録として残しておきます。

なお、私は主にアプリケーション開発でPythonを使っているので、データサイエンス系で利用されることが多いAnacondaについては記載していません。

パッケージ管理ツールの機能

Pythonのパッケージ管理ツールは以下のような機能を持っていることが多いです。

  • パッケージインストール
    Pythonのパッケージをインストールする機能です。

  • パッケージ仮想化
    パッケージをユーザーやプロジェクトごとに管理する機能です。
    Pythonのパッケージは通常、実行環境にグローバルインストールされます。
    そのため、ひとつの開発環境で複数のPythonプロジェクトの開発を行う場合、パッケージが混ざってしまうことを防ぐための機能です。

  • 依存関係の管理
    インストールしたパッケージや、依存するパッケージのバージョンを固定する機能です。
    Node.jsnpmでいうところのpackage-lock.jsonを作成する機能)
    ビルドの一貫性と再現性を担保し「密封ビルド」[1]を実現します。
    また、開発時にのみ必要なパッケージを分けて取り扱う機能を含みます。

  • タスクランナー
    よく行う処理を自動化するための機能です。
    npmでいうところのnpm scriptsに相当する機能)

  • パッケージ開発
    Pythonのパッケージを開発し、PyPI[2]に公開するための機能です。
    最近のツールは pyproject.toml という、パッケージのビルドに必要なデータを記載するファイルフォーマットに対応しています。

パッケージ管理ツールの機能比較

主要なツール名と機能の一覧を示します。

ツール名 パッケージインストール パッケージ仮想化 依存関係の管理 タスクランナー パッケージ開発
pip × × × ×
venv × × × ×
pip-tools × × × ×
Pipenv ×
Poetry ×
PDM
Rye

pipvenvはPython3.4以降で標準ライブラリに含まれています。その他は別途インストールが必要です。

pip-toolsは依存関係の管理に特化したツールです。最低限これができれば開発できるプロジェクトは多いと思われます。

オールインワンなツールでは、以前はPipenvがよく使われていたようですが、最近はPoetryが人気のようです。
PDMPoetryと比較して、より高速であることを謳い文句としています。
Ryeは2023年12月現在、まだVer.0.16.0で「Production Readyではない」との記載がありますが、今後が注目されます。

その他のツール

パッケージ管理ツールではないですが、開発環境の構築に関連しそうなツールを紹介します。

Pythonインタプリタの仮想化

Pythonそのもののバージョンを切り替えるためのツールとして pyenv があります。
パッケージ管理ツールと組み合わせて使います。

なお、前述のRyeはインタプリタの仮想化もサポートしています。

DevContainerによる開発環境の仮想化

仮想化に関しては、DevContainer[3]で開発環境ごとコンテナにしてしまうという選択肢もあります。
ある意味シンプルなのですが、構成変更のたびにコンテナイメージのリビルドが必要になるため、環境が安定するまでは待ち時間が長くなりがちです。

また、デフォルトではパッケージはコンテナ内にグローバルインストールされるので、リビルドするたびにパッケージをインストールしなおす必要があります。
頻繁にコンテナイメージのリビルドが発生する場合は、venvでパッケージの保存先をホストOSのボリュームに移動しておく、などの工夫が必要です。

VSCodeは python.venvFolders でパッケージの保存先を指定できます。

settings.json
{
  "python.venvFolders": [
    ".venv"
  ]
}

導入の敷居は高めですが、ホストOSの環境を汚さないというメリットは大きく、あれこれツールを試したいときや、複数の開発言語を併用する場合は検討する価値があると思います。

おわりに

Pythonのパッケージ管理ツールは予想以上に乱立状態でした。

個人的な結論としては、以下のとおりとなります。

  • チームで開発する場合は Poetry (+ pyenv) が有力
  • Rye には期待しているが、仕事で使うには時期尚早
  • 小さなプロジェクトであれば pip + venv + pip-toolsで充分かも
  • 環境汚したくないので DevContainer も併用したい

どなたかの参考になれば幸いです。

脚注
  1. https://sre.google/sre-book/release-engineering/ ↩︎

  2. 「Python Package Index」の略で、Pythonのパッケージ公開リポジトリです。 ↩︎

  3. https://code.visualstudio.com/docs/devcontainers/containers ↩︎

Discussion