最近 Python をバージョンアップしたら、poetry の挙動がおかしい。poetry add や poetry install を実行して仮想環境にパッケージをインストールしようとしてもエラーを吐く。正確に言うとバージョンアップのせいなのかどうかはよくわからないのだけど、ほかに思い当たることもないんだ。
順を追ってみてみよう。Python と poetry のバージョンから。どちらも最新版。
takatoh@montana: w > python -V Python 3.9.7 takatoh@montana: w > poetry -V Poetry version 1.1.10
さて、まずは poetry new で新しいプロジェクトを作る。
takatoh@montana: w > poetry new py-sample Created package py_sample in py-sample
で、できたプロジェクトのフォルダに入って poetry add する。今回はよく使う click を追加してみた。
takatoh@montana: w > cd py-sample takatoh@montana: py-sample > poetry add click Creating virtualenv py-sample in C:\Users\takatoh\Documents\w\py-sample\.venv Using version ^8.0.1 for click Updating dependencies Resolving dependencies... Writing lock file Package operations: 11 installs, 0 updates, 0 removals • Installing pyparsing (2.4.7) • Installing atomicwrites (1.4.0) • Installing attrs (21.2.0) • Installing colorama (0.4.4) • Installing more-itertools (8.10.0) • Installing packaging (21.0) • Installing pluggy (0.13.1) • Installing py (1.10.0) • Installing wcwidth (0.2.5) • Installing click (8.0.1) • Installing pytest (5.4.3)
click のほかに仮想環境で使うパッケージもあわせて正常にインストールできた。
つぎに、いったん上のフォルダに移動して、別の新しいプロジェクトを作る。
takatoh@montana: py-sample > cd .. takatoh@montana: w > poetry new py-sample-2 Created package py_sample_2 in py-sample-2
今できたほうのフォルダに入って、さっきと同じように poetry add で click を追加してみる。すると:
takatoh@montana: w > cd py-sample-2
takatoh@montana: py-sample-2 > poetry add click
Creating virtualenv py-sample-2 in C:\Users\takatoh\Documents\w\py-sample-2\.venv
Using version ^8.0.1 for click
Updating dependencies
Resolving dependencies...
Writing lock file
Package operations: 11 installs, 0 updates, 0 removals
• Installing pyparsing (2.4.7)
ValueError
File \C:\Users\takatoh\AppData\Local\pypoetry\Cache\artifacts\92\0f\cf\effdcd5d76a6186df0969f85b3b030284ff8058936d5016540b5258ea3\pyparsing-2.4.7-py2.py3-none-any.whl does not exist
at ~\AppData\Local\Programs\Python\Python39\lib\site-packages\poetry\core\packages\file_dependency.py:40 in __init__
36│ except FileNotFoundError:
37│ raise ValueError("Directory {} does not exist".format(self._path))
38│
39│ if not self._full_path.exists():
→ 40│ raise ValueError("File {} does not exist".format(self._path))
41│
42│ if self._full_path.is_dir():
43│ raise ValueError("{} is a directory, expected a file".format(self._path))
44│
Failed to add packages, reverting the pyproject.toml file to its original content.
こんなふうにエラーになる。追加しようとした click じゃなくて仮想環境に必要な pyparsing っていうパッケージをインストールしようとしたところでエラーになってるのがわかる。poetry は一度インストールに使ったファイルはキャッシュしてて、このエラーはキャッシュしてるはずのファイル(\C:\Users\takatoh\AppData\Local\pypoetry\Cache\artifacts\92\0f\cf\effdcd5d76a6186df0969f85b3b030284ff8058936d5016540b5258ea3\pyparsing-2.4.7-py2.py3-none-any.whl)が見つからない、と言っている(ValueError の後に続く部分)。
ところが、ファイルはちゃんと存在する。
takatoh@montana: w > tree C:\Users\takatoh\AppData\Local\pypoetry\Cache\artifacts /F
フォルダー パスの一覧
ボリューム シリアル番号は 00000062 681C:8AA1 です
C:\USERS\TAKATOH\APPDATA\LOCAL\PYPOETRY\CACHE\ARTIFACTS
├─29
│ └─58
│ └─fc
│ └─ed8b7451d3ef91a6465024f5656141da996e7aafd4d41a1659629a75e7
│ pluggy-0.13.1-py2.py3-none-any.whl
│
├─3d
│ └─af
│ └─11
│ └─94d692f8e0bf0791d76d42d8d257be6c7d2cba22ca4f745856c83286e9
│ more_itertools-8.10.0-py3-none-any.whl
│
├─60
│ └─79
│ └─0b
│ └─c48bd9c2a989aa8b1eb7a67cd02b053c10734f2e4e5665f7995f09999c
│ py-1.10.0-py2.py3-none-any.whl
│
├─6f
│ └─a9
│ └─ee
│ └─569c37f69a8c365ee41d2340aeac0214ee8c0086b8d8db43a21545204b
│ attrs-21.2.0-py2.py3-none-any.whl
│
├─7d
│ └─f4
│ └─60
│ └─0737157bb9711fec72c70dff523aa54491eef317e0d586cf5388ff0908
│ wcwidth-0.2.5-py2.py3-none-any.whl
│
├─92
│ └─0f
│ └─cf
│ └─effdcd5d76a6186df0969f85b3b030284ff8058936d5016540b5258ea3
│ pyparsing-2.4.7-py2.py3-none-any.whl
│
├─9e
│ └─b3
│ └─11
│ └─7d87ac44fdb2d557301f1f4086a37c080d1482a98751abe7cdbabbad26
│ colorama-0.4.4-py2.py3-none-any.whl
│
├─ae
│ └─32
│ └─83
│ └─e159324c1bd58177322f4e45f598d500fe22544bff20f53f55cf749da8
│ click-8.0.1-py3-none-any.whl
│
├─b7
│ └─99
│ └─9c
│ └─c8ddc18c8225c740fc2ae6d503da3f93d5dddaf04afac3da460afacbc6
│ atomicwrites-1.4.0-py2.py3-none-any.whl
│
├─e4
│ └─88
│ └─dd
│ └─3dbff42e3c4462dc3d027f5024025571166cb35edee215ce93852a968c
│ pytest-5.4.3-py3-none-any.whl
│
└─f9
└─4f
└─09
└─c91a145b26102e014fd6e33bd8c7b87306c8e1d4a771158f34dd13210e
packaging-21.0-py3-none-any.whl
pyparsing はなかほどに出力されてるね。なのに見つからないってどういうことさ。
さて、poetry の挙動がおかしいのはこれだけじゃない。というかこれから本番というか。
存在するのに見つからないっていうキャッシュをフォルダごと削除してやると、今度はインストールがうまくいく。まず削除。
takatoh@montana: w > rm C:\Users\takatoh\AppData\Local\pypoetry\Cache\artifacts -Recurse -Force
これで削除できてる。
takatoh@montana: w > tree C:\Users\takatoh\AppData\Local\pypoetry\Cache\artifacts /F フォルダー パスの一覧 ボリューム シリアル番号は 00000066 681C:8AA1 です C:\USERS\TAKATOH\APPDATA\LOCAL\PYPOETRY\CACHE\ARTIFACTS 無効なパスです - \USERS\TAKATOH\APPDATA\LOCAL\PYPOETRY\CACHE\ARTIFACTS サブフォルダーは存在しません
で、あらためて poetry add click。
takatoh@montana: w > cd py-sample-2 takatoh@montana: py-sample-2 > poetry add click Using version ^8.0.1 for click Updating dependencies Resolving dependencies... Package operations: 11 installs, 0 updates, 0 removals • Installing pyparsing (2.4.7) • Installing atomicwrites (1.4.0) • Installing attrs (21.2.0) • Installing colorama (0.4.4) • Installing more-itertools (8.10.0) • Installing packaging (21.0) • Installing pluggy (0.13.1) • Installing py (1.10.0) • Installing wcwidth (0.2.5) • Installing click (8.0.1) • Installing pytest (5.4.3)
ほら、ちゃんとインストールできた。どういうことだよ!
同じ現象で、1週間ほど、悩んでいます。
キャッシュのフォルダーを削除して下記のコマンドでクリーンな環境を作っても同じエラーが再現します。
python -m venv .venv
.venv\Scripts\activate
pip install poetry
poetry new sample
windows版のpoetryのバグなのですかね、、
cd sample
poetry install
下記のIssueを見つけました。
https://github.com/python-poetry/poetry/issues/4163
poetryのバグのようで、まだ解決していません。
やっぱりpoetryのバグなんですね。
Issueを見るとキャッシュファイルの頭に \ がついてるのが原因のように見えます。
まぁ、とりあえずの回避方法はわかってるので、直るまではそれで対処します。
Poetryで開発環境を用意する個人的な便利ツールを作成していたところ同様のエラーが発生しました。
しかし問題の迂回方法も発見できましたのでご報告します。
[問題が起こった方法]
1. Git Bashでプロジェクトを作成したいディレクトリを開く
2. Git Bashで「poetry –src . –name [ProjectName]」を実行(正常に完了)
3. Git Bashで「poetry add -D [Packages]」を実行したところ「Failed to add packages, reverting the pyproject.toml file to its original content.」となり失敗
[上手くいった方法]
プロジェクトを作成したいディレクトリをVS Codeで開き、VS CodeのターミナルのGit Bashから同様の処理を行うとパッケージも正常に追加できました。
プロジェクトの作成まではVS Codeを通さなくても問題ないようです。