Pythonのパッケージ管理ツールPoetryを使用する
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に含まれる情報
- プロジェクト名、バージョン、著作権情報
- 使用するPythonのバージョン
- 依存パッケージのリスト(依存パッケージのバージョン範囲も指定可能)
- ビルド時のスクリプトやコマンド
[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について
- Poetryを使用して管理されているPythonプロジェクトの依存関係を追跡するために使用されます。
- このファイルには、プロジェクトが依存しているライブラリやフレームワークなどのパッケージの正確なバージョンが含まれています。
- 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