Poetry に入門する

公式ドキュメントを参考に、基本的な部分を確認します。

https://python-poetry.org/

環境

Poetry のインストール

$ curl -sSL https://install.python-poetry.org | python3 -
$ echo 'export PATH="/home/{ユーザー名}/.local/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
$ poetry --version
Poetry version 1.1.13

installation

Bash completion

$ poetry completions bash | sudo tee /etc/bash_completion.d/poetry

Enable tab completion for Bash, Fish, or Zsh

新規プロジェクトの作成

$ poetry new poetry-demo

poetry new

ディレクトリ構造。

./poetry-demo/
├── README.rst
├── poetry_demo
│   └── __init__.py
├── pyproject.toml
└── tests
    ├── __init__.py
    └── test_poetry_demo.py

pyproject.toml

[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

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

[tool.poetry.dev-dependencies]
pytest = "^5.2"

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

プロジェクトに Python パッケージのインストール(poetry add コマンド)

Flask をバージョン指定してインストール。

$ poetry add flask=2.1.0

poetry add

toml ファイルに Flask の記述が追加されている。

poetry-demo/pyproject.toml

[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

[tool.poetry.dependencies]
python = "^3.8"
Flask = "2.1.0"

[tool.poetry.dev-dependencies]
pytest = "^5.2"

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

Python 仮想環境の起動

$ poetry shell
Spawning shell within /home/mikochi/.cache/pypoetry/virtualenvs/poetry-demo-BneQjLxR-py3.8
mikochi@LAPTOP:~/work/poetry-demo$ . /home/mikochi/.cache/pypoetry/virtualenvs/poetry-demo-BneQjLxR-py3.8/bin/activate
(poetry-demo-BneQjLxR-py3.8) mikochi@LAPTOP:~/work/poetry-demo$ python
Python 3.8.10 (default, Mar 15 2022, 12:22:08)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import flask
>>> print(flask.__version__)
2.1.0

poetry shell

抜けるときは exit コマンド。

プロジェクトに Python パッケージのインストール(toml ファイルに追記)

toml ファイルに直接追記することで、 FastAPI をインストールします。

poetry-demo/pyproject.toml

[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

[tool.poetry.dependencies]
python = "^3.8"
Flask = "2.1.0"
FastAPI = "0.74.0"  # add

[tool.poetry.dev-dependencies]
pytest = "^5.2"

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

dependencies and dependency groups

update コマンドでインストールされます。

$ poetry update

poetry update

install コマンドでは、以下の通り怒られます。lock file と pyproject.toml が一致していない。

$ poetry install
Installing dependencies from lock file
Warning: The lock file is not up to date with the latest changes in pyproject.toml. You may be getting outdated dependencies. Run update to update them.

  SolverProblemError

poetry install

lock file とは、

When Poetry has finished installing, it writes all the packages and their exact versions that it downloaded to the poetry.lock file, locking the project to those specific versions.

Installing without poetry.lock

Python のバージョンを指定して、 Python 仮想環境を作成する

Poetry は、OS デフォルトの Python バージョンを利用して仮想環境を作成するとのこと。

By default, Poetry will try to use the currently activated Python version to create the virtual environment for the current project.

Managing environments

env use コマンドで、利用したい Python のパスを指定すると、そのパスの Python で仮想環境を作ってくれます。

$ poetry new poetry-demo2
Created package poetry_demo2 in poetry-demo2
$ cd poetry-demo2/
$ which python3.9
/usr/bin/python3.9
$ poetry env use /usr/bin/python3.9
Creating virtualenv poetry-demo2-SAZXFJgb-py3.9 in /home/mikochi/.cache/pypoetry/virtualenvs
Using virtualenv: /home/mikochi/.cache/pypoetry/virtualenvs/poetry-demo2-SAZXFJgb-py3.9

Switching between environments

環境の確認。

$ poetry env info

Virtualenv
Python:         3.9.13
Implementation: CPython
Path:           /home/mikochi/.cache/pypoetry/virtualenvs/poetry-demo2-SAZXFJgb-py3.9
Valid:          True

System
Platform: linux
OS:       posix
Python:   /usr

Displaying the environment information

でも、TOML ファイルの記述は更新されないので、もやっとします。

poetry-demo2/pyproject.toml

[tool.poetry]
name = "poetry-demo2"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

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

[tool.poetry.dev-dependencies]
pytest = "^5.2"

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

その他、 OS デフォルトの Python バージョンを pyenv で管理することで、仮想環境の Python バージョンを切り替える方法も紹介されていました。

Python スクリプトの実行

テスト用に、以下のスクリプトを用意します。

poetry-demo2/demo.py

import sys

def demo():
    print(sys.version)

if __name__ == "__main__":
    demo()

run コマンドに Python コマンドを渡すことで、仮想環境上で Python コマンドを実行してくれます。

$ poetry run python demo.py
3.9.13 (main, May 23 2022, 22:01:06)
[GCC 9.4.0]

run

TOML ファイルの tool.poetry.scripts セクションに、エイリアスとなる情報を設定できます。

poetry-demo2/pyproject.toml

[tool.poetry]
name = "poetry-demo2"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

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

[tool.poetry.dev-dependencies]
pytest = "^5.2"

[tool.poetry.scripts]  # add
demo = 'demo:demo'     # add

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

scripts

TOML ファイルに設定した名前で実行できるようになります。

$ poetry run demo
3.9.13 (main, May 23 2022, 22:01:06)
[GCC 9.4.0]

とりあえず、こんなところで。