poetryの概要を書いてみた

Poetryとは

Pythonのパッケージ管理ツールの1つ。他の有名どころだとpipenvとかpyflowとか。 ドキュメントは以下にあります。
https://python-poetry.org/
久々に見たら公式サイトが超かっこよくなってる

特徴

  • pyproject.tomlpoetry.lockのファイル2つだけで管理ができるので、かなりシンプル
  • 依存関係周りの解決がpipenvよりも強力かつ高速(個人的にはそう思ってるが、客観的なデータ無いのが気になる)
  • コマンドがシンプル

実際に導入してみる

非常に簡単で、以下のコマンド一発で導入できる。 特に指定しなければ以下の通りhomeフォルダの配下に出来上がる。

user@hostname:/mnt/c/Users/user$ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
Retrieving Poetry metadata

# Welcome to Poetry!

This will download and install the latest version of Poetry,
a dependency and package manager for Python.

It will add the `poetry` command to Poetry's bin directory, located at:

$HOME/.poetry/bin

This path will then be added to your `PATH` environment variable by
modifying the profile file located at:

$HOME/.profile

You can uninstall at any time by executing this script with the --uninstall option,
and these changes will be reverted.

Installing version: 1.0.5

  - Downloading poetry-1.0.5-linux.tar.gz (23.37MB)


Poetry (1.0.5) is installed now. Great!

To get started you need Poetry's bin directory ($HOME/.poetry/bin) in your `PATH`
environment variable. Next time you log in this will be done
automatically.

To configure your current shell run `source $HOME/.poetry/env`

インストール後に再ログオンすると自動で設定されるが、すぐに使いたい場合は以下の設定をするとよい

user@hostname:~$ . ./bash_profile

ただし、デフォルトの設定だとvenvを開発環境ではなく個人の環境に作ってしまう 導入時に以下のコマンドでvenvの作成場所を各プロジェクト単位に作ったほうが楽と思われる

user@hostname:~$ poetry config --list
cache-dir = "/mnt/c/Users/user/linux_home/.cache/pypoetry"
virtualenvs.create = true
virtualenvs.in-project = false
virtualenvs.path = "{cache-dir}/virtualenvs"  # /mnt/c/Users/user/linux_home/.cache/pypoetry/virtualenvs
user@hostname:~$ poetry config virtualenvs.in-project true

プロキシ環境や非接続環境での導入

推奨となるインストールスクリプトはproxyを通さない通信を行うため、以下のいずれかの対応が必要となる - プロキシサーバーがある場合pip経由でインストールするpip install poetry --proxy https://hogehoge - tarファイルと直接持ち込んで展開する

基本的な使い方

基本的には以下のコマンドが扱えれば、おおよそ扱うことができる。

新規にpyproject.tomlを作成する

poetry init

基本的には聞かれるままに進めていくとよい。

パッケージを追加する

poetry add hogehoge

開発環境のみに導入する場合は以下のコマンドで対応できる。

poetry add hogehoge --dev

パッケージを削除する

poetry remove hogehoge

pyproject.tomlからvenvを作成する

poetry install

開発環境用のパッケージを含めないようにするには以下を使える

poetry install --no-dev

poetryの環境で実行する

poetry run hogehoge.py

覚えると便利そう

複数のプロジェクトを一つの環境で管理する

複数のプロジェクトで使用する環境を一つで管理し複数建てたいといった要望がある場合、以下のような対応ができる ちゃんと分けろよ!という突っ込みが出るかもだけど・・・
- 分ける必要があるものをoptionalでインストール

poetry add elasticsearch --optional
poetry add elasticsearch-dsl --optional
  • [tool.poetry.extras]を追記し、名前と必要なモジュールを定義(※[tool.poetry.dependencies]のすぐ下に作らないと動かなそう)
[tool.poetry]
name = "test"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

[tool.poetry.dependencies]
python = "^3.6"
elasticsearch = {version = "^7.6.0", optional = true}
elasticsearch-dsl = {version = "^7.1.0", optional = true}

[tool.poetry.extras]
es = ["elasticsearch"]
es-dsl = ["elasticsearch-dsl"]

[tool.poetry.dev-dependencies]

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

上記の定義だとpoetry install -E es-dslelasticsearch-dslのみが入ったモジュールが構成できる

requirementsを出力する

諸事情でrequirementsを出力させたい場合は、以下のコマンドで出力できる。

poetry export -f requirements.txt > requirements.txt

使ってて気になった点

更新が圧倒的に早い

比較的頻繁に改良されていることもあり、環境にpoetryを導入するようなコンテナを立てると気づいたらバージョンが変わってたりする。poetry起因で落ちることもあるので、安定的に動かすにはバージョン指定を推奨。(configの設定箇所が突如変更になりdockerfileでコケた経験有)

依存関係の解決状態がわからなくなることがある

通信が不安定な環境で、installaddで妙に時間がかかっている場合は-vオプションで実行ログを表示させるとよい。依存関係の誤りで無限ループしていたりすることがある(pyprojectを直で編集しているとたまに起こる)。