Visual Studio Code(VSCode)によるPoetryプロジェクトのデバッグ
モチベーション
方向性も定まらないのでWebフレームワークが何しているのか理解しようとFastAPIのソースでも読むかと思ったのだがpoetryの仮想環境がVSCodeで認識されなかった.
poetry shellで仮想環境を有効にする
基本は公式のDebuggingにあるようにuvicornをモジュールとして追加してトップレベルのコードとして実行する.
問題はpoetryが作る仮想環境をどうやってVSCodeに認識させるかである. VSCodeはpyenvからインストールしたインタプリタについては勝手に認識してくれる. 適当なPythonファイルを開くとステータス・バーの左端に現在のインタプリタが表示される. ここをクリックするとインタプリタの選択肢が表示される. pyenvと最後についているのがpyenvから導入したインタプリタになる.
ところがPoetryのプロジェクトだと自動的に仮想環境が作られるがこの環境は勝手には認識されない. poetry addでインストールされたパッケージは全てこの仮想環境下で管理されるのでこの環境が認識されないとデバッガーがModuleNotFoundErrorを表示して停止する.
仮想環境を認識させるためにはVSCodeを開く前にpoetry shellで仮想環境を有効にしておく必要がある. 一度VSCodeを閉じてPoetryプロジェクトに移動してpoetry shellを実行する. その状態で
poetry new hoge
cd hoge
poetry shell
vscode .
macOSなら~/Library/Caches/poetry/virtualenvs以下に作られた仮想環境が選択できるようになる.
プロジェクト直下で仮想環境を管理する
Poetryはデフォルトでは仮想環境を~/Library/Caches/poetry/virtualenvs以下で管理しているようである. プロジェクト名から自動的にproject-py3.xのような仮想環境が構築される. この命名法から推測すると特定の環境を作ってプロジェクト間で共有するというわけでもなさそうである.
なので単純にプロジェクトごとにファイルを作ってしまっても同じだと思う. poetry config --listを実行するとsettings.virtualenvs.in-projectがfalseになっている. 設定の変更は非常に簡単にできる.
poetry config settings.virtualenvs.in-project true
これでpoetry addするとプロジェクトの直下に.venvというフォルダが生成され, こちらはVSCodeが自動で認識してくれる.
またプロジェクトを消せば仮想環境に関する設定ファイルも削除してくれるので, 仮想環境だけが残るということがない.
こちらの方が良さそうですね
launch.jsonの設定
以上でデバッグしながらステップ・インでFastAPIのソースが眺められると思ったわけですが, デフォルトではサードパーティのコードは見れないらしいです. この場合justMyCodeという項目を追加すれば良い.1
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"justMyCode": false
}
]
}
まとめ
Poetryで作ったプロジェクトをVSCodeのデバッガーでデバッグするならsettings.virtualenvs.in-projectは有効化した方が良さそうです.