🔦

Pylanceがクラッシュを繰り返すので調べる

2024/05/16に公開

概要

pylanceがクラッシュする現象の原因と対策方法をまとめる。
下記はpylanceクラッシュ時に出力されるvscodeの問題タブのpython言語サーバーの出力の抜粋。

2024-mm-dd hh:MM:ss [info] [Error - h:MM:ss PM] (62072) Enumeration of workspace source files is taking longer than 10 seconds.
This may be because:
* You have opened your home directory or entire hard drive as a workspace
* Your workspace contains a very large number of directories and files
* Your workspace contains a symlink to a directory with many files
* Your workspace is remote, and file enumeration is slow
To reduce this time, open a workspace directory with fewer files or add a pyrightconfig.json configuration file with an "exclude" section to exclude subdirectories from your workspace. For more details, refer to https://github.com/microsoft/pyright/blob/main/docs/configuration.md.

ChatGPT先生曰く

なんとなく言ってることは分かる気がしつつも自信がないのでChatGPT先生に解説を頼む

このメッセージは、MicrosoftのPyrightというPythonの静的型チェッカーおよびコード解析ツールからのものです。このメッセージは、Pyrightがワークスペース内のソースファイルを列挙するのに長すぎる時間がかかっていることを示しています。

Pyright…?目が滑って気付かなかったが確かにメッセージに含まれている。

メッセージの本文では、ワークスペースのソースファイルの列挙に10秒以上かかっていることが示されています。
これは問題が発生していることを示しています。

つまりvscodeが開いているフォルダ(ワークスペース?)が大きすぎると。
Pylanceクラッシュ現象が発生するようになったタイミングがホームディレクトリにgit cloneしたリポジトリの深い階層へのシンボリックリンクを作成したあたりのタイミングだったのでシンボリックリンクを削るのも1手なのだろうけどアクセスが面倒なのでこのリンクは活かしたままにしたい。

列挙にかかる時間を短縮するために、ファイルが少ないワークスペースディレクトリを開くか、
pyrightconfig.json構成ファイルを追加してワークスペースからサブディレクトリを除外することが推奨されます。詳細については、Pyrightのドキュメントを参照してください。

pyrightconfig.jsonに解析不要ディレクトリを登録すれば何とかなりそう?
とりあえず、Pyrightのドキュメント[1]を読むのが面倒なので諦めることにする。

Pyright

https://github.com/microsoft/pyright

とはなにか?

Pyright は、フル機能を備えた、標準に準拠した[2]Python 用の静的型チェッカーです。高パフォーマンスを実現するように設計されており、大規模な Python ソース ベースで使用できます。

Pyright には、コマンド ライン ツール[3]、言語サーバー、およびVisual Studio Code の拡張機能[4]が含まれています。

vscodeでPylanceを使っていればPyrightが使える状態になっている

https://github.com/microsoft/pyright/blob/main/docs/installation.md#L1-L7

インストール
言語サーバー
VSコード
ほとんどの VS Code ユーザーには、Pyright ではなく Pylance 拡張機能を使用することをお勧めします。Pylance には Pyright 型チェッカーが組み込まれていますが、セマンティック トークンの強調表示やシンボルのインデックス作成などの追加機能も備えています。Pylance VS Code 拡張機能の最新公開バージョンを VS Code から直接インストールできます。拡張機能パネルを開いて「Pylance」を検索するだけです。

とあるのでvscodeで利用する分にはpylanceが使えればpyrightも使えるようになっている?
エラーメッセージにもpyrightという名前が出てきているし特に追加で何かする必要はないはず。

設定ファイル(どこ?どういう名前?)

Google先生にconfiguration.md[1:1]を翻訳してもらうと

デフォルトでは、ファイルは「pyrightconfig.json」という名前で、プロジェクトのルート ディレクトリ内にあります。マルチルート ワークスペース (「フォルダーをワークスペースに追加…」) がサポートされており、各ワークスペース ルートは独自の「pyrightconfig.json」ファイルを持つことができます。

とのことなので、vscodeのワークスペースルートにpyrightconfig.jsonを作る。設定したい階層のディレクトリに作っても良いらしい。

解析除外ディレクトリの設定ファイルへの登録と運用指針

{
  "exclude": [
    "dev_proj1",
    "dev_proj2",
    "ref_proj1",
    "ref_proj2",
    "ref_proj3",
    "ref_proj4",
  ]
}

のようなファイルをvscodeで開いているフォルダー(ワークスペースのルートディレクトリ)の直下に pyrightconfig.json という名前で保存。したものの未だPylanceがクラッシュしました通知は止まず。出力タブのPython 言語サーバーの出力を見てみると

[Error - h:mm:ss PM] (9235) Enumeration of workspace source files is taking longer than 10 seconds.

まだ10秒以上かかってしまっているようだ。

そもそもだ。この設定は本当に反映されているのだろうか?

確認のためにすべての開いているフォルダ直下にあるフォルダ名をexcludeに登録してファイルを保存後、クラッシュしました通知を閉じる。

すると、クラッシュしました通知が発生しなくなった。出力タブを確認しても10秒かかってるエラーは見当たらない。
これにより、pyrightconfig.jsonは確かにvscodeで認識されていることの確認はとれた。

しかしすべてのフォルダをexcludeしてしまったのでpylanceは現状動作していないことになる。通知が止まらないという問題は解決できたものの新しい問題を作り込んでしまっている状態だ。
なのでとりあえず現状使いたい部分だけをexcludeから除外することにした。
整理しろということだろう。無くても困らないフォルダを放置している方がわるいのだごめんなさい。

脚注
  1. https://github.com/microsoft/pyright/blob/main/docs/configuration.md ↩︎ ↩︎

  2. https://htmlpreview.github.io/?https://github.com/python/typing/blob/main/conformance/results/results.html ↩︎

  3. https://github.com/microsoft/pyright/blob/main/docs/command-line.md ↩︎

  4. https://marketplace.visualstudio.com/items?itemName=ms-pyright.pyright ↩︎

Discussion