こんにちは。 XI 本部 AI トランスフォーメンションセンター所属の山田です。
今回は、Python の Web アプリケーション開発環境において Poetry を利用し始めたことについて紹介します。
背景
私たちのチームではデータ分析、システム開発ともに Python を使用しています。
これまで、Python を業務で使う際にはパッケージ管理ツールにpipを利用してきました。
しかしながら、継続的に開発・更新を繰り返すことを見越したシステム開発ではたびたび問題を引き起こすことがあり、見直しを図ることにしました。
pip で感じていた課題
まずpipを利用時に感じていた課題を整理します。
pip install パッケージ名で導入した際にrequirements.txtへの記載漏れというヒューマンエラーが発生する。requirements.txtにおいてパッケージバージョンの記載漏れというヒューマンエラーが発生する。pipでのパッケージ間の依存関係解決は弱く、インストールの順序関係によってはエラーが発生する。pip freezeによるバージョン固定ファイルを手動で実施する必要があり、開発者間で異なるバージョンがインストールされ、環境差異が発生する。- 開発環境特有のパッケージ管理問題。
requirements-dev.txtのように別ファイルで管理するコストが辛い。
上記の課題の多くは、パッケージ管理ツールを見直すことで解決可能であると判断し、見直しを実施しました。
Poetry
そして結果として、Poetry を使うことにしました。 Poetry の公式ドキュメントと GItHub リポジトリへのリンクを載せておきます。
Poetry を採用した経緯としては、もともとチーム内でも関心があったツールであり、他社でも導入事例1や利点2が紹介されていたことが大きいです。 また開発ロードマップが示されており、今後のアップデートに伴って拡充される機能が魅力的でもありました。
Poetry - Feature roadmap、https://github.com/python-poetry/poetry/issues/1856
pipとPoetryの比較
pip と Poetry の比較を表にまとめたものが以下になります。
| # | pip |
poetry |
| 設定ファイル | requirements.txt |
pyproject.toml |
| 設定ファイルのサンプル |
django==4.0.1
|
[tool.poetry] name = "sample" version = "0.1.0" description = "" authors = ["username <*****@*******>"] [tool.poetry.dependencies] python = ">=3.8,<3.9" Django = "4.0.1" [tool.poetry.dev-dependencies] django-stubs = "^1.9.0" [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" |
| 設定ファイルに基づく依存解決 | pip install -r requirements.txt |
poetry install |
| パッケージの追加方法 |
pip install <package-name>requirements.txtには手動で追記。
|
poetry add <package-name>pyproject.tomlには自動で追記。
|
| パッケージのlockファイル |
requirements.lockpip freezeコマンドでの手動生成
|
poetry.lock自動生成。 poetry lockコマンドでの手動生成・更新も可能。
|
| 開発環境向けのパッケージ管理 |
requirements-dev.txtなどで管理。 |
pyproject.toml内の[tool.poetry.dev-dependencies]で管理。
|
| 開発環境向けのパッケージ追加 |
pip install -r requirements-dev.txtrequirements-dev.txtなどに手動で追記する必要あり。 |
poetry add -D <package-name>pyproject.tomlには自動で追記。
|
Poetry 導入のメリット
もともとpipで感じていた課題と対応する形でメリットについて整理します。
pip install パッケージ名で導入した際にrequirements.txtへの記載漏れというヒューマンエラーが発生する。requirements.txtにおいてパッケージバージョンの記載漏れというヒューマンエラーが発生する。
上記2つの課題については、Poetry によってインストール時のパッケージとバージョンが自動で追記されるため、ヒューマンエラーの発生を防げるようになりました。
pipでのパッケージ間の依存関係解決は弱く、インストールの順序関係によってはエラーが発生する。
これまで依存関係解決について触れませんでしたが、Poetry は pip と異なるより強固な依存関係リゾルバが採用されており、順序関係によるような依存関係解決のエラーは発生しにくいようになっています。 これは Poetry の README でも強みとして記載されています。
Poetry - Why?、https://github.com/python-poetry/poetry#why
pip freezeによるバージョン固定ファイルを手動で実施する必要があり、開発者間で異なるバージョンがインストールされ、環境差異が発生する。
Poetry ではpoetry.lockが自動生成されます。
またpoetry.lockが存在すればpoetry install時は優先して読み込まれるため、開発者簡で異なるバージョンがインストールされる事象を防ぐことができます。
- 開発環境特有のパッケージ管理問題。
requirements-dev.txtのように別ファイルで管理するコストが辛い。
Poetryでは、pyproject.toml内の[tool.poetry.dev-dependencies]で開発環境固有のパッケージを管理できます。
これにより、開発環境固有のパッケージも同一ファイルで管理でき、コストを削減できます。
pip から Poetry に移行するに当たって
実際に pip から Poetry へ移行するに当たって考慮すべきポイントをまとめておきます。
requirements.txtからpyproject.tomlへの移行について
まずrequirements.txtからpyproject.tomlに移行する必要があります。
現時点では、Poetry 側では依存関係を既存のrequirements.txtから取り入れる方法はサポートされていません。
そのため、既存の開発環境で Poetry を適用する際には、移行作業に充てる時間を多く見積もっておいた方が良いでしょう。
シェルスクリプトを使うことである程度、自動化は図れますが、pyproject.tomlを準備するコストがかかると認識しておいて損はないでしょう。
参考までに既存プロジェクトにおける Poetry への移行方法について、 Stack Overflow での質問リンクを載せておきます。
How to import requirements.txt from an existing project using Poetry、https://stackoverflow.com/questions/62764148/how-to-import-requirements-txt-from-an-existing-project-using-poetry
チームメンバーの開発環境の整備
チームで使えるように開発環境構築のドキュメントなどを整え、設定などを共有する必要があります。
例えば、私たちのチームでは Poetry によって作成される仮想環境のvenvがプロジェクト内になるように設定するよう周知しています。
# プロジェクト内に`.venv`を置くように設定変更 poetry config virtualenvs.in-project true
新しいツールを導入する際は、このあたりの設定の意図がチームメンバーに伝わるようにすることは開発をスムーズに進める上でも重要でしょう。

CI/CD環境の更新
すでに CI/CD パイプラインがあるプロジェクトでは、Poetry を利用する方式に変更する必要があります。 GitHub Actions 上では Poetry の Actions が公開されているのでそちらを利用するのが良いでしょう。
Python Poetry Action、https://github.com/marketplace/actions/python-poetry-action
以下は、GitHub Actions において Poetry を使って依存関係解決を行う際の設定ファイルの記述例になります。
- name: Setup Poetry
uses: abatilo/actions-poetry@v2.0.0
with:
poetry-version: "1.1.14"
- name: Install dependencies
run: poetry install
まとめ
今回は、私たちのチームで Python のパッケージ管理ツールとして Poetry を利用し始めたことについて紹介しました。 似たような課題をお持ちの方はぜひ Poetry の導入を検討してみてはいかがでしょうか。
私たちは同じチームで働いてくれる仲間を探しています。AI 製品開発に興味がある方のご応募をお待ちしております。
執筆:@yamada.y、レビュー:@sato.taichi (Shodoで執筆されました)
-
サーバーアプリ開発環境(Python/FastAPI)、https://future-architect.github.io/articles/20210611a/↩
-
pipとpipenvとpoetryの技術的・歴史的背景とその展望、https://vaaaaaanquish.hatenablog.com/entry/2021/03/29/221715↩



