これは何? †
- Python プロジェクトの依存ライブラリとパッケージングを管理するためのフレームワーク
- Poetry の位置づけ
| Pip | Pipenv | Poetry | Pyflow |
プロジェクト作成 | | | ✓ | ✓ |
プロジェクト初期化 | | ✓ | ✓ | ✓ |
パッケージ追加 | ✓ | ✓ | ✓ | ✓ |
パッケージ削除 | ✓ | ✓ | ✓ | ✓ |
依存関係の解決 | ✓ | ✓ | ✓ | ✓ |
仮想環境での実行 | | ✓ | ✓ | ✓ |
パッケージのビルド | | | ✓ | ✓ |
パッケージの公開 | | | ✓ | ✓ |
- Pipenv で、仮想環境での実行ができるようになった (Pipenv (Pyenv) ができるまで、Python はグローバル環境に依存ライブラリをインストールしていて、アプリや開発環境で、同一アプリの別バージョンを使うことができなかった)
- Poetry/Pyflow で、パッケージのビルドまでできるようになった
- もっと新しい Pyflow もあるけど、とりあえず、みんな Poetry 使っているので、しばらくは Poetry 使っとけばよかろう
インストール †
- 公式サイトの通りやればいいが、Debian 10 では若干違うところがある https://python-poetry.org/docs/master/#installation
$ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py | python3 -
$ poetry --version
Poetry version 1.1.11
- インストール先は $HOME/.local/bin になる。~/.profile が読み込まれていないと PATH に追加されていないので注意。
cf Chromebook Crostini (Linux VM)#nf27ff2f
- サブコマンドの補完
$ poetry completions bash > poetry.bash-completion
$ sudo mv poetry.bash-completion /etc/bash_completion.d/
これで、poetry n[tab] で poetry new が補完される
サンプルプロジェクト †
- プロジェクト作る
$ poetry new poetry-demo
Created package poetry_demo in poetry-demo
- どんなのができたかな
$ tree poetry-demo/
poetry-demo/
├── README.rst
├── poetry_demo
│ └── __init__.py
├── pyproject.toml
└── tests
├── __init__.py
└── test_poetry_demo.py
2 directories, 5 files
にゃるほど。pyproject.toml 以外は普通の Pyton プロジェクトの構成
- pyproject.toml
[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = ["Atsushi HONDOH <atsushi.hondoh@gmail.com>"]
[tool.poetry.dependencies]
python = "^3.7"
[tool.poetry.dev-dependencies]
pytest = "^5.2"
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
なるほど、自分 (poetry-demo) のことと、依存関係が定義されているのね
numpy を依存関係に追加してみる †
- まずは dry-run (実際に追加せず、何が起きるか確認する)
$ poetry add numpy --dry-run
Creating virtualenv poetry-demo-CHH6Gb6n-py3.7 in /home/atsushihondoh/.cache/pypoetry/virtualenvs
Using version ^1.21.4 for numpy
Updating dependencies
Resolving dependencies... (40.7s)
SolverProblemError
The current project's Python requirement (>=3.7,<4.0) is not compatible with some of the required packages Python
requirement:
- numpy requires Python >=3.7,<3.11, so it will not be satisfied for Python >=3.11,<4.0
...
なるほど、poetry-demo プロジェクトとしては Python 3.7〜4.0 が指定されているけど、numpy 1.21.4 が対応しているのは 3.7〜3.11 だから numpy を依存ライブラリとして追加できないというわけか
- pyproject.toml を修正して再挑戦
[tool.poetry.dependencies]
-python = "^3.7"
+python = ">=3.7,<3.11"
$ poetry add numpy --dry-run
Using version ^1.21.4 for numpy
Updating dependencies
Resolving dependencies... (13.3s)
Writing lock file
Package operations: 12 installs, 0 updates, 0 removals
・ Installing typing-extensions (3.10.0.2)
・ Installing typing-extensions (3.10.0.2)
・ Installing zipp (3.6.0)
・ Installing zipp (3.6.0)
...
- 実際に追加してみる
$ poetry add numpy
- pyproject.toml
[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = ["Atsushi HONDOH <atsushi.hondoh@gmail.com>"]
[tool.poetry.dependencies]
python = ">=3.7,<3.11"
numpy = "^1.21.4"
[tool.poetry.dev-dependencies]
pytest = "^5.2"
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
よか
サブコマンドまとめ †
poetry new poetry-demo | プロジェクト作成 |
poerty init | 既存の非Poetry Pythonプロジェクトに pyproject.toml を追加する |
poetry install | Git から Checkout してきた Poetry プロジェクトの依存関係解決 |
poetry update | 依存関係最新化 |
poerty add numpy | 依存ライブラリの追加。--dry-run で実際には実行せずどうなるかを試せる |
poetry add -dev pyproject-flake8 | 開発用ライブラリ(コードチェッカなど)の追加。--dev は -D でもOK |
poetry remove numpy | 依存ライブラリの削除。--dry-run で実際には実行せずどうなるかを試せる |
poetry remove -dev pyproject-flake8 | 開発用ライブラリの削除 |
poetry show | 依存ライブラリの一覧表示 |
poetry show numpy | 依存ライブラリの詳細表示 |
poetry build | 配布パッケージ (wheel) 作成 |
poetry publish | リモートレポジトリに公開(*要リモートレポジトリへのアクセス設定) |
poetry config key val | pyproject.toml の編集 |
poerty run python -V | pyproject.toml で設定された仮想環境でのコマンド実行 |
poetry run my-script | pyproject.toml の [tool.poetry.scripts] に定義した my-script を実行 |
poetry check | pyproject.toml の構造チェック |
poetry search numpy | 参照しているレポジトリからライブラリを検索 |
poetry lock | pyproject.toml (定義情報) を更新せずに pyproject.lock (実際に使われる設定ファイル) を更新する |
Jupyter Notebook <Python+Typescript> †
- Jupyter Notebook のインストール
- Typescript plugin
- 実行
poetry-demo/$ poetry run jupyter notebook
- Python, Javascript, Typescript の Note を作ることが出来る
- Python の Note では、Poetry でインストールしたライブラリ (Numpy) を参照可能
- Typescript も使える
VSCode †
- 下記の poetry env use で利用する Python を指定する (= .venv/ を作る) と、VSCode はそれを使ってくれる
- .venv/ がない場合には、VSCode 側で指定する必要がある
- 実行環境の選択
- poetry プロジェクトを開くと、実行環境としてはデフォルトの python3 が選ばれている
- 画面左下の python3 をダブルクリックすると、環境を選べる。poetry でインストールしたインタプリターもリストされている
- poetry でインストールされたインタプリターが選択された
- VSCode 上では Jupyter Note を動かすことも出来る。Typescript も実行可能。地味にすごい
開発ツールの整備 †
$ poetry add -D black isort pyproject-flake8 flake8-bugbear mypy pre-commit
- isort
- pflake8
- flake8-bugbear
- mypy
- pre-commit
- 設定例 pyproject.tomi
[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = ["Atsushi HONDOH <atsushi.hondoh@gmail.com>"]
[[tool.poetry.source]]
name = "pypi mirror"
url = "http://192.168.10.32:8081/repository/pypi-group/simple/"
default = true
[tool.poetry.dependencies]
python = ">=3.7,<3.11"
numpy = "^1.21.4"
[tool.poetry.dev-dependencies]
pytest = "^5.2"
pyproject-flake8 = "^0.0.1-alpha.2"
jupyter = "^1.0.0"
black = "^22.1.0"
flake8-bugbear = "^22.1.11"
isort = "^5.10.1"
mypy = "^0.931"
pre-commit = "^2.17.0"
tensorflow = "^2.7.0"
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
[tool.flake8]
max-line-length = 119
max-complexity = 10
select = "C,E,F,W,B"
ignore = "E203"
[tool.black]
line-length = 119
exclude = '''
(
migrations
| .mypy_cache
| .pytest_cache
| .tox
| .venv
| dist
)
'''
[tool.mypy]
# common
python_version = 3.9
show_column_numbers = true
show_error_context = true
ignore_missing_imports = true
check_untyped_defs = true
disallow_untyped_defs = true
# warning
warn_return_any = true
warn_unused_configs = true
warn_redundant_casts = true
[tool.isort]
profile = "black"
line_length = 119
仮想環境 (venv) の Python を変更する †
$ cd ${PROJECT}
$ poetry env use python3.10
参考文献 †
Python