🫠

Pythonのパッケージ管理ツールPoetryを使用する

2023/05/20に公開

Poetryは、Pythonのパッケージ管理ツールです。
今までパッケージ管理せずにコードを書いていたので、Poetryの使い方を学習します。

学習するメリット
・共同作業時に環境を合わせることができる
・個人開発でコードを公開するときに役立ちそう

Poetry は、 Python で依存関係を管理およびパッケージ化するためのツールです。これを使用すると、プロジェクトが依存するライブラリを宣言でき、ライブラリが管理 (インストール/更新) されます。Poetry は、繰り返しインストールを確実にするためのロックファイルを提供し、配布用にプロジェクトを構築できます。
https://python-poetry.org/docs/

構築する環境

windows11 23H2

windowsでのインストール方法

Powershellを立ち上げ以下のコマンドを実行する

$ (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -

C:\Users{user_name}\AppData\Roaming\Python\Scriptsをユーザー環境変数のPathに設定する

$ [System.Environment]::SetEnvironmentVariable('path', $env:APPDATA + "\Python\Scripts;" + [System.Environment]::GetEnvironmentVariable('path', "User"),"User")

OSごとにインストール方法が異なるので、詳細は公式をご確認ください。

公式のやり方ではないのですが、pip install poetryでもインストールできて実行もできました。問題なく利用できてはいます。

初期設定

Pythonの仮想環境をプロジェクトディレクトリ内に作成して、各プロジェクトごとに環境を分離させる設定を行います。

# プロジェクトに.venvがpoetry install時に作成される
$ poetry config virtualenvs.in-project true
# Poetryの設定を確認する
$ poetry config --list
virtualenvs.in-project = true

新しいプロジェクトを作成する

$ poetry new poetry-demo

いくつかの質問に回答して、
Pythonのプロジェクト向きのテンプレートファイルを一式生成してくれました。

$ tree
.
├── poetry-demo
│   ├── README.md
│   ├── poetry_demo
│   │   └── __init__.py
│   ├── pyproject.toml
│   └── tests
│       └── __init__.py

ここで登場したpyproject.tomlファイルは、Pythonのプロジェクト管理ツールであるPoetryによって使用される設定ファイルです。
このファイルのおかげで、開発者は簡単にプロジェクトの依存関係を管理したり、開発やデプロイのための実行コマンドを定義したりできます。

pyproject.tomlに含まれる情報

  1. プロジェクト名、バージョン、著作権情報
  2. 使用するPythonのバージョン
  3. 依存パッケージのリスト(依存パッケージのバージョン範囲も指定可能)
  4. ビルド時のスクリプトやコマンド
[tool.poetry]
name = "bakara"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]
readme = "README.md"

[tool.poetry.dependencies]
python = "^3.12"

[tool.poetry.group.dev.dependencies]
loguru = "^0.7.2"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

既存のプロジェクトにPoetryの仮想環境を作成する

poetry init -n

-nはpyproject.tomlファイルの内容を最小限にするオプションです。
-nを使わずに実行すると、いくつか入力を求められます。

ライブラリの追加

今度は、今回作成したプロジェクトにライブラリを追加します。

$ cd poetry-demo
$ poetry add requests
  • Installing certifi (2023.5.7)
  • Installing charset-normalizer (3.1.0)
  • Installing idna (3.4)
  • Installing urllib3 (2.0.2)
  • Installing requests (2.30.0)

Writing lock file

pyproject.tomlに「requests = "^2.30.0"」が追加されていればOKです。
自動的に適切なバージョン制約を見つけ、パッケージとその依存関係を インストールします。

pyproject.toml

[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = ["kkj <kkj>"]
readme = "README.md"
packages = [{include = "poetry_demo"}]

[tool.poetry.dependencies]
python = "^3.10"
+ requests = "^2.30.0"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

このときpoetry.lockというファイルが作成されます。

poetry.lockについて

  1. Poetryを使用して管理されているPythonプロジェクトの依存関係を追跡するために使用されます。
  2. このファイルには、プロジェクトが依存しているライブラリやフレームワークなどのパッケージの正確なバージョンが含まれています。
  3. poetry.lockファイルは手動で編集することはできず、自動的に生成および更新されます。たとえば、新しいパッケージがインストールされた場合、poetry.lockファイルが自動的に更新され、依存関係の最新のバージョンが反映されます。

node.jsのpackage-lock.jsonっぽい

試したコマンド

# 開発環境用のパッケージにpytestを追加する
$ poetry add --group dev pytest
# 追加したパッケージ一覧を表示する
$ poetry show
certifi            2023.5.7 Python package for providing Mozilla's C...
charset-normalizer 3.1.0    The Real First Universal Charset Detecto...  
idna               3.4      Internationalized Domain Names in Applic...  
requests           2.30.0   Python HTTP for Humans.
urllib3            2.0.2    HTTP library with thread-safe connection...

Poetryの環境内で実行する

main.pyというテストファイルを作成して実行します。

$ touch main.py
# $ vi main.py とかで以下と記述して保存する
print('hello world')
$ poetry shell
pypoetry/virtualenvs/poetry-demo-PVO3PcRv-py3.10/bin/activate
(poetry-demo-py3.10) xxxx:/mnt/c/pj/test_fastapi/poetry-demo$ 
python main.py
hello world
# poetry shellから抜けるとき
exit

仮想環境の外から実行する

$ poetry run python main.py
hello world
$ poetry run pytest

環境を構築する

# インストールする
$ poetry install
# ルートプロジェクトを除外する
$ poetry install --no-root
# 開発用は除外してインストールする
$ poetry install --without dev
  • poetry install --no-devは非推奨となりました。

Discussion