poetryを使ってpythonパッケージを作成する
 poetry new
新規にパッケージを作成する場合は poetry newする
$ poetry new poetry-demo
$ tree poetry-demo/
poetry-demo/
├── README.rst
├── poetry_demo
│   └── __init__.py
├── pyproject.toml
└── tests
    ├── __init__.py
    └── test_poetry_demo.py
- 
poetry-demoというディレクトリが作成される - その下にパッケージ用(
poetry_demo)とテスト用(tests)のディレクトリが作成される。パッケージ名の-は自動的に_に変換されるみたい - 
README.rstが空の状態で作成される。README.mdに変更してもよい - 
pyproject.tomlが作成される。今後いろいろ変更を追加していく設定ファイル 
Gitを使ったファイル管理
- 当たり前だけど 
poetryとgitは独立したツール - 
gitを使ったファイル管理をしたい場合は、プロジェクトルートでgit initする必要がある 
 poetry init
既存のディレクトリをpoetryでパッケージ化する場合は poetry init する
$ cd ディレクトリ名
$ poetry init
This command will guide you through creating your pyproject.toml config.
- 
pyproject.tomlを作成するためのダイアログが表示されるので、聞かれたことに従って内容を入力する。pyproject.tomlの内容は、あとで直接編集できるので、間違えてしまっても気にしなくてよい。 - ディレクトリの構造は 
poetry newした時のディレクトリ構造と同じになっているとよい 
$ cd ディレクトリ名
$ rye init
- 同じように
rye initできる - すでに
pyproject.tomlが存在していると失敗するため、poetryと共存させるのは簡単ではなさそう 
 poetry add
パッケージの動作に必要な外部パッケージをインストールする場合は poetry add する
$ poetry add pandas
$ poetry add plotly
$ poetry add kaleido==0.2.1
- 仮想環境に外部パッケージがインストールされる
- 
poetry.lockが作成される 
 - 
 - 
pyproject.tomlの[tool.poetry.dependencies]セクションにパッケージ名が追加される- 基本的に最新のバージョンが追加される
 - バージョンを指定して追加することもできる
 
 - 開発時にしか使わないモジュールは 
poetry add -Dを使う 
 poetry add -D
個人開発の場合、開発時の依存パッケージはわざわざ追加しなくてもいいのかも?
例えば JupyterLabやSphinxは、さまざまなパッケージの開発時に必要になることが多いが、それぞれのパッケージの仮想環境にインストールするよりも、pip3でシステムにインストールしておけば十分かもしれない。
このあたりの塩梅はよく分かってない。
- 
v1.2.0以降でpoetry add -Dしたら以下のdeprecated warningが表示された - 欲しかったパッケージ(
ipykernel)は[tool.poetry.group.dev.dependencies]に追加されていた 
$ poetry add -D ipykernel
The --dev option is deprecated, use the `--group dev` notation instead.
Using version ^6.15.3 for ipykernel
- 依存パッケージをグループ別に整理できる機能が追加されていた
 - たとえばテスト用(
--group test)、ドキュメント用(--group docs)などに分けて整理できるようになった - 追加パッケージ間の依存関係は、グループに関係なく管理される
 
$ poetry add --group test pytest
$ poetry add --group docs sphinx sphinx_rtd_theme myst_parser
$ rye add パッケージ名
$ rye add --dev パッケージ名
- 
pyproject.tomlに追記されるが、パッケージはまだインストールされない - 
--devかそうじゃないかのオプションしかない 
 poetry run
作成したスクリプトを実行する場合は poetry run する
$ poetry run python raw2csv.py
$ poetry run ./raw2csv.py
$ poetry run pytest
- 仮想環境の外から実行する場合に 
poetry runをつける必要がある - スクリプトに実行権限が付いている場合は、直接引数に指定すればOK
 - 外部パッケージのコマンドも同様に使うことができる
 - 仮想環境内のシェルを起動する場合は 
poetry shellする 
$ rye run コマンド
$ rye run python3 --version
- 
poetry shellに相当するコマンドがryeには存在しない- 直接
source .venv/bin/activate.fishする 
 - 直接
 - 
rye run コマンドを実行するほうが簡単かも 
 poetry install
依存するパッケージをすべてインストールする場合は poetry install する
$ poetry install
- 
poetry.lockの内容に書かれたファイルをインストールする - 
poetry.lockがない場合は、pyproject.tomlに書いてあるパッケージ(とバージョン)をインストールする - デフォルトでは自作パッケージもインストールされる
- このとき、ディレクトリ構造が 
poetry newしたときと同じ構造でないとエラー(No file / folder found for pakage パッケージ名)がでて、正しくインストールできない 
 - このとき、ディレクトリ構造が 
 - 自作パッケージをインストールしたくない場合は 
poetry install --no-rootする 
ディレクトリ構造を変更できない場合
pyproject.tomlの [tool.poetry.packages]で設定することができる
[tool.poetry]
# ...
packages = [
    { include = "scripts/*.py" }
]
- (原理的にディレクトリ構造を変更できないことはないと思うが)変更/整理するのがめんどくさいケースはあるかもしれない
 - たとえば
${PROJECT}/scripts/__init__.pyのような構造で作ってしまっていた場合は、上記のように設定すればOK(なはず) 
$ rye sync
 poetry.lock
- 
poetryを使っってインストールしたパッケージ情報を管理するためのロックファイル - このファイルを共有することで、異なる端末にも同様の開発環境(パッケージとバージョン)を整えることができる
 - 
gitリポジトリにコミットしておくとよい 
 poetry update
パッケージの依存関係を更新する場合は poetry update する
$ poetry show --outdated
- 更新が必要なパッケージを確認できる
 
$ poetry update
- 
pyproject.tomlに書いてあるパッケージに該当するバージョン(の最新の版)を取得して、poetry.lockを更新する - ドキュメントによると
poetry.lockを削除して、再度poetry installするのと同様のことをしているそう 
- 
poetry.lockは更新されるが、pyproject.tomlは更新されない - 
pyproject.tomlも更新する場合はpoetry add パッケージ名@latestする 
$ poetry add pandas@latest
$ poetry add plotly@latest
$ poetry add mystmd@latest --group=docs
$ rye add mystmd
Added mystmd>=1.1.53 as regular dependency
Reusing already existing virtualenv
Generating production lockfile: ${プロジェクトの絶対パス}/requirements.lock
Generating dev lockfile: ${プロジェクトの絶対パス}/requirements-dev.lock
Installing dependencies
   Built file:///{プロジェクトの絶対パス}
Built 1 editable in 158ms
Resolved 1 package in 0.37ms
Downloaded 1 package in 157ms
Uninstalled 2 packages in 6ms
Installed 2 packages in 1ms
 - mystmd==1.1.52
 + mystmd==1.1.53
 - statistics==0.1.0 (from file:///{プロジェクトの絶対パス})
 + statistics==0.1.0 (from file:///{プロジェクトの絶対パス})
Done!
- 
poetry updateに相当するコマンドはryeにはなさそう - 
rye add パッケージ名で最新版に更新できた - 次の3つのファイルが更新された
 
$ git status
pyproject.toml
requirements.lock
requirements-dev.lock
 pyproject.toml
poetryの設定は[tool.poetry]セクションに追記する
[tool.poetry]
name = "パッケージ名"(必須)
version = "0.1.0"(必須)
description = ""(必須)
license = "MIT"
authors = "名前 <メールアドレス>"(必須)
maintainers = ""
readme = "README.md"
homepage = ""
repository = ""
documentation = ""
keywords = ""
classifiers = []
packages = []
include = []
exclude = []
- (必須)と書いた項目以外はオプショナル
 - それぞれの項目の設定内容はあとで調べる
 
 pendulumのpyproject.toml
- 
pyproject.tomlの参考としてよさそう 
コマンドラインツール化
作成したパッケージをコマンドラインツールとして使いたい場合はpyproject.tomlの[tool.poetry.scripts]セクションに追加する
[tool.poetry.scripts]
snapsheets = "snapsheets.core:cli"
snapsheets-next = "snapsheets.next:cli"
- パッケージにある
ファイル名:関数名を設定する - 上記の設定だと 
snapsheets/core.pyのcli()という名前の関数が、snapsheetsというコマンドで実行できるようになる - コマンドは複数設定することができる。上の例では、次のリリースに向けていろいろ試している 
snapsheets-nextを追加している 
 poetry check
pyproject.tomlの内容に書き間違いがないかpoetry checkする
$ poetry check
All set!
 poetry build
PyPIにアップロードするファイルをビルドするには poetry buildする
$ poetry build
Building haniwers (0.0.5)
  - Building sdist
  - Built haniwers-0.0.5.tar.gz
  - Building wheel
  - Built haniwers-0.0.5-py3-none-any.whl
- 
wheel形式とsdist形式のファイルがdist/に作成される- 削除する場合は 
rm -r distする 
 - 削除する場合は 
 - 
-f [wheel/sdist]でビルド形式を指定することができる 
 poetry publish
PyPIやTestPyPIにパッケージを公開するには poetry publish する
$ poetry publish
$ poetry publish -r testpypi
- デフォルトの公開先は 
PyPIになっている - 
-r リポジトリ名で公開先を指定することができる - リポジトリ名は以下のようにして設定する
 
$ poetry config repositories.testpypi https://test.pypi.org/legacy/
 API Tokenの設定
PyPIやTestPyPIに公開するときは、API Tokenの設定をしておくとよい
$ poetry config pypi-token.pypi "PyPIのAPI Token"
$ poetry config pypi-token.testpypi "TestPyPIのAPI Token"
- API Tokenはそれそれのウェブサイトのアカウント設定から発行する
 - Tokenには名前をつけて、scopeは適切に設定する( 
all projectsor 特定のパッケージ ) - Tokenはマシンごとに発行して、設定する必要がある(はず)
 
 poetry config
poetryの設定を確認したり、変更したりするには poetry config する
$ poetry config --list
cache-dir = "/Users/shotakaha/Library/Caches/pypoetry"
experimental.new-installer = false
installer.parallel = true
virtualenvs.create = true
virtualenvs.in-project = null
virtualenvs.path = "{cache-dir}/virtualenvs"  # /Users/shotakaha/Library/Caches/pypoetry/virtualenvs
- デフォルトの設定は上記のようになっている
 - 設定は 
~/Library/Application Support/pypoetry/config.tomlに書いてある - 
PyPI/TestPyPIの設定はここに表示されないみたい(どこにいったんだろう?) 
 poetry + vscode
virtualenvs.in-project = true にしておいたほうがいいっぽい
$ poetry config virtualenvs.in-project true
- カレントディレクトリの 
.venvに仮想環境が作られる - 
vscodeはここにある仮想環境を勝手に読み込んでくれる(らしい) 
すでに仮想環境を作ってしまっている場合は、そのディレクトリを一旦削除してから poetry install しなおせばOK
$ cd ~/Library/Caches/pypoetry/virtualenvs/
$ rm -r 該当する仮想環境
 poetry env
現在の仮想環境で使っている Pythonのバージョンなどを確認したり、変更したりする場合は poetry env する
$ poetry env info
Virtualenv
Python:         3.9.13
Implementation: CPython
Path:           /Users/shotakaha/Library/Caches/pypoetry/virtualenvs/snapsheets-mU0WpA-6-py3.9
Valid:          True
System
Platform: darwin
OS:       posix
Python:   /opt/homebrew/opt/python@3.9/Frameworks/Python.framework/Versions/3.9
別のマシンは 3.10になっていた
$ poetry env info
Virtualenv
Python:         3.10.4
Implementation: CPython
Path:           /Users/shotakaha/Library/Caches/pypoetry/virtualenvs/snapsheets-mU0WpA-6-py3.10
Valid:          True
System
Platform: darwin
OS:       posix
Python:   /usr/local/opt/python@3.10/Frameworks/Python.framework/Versions/3.10
仮想環境を起動
$ poetry shell  # poetry < 2.0.0
$ source .venv/bin/activate.fish  # poetry >= 2.0.0
- これまで 
poetry shellで仮想環境を起動できた - このサブコマンドは 
poetry 2.0.0で削除された - 
source .venv/bin/activate.fishで起動できる 
$ poetry env activate
source /Users/ユーザー名/...(プロジェクトのパス).../.venv/bin/activate.fish
- 
poetry env activateで必要なコマンドを確認できる 
virtualenvsの作り方
$ poetry config virtualenvs.options.no-pip true
$ poetry config virtualenvs.options.no-setuptools true
$ poetry config virtualenvs.options.system-site-packages true
- 仮想環境を作成するときに
virtualenvs --no-pipオプションが渡される。poetryはvertualenvsに組み込まれたpipを使っているが、仮想環境に他のパッケージを追加したくない場合はtrueにするとよい。合わせてno-setuptools=trueにするとよい。 - 仮想環境を作成するときに
virtualenvs --no-setuptoolsオプションが渡される。setuptoolsがインストールされなくなる。Poetryにとっては問題ない。 - システムにインストールしたパッケージを使えるようにしたいので
system-site-packages=trueにした。