PoetryでPythonの依存パッケージを管理する

pythonvscodeaws

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 installpyproject.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

VSCodeのinterpreter path

制限

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