概要
VS Code × PythonでClassや関数の定義にコードジャンプしようとした時に、特定の外部ライブラリのソースの場合に「定義は見つかりません」というメッセージが出てしまい、コードジャンプができないという事象に遭遇した。
きれいな解決方法はまだ見つけられていないが、とりあえずコードジャンプできるようにする方法は分かったので、その方法について書く。
きっかけ
FastAPIで開発している時に、デバッグしたいことがあって、FastAPI本体のソースコードにbreakpointを貼りながらデバッグ実行していた。
その際に、FastAPIのソースコードは定義をコードジャンプで辿って行けたのだが、pydanticのソースコード内の定義にコードジャンプしようとしたところ、「定義は見つかりません」というメッセージが出てしまい、コードジャンプができなかった。
※ FastAPIは内部でさらにpydanticというライブラリに依存している。
対応方法
以下の手順で〜/site-packages/pydantic
配下の*.so
という拡張子のファイルを全て削除する。
※ pydanticを例として説明しますが、対象のライブラリに読み替えてください。
1.pydanticのライブラリのパスを確認する。
$ pip show pydantic
→ デフォルトでは〜/site-packages/pydantic
というディレクトリにあるはず。
2.1で確認したディレクトリに移動する。
$ cd /path/to/site-packages/pydantic
3.ディレクトリ配下のファイルを確認し、拡張子が.pyのファイルと.soのファイルがペアで存在することを確認する。
$ ls
→ 以下、結果
4.以下のコマンドで拡張子が.soのファイルのみを削除する。
$ find . -name "*.so" -type f | xargs rm
経緯
FastAPIとpydanticで何が違うんだろうというのが気になり、site-packages/fastapiとsite-packages/pydanticをそれぞれ見てみたところ、site-packages/pydanticの方にだけ、.soという拡張子のバイナリファイルが存在することに気づいた。
そこから
- FastAPIはバイナリファイルの方のpydanticのソースを参照している。
- 自分のVS Code環境がバイナリファイルにコードジャンプできる設定になっていない。
のが原因だろうと予想した。
それであれば、*.soのファイルを削除したら*.pyのファイルを参照するようになるはずなので、コードジャンプできるようになるのでは?と思いやってみたらうまくいった。