poetryの概要を書いてみた
Poetryとは
Pythonのパッケージ管理ツールの1つ。他の有名どころだとpipenvとかpyflowとか。
ドキュメントは以下にあります。
https://python-poetry.org/
久々に見たら公式サイトが超かっこよくなってる
特徴
pyproject.toml
やpoetry.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-dsl
でelasticsearch-dsl
のみが入ったモジュールが構成できる
requirements
を出力する
諸事情でrequirementsを出力させたい場合は、以下のコマンドで出力できる。
poetry export -f requirements.txt > requirements.txt
使ってて気になった点
更新が圧倒的に早い
比較的頻繁に改良されていることもあり、環境にpoetryを導入するようなコンテナを立てると気づいたらバージョンが変わってたりする。poetry起因で落ちることもあるので、安定的に動かすにはバージョン指定を推奨。(configの設定箇所が突如変更になりdockerfileでコケた経験有)
依存関係の解決状態がわからなくなることがある
通信が不安定な環境で、install
やadd
で妙に時間がかかっている場合は-v
オプションで実行ログを表示させるとよい。依存関係の誤りで無限ループしていたりすることがある(pyprojectを直で編集しているとたまに起こる)。