当サイトは、アフィリエイト広告を利用しています
pythonではデバッグを行う場合
を使って実行するのが第一選択肢にになる
そしてpythonの「debugpy」を使ったデバッグ構成パターンは
Python実行場所├─ ローカル│ └─ デバッグ操作位置:同一環境│ ├─ デバッグ方式:launch│ └─ デバッグ方式:attach│ ├─ debugpy起動形態:埋め込み(import debugpy)│ └─ debugpy起動形態:外部起動(python -m debugpy)│└─ コンテナ├─ デバッグ操作位置:同一環境(コンテナに入る)│ ├─ デバッグ方式:launch│ └─ デバッグ方式:attach│ ├─ debugpy起動形態:埋め込み│ └─ debugpy起動形態:外部起動│└─ デバッグ操作位置:別環境(ホストから接続)└─ デバッグ方式:attach├─ debugpy起動形態:埋め込み└─ debugpy起動形態:外部起動
がある。
詳しくは下記記事参照
当記事ではこの構成パターンのうちの
について実装サンプルを使って解説する
ローカルデバッグとは
のこと。
逆にPythonの実行環境がコンテナの場合はコンテナデバッグと呼ぶこともある
ローカルデバッグは
といった特徴がある。
ローカルにPythonがインストール済みである場合や
簡単なスクリプトを動かす場合に使うことが多い。
逆に実際の開発では、Pythonはローカルではなく
コンテナ上で実行することが主流となってきてるため
実際の開発では使うことは少ない。
ローカル環境では以下の3パターンが存在する
それぞれのパターン別の実装して動作を確認する
launchはVSCodeがPythonプロセスを起動してデバッグする方式。
debugpyはVScodeで使う。
仕組みは
VS Code↓(起動)Python(debugpy付きで実行)↓デバッグ開始
のようになるイメージ
VScodeがPythonをdebugpy付きで実行させることでデバッグを開始する。
実際にPythonスクリプトをlaunchデバッグしてみる
作成するファイルは
で構成は
|-- .vscode| `-- launch.json`-- main.py
になる。
また「debugpy」をインストールしておく必要もある
下記でインストールできる
pip install debugpy
VScodeの実行とデバッグから作成できる
{"version": "0.2.0","configurations": [{"name": "Python デバッガー: 現在のファイル","type": "debugpy","request": "launch","program": "${file}","console": "integratedTerminal"}]}
def main():print("hello1")print("hello2")print("hello3")print("hello4")print("hello5")if __name__ == "__main__":main()
attachは既に動いているPythonプロセスに後からデバッガを接続する方式。
attachではdebugpyの起動形態が
の2種類あるので、パターン別に実装して動作を確認する
「debugpy起動形態:埋め込み」はdebugpyをPythonプロセスに埋め込む方式。
debugpyを埋め込んだPython(実行中)↓VS Codeが接続
のようになるイメージ
debugpy埋め込み済みのPythonをで実行し、
VScodeからアタッチしてデバッグを開始する。
実際にdebugpy埋め込み済みPythonスクリプトをattachデバッグしてみる
作成するファイルは
で構成は
|-- .vscode| `-- launch.json`-- main.py
になる。
また「debugpy」をインストールしておく必要もある
下記でインストールできる
pip install debugpy
import debugpy# デバッグクライアント(VS Codeなど)からの接続を受け付けるためのサーバを起動するdebugpy.listen(5678)# デバッグクライアントが接続されるまで、ここでプログラムの実行を完全に停止するdebugpy.wait_for_client()def main():print("hello1")print("hello2")print("hello3")print("hello4")print("hello5")if __name__ == "__main__":main()
VScodeの実行とデバッグから作成できる
{"version": "0.2.0","configurations": [{"name": "Python デバッガー: attach","type": "debugpy","request": "attach","connect": {"host": "localhost","port": 5678}}]}
まずはpythonスクリプトを実行する
python main.py
実行後はVScodeからの接続があるまで、プログラムが待っているので動かない
その後にVScodeのattachのデバッガを実行すると
デバッグが開始される
「debugpy起動形態:外部起動」はdebugpyを実行時に指定して起動する方式
具体的には起動するコマンドで指定する
python -m debugpy↓対象スクリプト実行↓VS Codeが接続
のようになるイメージ
Pythonを実行するコマンドでdebugpyを指定する
その後、VScodeからアタッチしてデバッグを開始する。
実際にPythonスクリプトをdebugpy付きで外部起動してattachデバッグしてみる
作成するファイルは
で構成は
|-- .vscode| `-- launch.json`-- main.py
になる。
また「debugpy」をインストールしておく必要もある
下記でインストールできる
pip install debugpy
def main():print("hello1")print("hello2")print("hello3")print("hello4")print("hello5")if __name__ == "__main__":main()
VScodeの実行とデバッグから作成できる
{"version": "0.2.0","configurations": [{"name": "Python デバッガー: attach","type": "debugpy","request": "attach","connect": {"host": "localhost","port": 5678}}]}
まずはpythonスクリプトをdebugpy付きで実行する
python -m debugpy --listen 5678 --wait-for-client main.py
その後にVScodeのattachのデバッガを実行すると
デバッグが開始される
launchとattachの違いは「誰がプロセスを起動するか」にある。
launch
attach
実際に実務ではどう使い分けるべきかをまとめておく。
のようにローカルで簡単なpythonツールの動作確認や開発をする場合
に使うことが多い。
のように実際のシステム開発ではAPIサーバーを起動して
VScodeでアタッチしてデバッグする場合に使うことが多い。
attachはさらに2パターンに分かれる
ローカル開発
コンテナ・本番に近い環境
attach内の選択
まとめると
という違いになる。
実務では
となることが多く、特にコンテナ環境ではattachが前提となるため
attachの理解が重要になる。
attachは「起動とデバッグを分離できる」ことが本質であり、
複雑な実行環境ではこの分離が必須になる。