Poetryは比較的新しいPythonの依存管理ツールで、 pipenvの依存解決に失敗することがある問題を解消したり、ライブラリを開発しやすくしたものらしい。 まだスターはpipenvの半分ほどだがバージョンもv1.0.0に到達したしpipenvよりも速くて安定しているという話もあるので使ってみる。
インストール
pipでインストールした。ドキュメントによると依存が衝突する可能性があるとのことだったが、自分の環境では特に問題なかった。
$ pip install --user poetry
$ poetry --version
Poetry version 1.0.9
使い方
PEP 518で定義されている設定ファイルpyproject.tomlを置く。
$ cat pyproject.toml
[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = ["sambaiz <[email protected]>"]
[tool.poetry.dependencies]
python = "^3.7"
[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
poetry addするとvenvがなければ作成してその中にパッケージをインストールしpyproject.toml
にも追加する。
$ poetry add pendulum
Creating virtualenv poetry-demo-t1vYebNd-py3.7 in /Users/*****/Library/Caches/pypoetry/virtualenvs
...
$ cat pyproject.toml
...
[tool.poetry.dependencies]
python = "^3.7"
pendulum = "^2.1.1"
poetry install でpyproject.toml
内の依存パッケージをインストールできる。
$ poetry install
poetry shellでvenvの中に入れる。
$ poetry shell
(poetry-demo-t1vYebNd-py3.7) bash-3.2$
poetry runでvenv内でコマンドを実行できる。定義したscriptsを実行することもできる。
$ poetry run python main.py
$ cat hello.py
def main():
print("hello world")
$ cat pyproject.toml
...
[tool.poetry.scripts]
hi = "hello:main"
$ poetry run hi
hello world
poetry buildでパッケージングしてpoetry publishでPyPIに上げられる。
$ poetry build
$ poetry publish
VSCode
virtualenvs.in-project trueで.venv/
がプロジェクトのディレクトリ直下に作られるようにすれば自動で読まれる。
$ poetry env list
poetry-demo-UOTu_-PB-py3.7 (Activated)
$ poetry env remove poetry-demo-UOTu_-PB-py3.7
$ poetry config virtualenvs.in-project true
$ poetry install
制限
AWSのLambdaをデプロイする場合、zipに依存パッケージを含める必要があるが、現状poetryは-t, --target
フラグをサポートしていない。
issueは立っている。
$ pip install --target ./package requests
$ cd package && zip -r ../my-deployment-package.zip . && cd ..
$ zip -g my-deployment-package.zip lambda_function.py