電通総研 テックブログ

電通総研が運営する技術ブログ

Poetry はじめました - チーム開発における Python の開発環境

こんにちは。 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.lock
pip freezeコマンドでの手動生成
poetry.lock
自動生成。poetry lockコマンドでの手動生成・更新も可能。
開発環境向けのパッケージ管理 requirements-dev.txtなどで管理。
pyproject.toml内の
[tool.poetry.dev-dependencies]で管理。
開発環境向けのパッケージ追加 pip install -r requirements-dev.txt
requirements-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.taichiShodoで執筆されました


  1. サーバーアプリ開発環境(Python/FastAPI)、https://future-architect.github.io/articles/20210611a/

  2. pipとpipenvとpoetryの技術的・歴史的背景とその展望、https://vaaaaaanquish.hatenablog.com/entry/2021/03/29/221715