poetryの使い方
概要
requirements.txt
に変わるパッケージマネージメント- pipでインストールするより、厳格に依存を管理する
- pipでは環境を作れるのに、poetryでは通らないケースがある
- venvを
git init
の感覚で使用できる- 環境を汚染するかもしれないパッケージを使用してもグローバルを汚染しない
ドキュメント
install
Linux, macOS, Windows(WSL)
$ curl -sSL https://install.python-poetry.org | python3 -
ubuntu
$ sudo apt install python3-poetry
uninstall
$ curl -sSL https://install.python-poetry.org | python3 - --uninstall
$ rm -rf ~/.poetry
projectの作成
$ poetry new <project-name> # 新規にディレクトリを作成する場合
$ poetry new . # 現在のディレクトリを新規に管理する場合
既存のディレクトリをpoetry管理
$ poetry init
envに入る
$ poetry shell
envに入っているかどうかの確認
$ which python3
# ~/Library/Caches/pypoetry/virtualenvs/tests-lightweight-mmm-tlHTGgKh-py3.10/bin/python3 などのようにpoetryのvenvのバイナリを指しているかで判断
envの確認
$ poetry env list
envの削除
$ poetry env remove env-name
envの外からpoetryの環境でコマンドを実行する
poetry run
を利用することで、poetry shell
で発生する可能性がある(システムPATHが交じることによる)PATHの優先順位の問題による不整合などを回避できる
$ poetry run python3 script-name # pythonのスクリプトを実行する場合
$ poetry run jupyter lab --port 2000 # PATH汚染を回避してjupyterを実行する場合
pyenvと組み合わせて特定のバージョンのpythonを使用する
- 例として
3.11.4
を使用する場合を記す
$ cd <poetry-project>
$ pyenv local 3.11.4
# pyproject.tomlを編集してpythonバージョンを3.11.4に固定
$ poetry env use python3.11
$ poetry install
パッケージのインストール
$ poetry add package-name
- addしたパッケージは自動で
poetry.toml
に追加される
依存のインストール
$ poetry install
poetry.toml
を参照してインストールされる
poetry.lockとpoetry.toml
- poetry.tomlだけでも環境構築できるが完全に再現するにはpoetry.lockも利用する
scriptの実行
$ poetry run script
scriptの追加
project.toml
を編集
[tool.poetry.scripts]
test = 'scripts:test'
- ルートディレクトリに
scripts.py
を作成
import subprocess
def test():
"""
Run all unittests. Equivalent to:
`poetry run python -u -m unittest discover`
"""
subprocess.run(
['python', '-u', '-m', 'unittest', 'discover']
)
- 実行
$ poetry run test
トラブルシューティング
poetryのパッケージが壊れる
- 原因
- pythonのバージョンのアップグレードや混在で壊れる
- 対応
- poetryを一度アンイストールして、
rm -rf ~/.poetry
して再度インストール
- poetryを一度アンイストールして、
pyarrowがaddできない
- 原因
pip
を最新化する必要があった
- 対応
- pipを最新化して
poetry add pip
する
- pipを最新化して
poetryを使ったDockerfileのテンプレート
FROM python
ENV POETRY_VIRTUALENVS_CREATE=false # poetry経由でインストールしたライブラリを参照可能にするのに必要
RUN apt-get update -y && apt-get install -y
RUN pip install --upgrade pip && pip install poetry
WORKDIR /app
COPY . /app/
RUN poetry install --no-ansi --no-interaction
CMD sh -c "<command>"