delhi09の勉強日記

技術トピック専用のブログです。自分用のメモ書きの投稿が多いです。あくまで「勉強日記」なので記事の内容は鵜呑みにしないでください。

VS Code × Pythonでライブラリの定義にジャンプできない時の暫定対応方法

概要

VS Code × PythonでClassや関数の定義にコードジャンプしようとした時に、特定の外部ライブラリのソースの場合に「定義は見つかりません」というメッセージが出てしまい、コードジャンプができないという事象に遭遇した。

きれいな解決方法はまだ見つけられていないが、とりあえずコードジャンプできるようにする方法は分かったので、その方法について書く。

きっかけ

FastAPIで開発している時に、デバッグしたいことがあって、FastAPI本体のソースコードにbreakpointを貼りながらデバッグ実行していた。

その際に、FastAPIのソースコードは定義をコードジャンプで辿って行けたのだが、pydanticのソースコード内の定義にコードジャンプしようとしたところ、「定義は見つかりません」というメッセージが出てしまい、コードジャンプができなかった。
※ FastAPIは内部でさらにpydanticというライブラリに依存している。

結論

デバッグしたいライブラリのディレクトリ配下の*.soという拡張子のファイルを全て削除する。

対応方法

以下の手順で〜/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

→ 以下、結果
f:id:kamatimaru:20201114011356p:plain

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のファイルを参照するようになるはずなので、コードジャンプできるようになるのでは?と思いやってみたらうまくいった。

TODO

VS CodeでCやC++も開発できる以上、恐らくバイナリファイルでもコードジャンプできるようにする設定があるのではないかと思うので、今度調べてみたい。