問題
既存の Poetry プロジェクトの依存パッケージをインストールしようとしたら、一生終わらなかった。
$ poetry install -vvv
Loading configuration file /home/kino-ma/.config/pypoetry/config.toml
Using virtualenv: /home/kino-ma/.cache/pypoetry/virtualenvs/***
Updating dependencies
Resolving dependencies...
1: fact: *** is 0.1.0
1: derived: ***
1: fact: *** depends on fastapi (<=103)
1: fact: *** depends on pydantic-settings (^2.0.3)
1: fact: *** depends on uvicorn (^0.24.0)
1: fact: *** depends on python-multipart (^0.0.6)
1: selecting *** (0.1.0)
1: derived: python-multipart (>=0.0.6,<0.0.7)
1: derived: uvicorn (>=0.24.0,<0.25.0)
1: derived: pydantic-settings (>=2.0.3,<3.0.0)
1: derived: fastapi (<=103)
[keyring.backend] Loading KWallet
[keyring.backend] Loading SecretService
[keyring.backend] Loading Windows
[keyring.backend] Loading chainer
[keyring.backend] Loading libsecret
[keyring.backend] Loading macOS
# ここで止まる
特に CPU を使っている様子もなく、本当にインストール処理が走っているか怪しかった
環境
$ uname -a
Linux *** 5.4.0-155-generic #172-Ubuntu SMP Fri Jul 7 16:10:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
$ python3 --version
Python 3.8.10
$ pip3 --version
pip 20.0.2 from /usr/lib/python3/dist-packages/pip
$ pipx --version
1.2.1
$ poetry --version
Poetry (version 1.7.0)
解決
Poetry は、パッケージ公開機能を便利にするために OS のキーリングを読むらしい。
本来 install 処理にその挙動は必要ないはずだが、なんでか読みにいってしまい固まっている様子。
上記コメントに解決策 (workaround) が書いてある。
PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring
と環境変数を設定すればキーリングを読まずに操作が行えるらしい。
$ PYTHON_KEYRING_BACKEND=keyring.backends.fail.Keyring poetry install -vvv
Loading configuration file /home/kino-ma/.config/pypoetry/config.toml
Using virtualenv: /home/kino-ma/.cache/pypoetry/virtualenvs/***
Updating dependencies
Resolving dependencies...
1: fact: *** is 0.1.0
1: derived: ***
1: fact: *** depends on fastapi (<=103)
1: fact: *** depends on pydantic-settings (^2.0.3)
1: fact: *** depends on uvicorn (^0.24.0)
1: fact: *** depends on python-multipart (^0.0.6)
1: selecting *** (0.1.0)
1: derived: python-multipart (>=0.0.6,<0.0.7)
1: derived: uvicorn (>=0.24.0,<0.25.0)
1: derived: pydantic-settings (>=2.0.3,<3.0.0)
1: derived: fastapi (<=103)
No suitable keyring backend found
No suitable keyring backends were found
Keyring is not available, credentials will be stored and retrieved from configuration files as plaintext.
Creating new session for pypi.org
[urllib3.connectionpool] Starting new HTTPS connection (1): pypi.org:443
[urllib3.connectionpool] https://pypi.org:443 "GET /simple/python-multipart/ HTTP/1.1" 200 1399
[filelock] Attempting to acquire lock 22872701901696 on /home/kino-ma/.cache/pypoetry/cache/repositories/PyPI/_http/8/f/9/7/e/8f97ef75556783011e845ded3fc9022e2cd218389c6cb033450483a6.lock
[filelock] Lock 22872701901696 acquired on /home/kino-ma/.cache/pypoetry/cache/repositories/PyPI/_http/8/f/9/7/e/8f97ef755567830
# 中略...
Installing the current project: *** (0.1.0)
- Building package *** in editable mode
The current project could not be installed: No file/folder found for package ***
If you do not want to install the current project use --no-root
すぐに終わった。
他に試したこと
自分には効かなかったが、誰かには効果があるかもしれないので残しておく。
キャッシュ、 venv の削除
効果なし。
また、コメントでは experimental.new-installer
とやらのコンフィグを削除するよう提案されているが、そもそもそんな機能はないと言って実行できなかった。
ほかに IPv6 を無効化して解決したコメントも見受けられたが、操作対象ホストは IPv6 アドレスを持っていなかった。
$ poetry config experimental.new-installer true
Setting experimental.new-installer does not exist
Poetry のアップグレード
python3 -m pip install --upgrade virtualenv
効果なし。
そもそも最新版だった。
ロックファイルの削除
効果なし。
余談
Poetry の依存解決が遅いという issue で PyPI の依存解決アルゴリズムがイケてないという指摘からディスカッションが大炎上していて興味深かった。