VS CodeでのPythonデバッグ
Python 拡張機能は、いくつかの種類の Python アプリケーション (スクリプト、Web アプリ、リモート プロセスなど) に対して、Python デバッガー拡張機能を介したデバッグをサポートしています。基本的なデバッグの短いウォークスルーについては、チュートリアル - デバッガーの構成と実行を参照してください。Flask チュートリアルも参照してください。どちらのチュートリアルでも、ブレークポイントの設定やコードのステップ実行などのコアスキルが実演されています。
変数の検査、ブレークポイントの設定、その他言語に依存しない一般的なデバッグ機能については、VS Code のデバッグを参照してください。
この記事では、主に Python 固有のデバッグ構成、特定のアプリケーションタイプおよびリモートデバッグに必要な手順について説明します。
Python デバッガー拡張機能
Python デバッガー拡張機能は、VS Code 用のPython 拡張機能と一緒に自動的にインストールされます。これにより、スクリプト、Web アプリケーション、リモートプロセスなど、いくつかの種類の Python アプリケーションに対してdebugpy を使用したデバッグ機能が提供されます。
インストールされていることを確認するには、拡張機能ビュー (⇧⌘X (Windows、Linux Ctrl+Shift+X)) を開き、@installed python debugger
を検索します。結果に Python デバッガー拡張機能が表示されるはずです。
サポートされている Python バージョンについては、拡張機能のREADME ページを参照してください。
構成の初期化
構成は、デバッグセッション中の VS Code の動作を決定します。構成は、ワークスペースの.vscode
フォルダーに格納されているlaunch.json
ファイルで定義されます。
注: デバッグ構成を変更するには、コードがフォルダーに保存されている必要があります。
デバッグ構成を初期化するには、まずサイドバーで実行ビューを選択します
まだ構成が定義されていない場合は、実行とデバッグボタンと構成 (launch.json) ファイルを作成するためのリンクが表示されます
Python 構成でlaunch.json
ファイルを生成するには、次の手順を実行します
-
launch.json ファイルを作成するリンク (上の画像に示されている) を選択するか、実行 > 構成を開くメニューコマンドを使用します。
-
デバッガーオプションのリストからPython Debuggerを選択します。
-
コマンドパレットから構成メニューが開き、Python プロジェクトファイルで使用するデバッグ構成の種類を選択できます。単一の Python スクリプトをデバッグする場合は、表示されるデバッグ構成を選択メニューでPython ファイルを選択します。
注: 構成が存在しない状態で、デバッグパネル、F5、または実行 > デバッグの開始を介してデバッグセッションを開始すると、デバッグ構成メニューも表示されますが、
launch.json
ファイルは作成されません。 -
Python デバッガー拡張機能は、以前に選択した内容 (この場合はPython ファイル) に基づいた事前定義された構成を含む
launch.json
ファイルを作成して開きます。構成を変更 (たとえば引数を追加) したり、カスタム構成を追加したりできます。
構成プロパティの詳細については、この記事の後半の標準構成とオプションで説明します。その他の構成も、この記事の特定のアプリケーションタイプのデバッグで説明しています。
その他の構成
既定では、VS Code は Python デバッガー拡張機能によって提供される最も一般的な構成のみを表示します。リストとlaunch.json
エディターに表示されている構成の追加コマンドを使用して、launch.json
に含める他の構成を選択できます。このコマンドを使用すると、VS Code は利用可能なすべての構成のリストを表示します (Python オプションを必ず選択してください)
プロセス ID を使用してアタッチを選択すると、次の結果が得られます:
これらの構成すべての詳細については、特定のアプリケーションタイプのデバッグを参照してください。
デバッグ中、ステータスバーには現在の構成と現在のデバッグインタープリターが表示されます。構成を選択すると、別の構成を選択できるリストが表示されます
既定では、デバッガーは VS Code 用 Python 拡張機能の他の機能と同様に、ワークスペース用に選択された同じインタープリターを使用します。特にデバッグに別のインタープリターを使用するには、該当するデバッガー構成のlaunch.json
でpython
の値を設定します。または、ステータスバーの Python インタープリターインジケーターを使用して別のインタープリターを選択します。
基本的なデバッグ
Python スクリプトのデバッグのみに興味がある場合は、エディターの実行ボタンの横にある下向き矢印を選択し、Python デバッガー: Python ファイルをデバッグを選択するのが最も簡単な方法です。
Flask、Django、または FastAPI を使用して Web アプリケーションをデバッグする場合は、Python デバッガー拡張機能は、実行とデバッグビューのすべての自動デバッグ構成を表示オプションの下に、プロジェクト構造に基づいて動的に作成されたデバッグ構成を提供します。
ただし、他の種類のアプリケーションをデバッグする場合は、実行とデバッグボタンをクリックして、実行ビューからデバッガーを開始できます。
構成が設定されていない場合、デバッグオプションのリストが表示されます。ここで、適切なオプションを選択してコードをすばやくデバッグできます。
一般的なオプションとしては、Python ファイル構成を使用して現在開いている Python ファイルを実行するか、プロセス ID を使用してアタッチ構成を使用して、既に実行中のプロセスにデバッガーをアタッチするかの 2 つがあります。
デバッグ構成の作成と使用に関する情報については、構成の初期化とその他の構成のセクションを参照してください。構成が追加されると、ドロップダウンリストから選択し、デバッグの開始ボタン (F5) を使用して開始できます。
コマンドラインからのデバッグ
debugpy
が Python 環境にインストールされている場合、デバッガーはコマンドラインから実行することもできます。
debugpy のインストール
Python 環境にdebugpy をインストールするには、python -m pip install --upgrade debugpy
を使用します。
ヒント: 仮想環境の使用は必須ではありませんが、推奨されるベストプラクティスです。VS Code で仮想環境を作成するには、コマンドパレット (⇧⌘P (Windows、Linux Ctrl+Shift+P)) を開き、Python: 仮想環境の作成コマンド () を実行します。
コマンドライン構文
デバッガーのコマンドライン構文は次のとおりです
python -m debugpy
--listen | --connect
[<host>:]<port>
[--wait-for-client]
[--configure-<name> <value>]...
[--log-to <path>] [--log-to-stderr]
<filename> | -m <module> | -c <code> | --pid <pid>
[<arg>]...
例
コマンドラインから、指定されたポート (5678) とスクリプトを使用して、次の構文でデバッガーを開始できます。この例では、スクリプトが長時間実行され、--wait-for-client
フラグが省略されているため、スクリプトはクライアントがアタッチされるのを待ちません。
python -m debugpy --listen 5678 ./myscript.py
その後、VS Code Python デバッガー拡張機能からアタッチするには、次の構成を使用します。
{
"name": "Python Debugger: Attach",
"type": "debugpy",
"request": "attach",
"connect": {
"host": "localhost",
"port": 5678
}
}
注: listen のホスト指定は任意であり、既定では 127.0.0.1 が使用されます。
リモートコードまたは Docker コンテナで実行されているコードをデバッグしたい場合は、リモートマシンまたはコンテナで、前の CLI コマンドを修正してホストを指定する必要があります。
python -m debugpy --listen 0.0.0.0:5678 ./myscript.py
関連する構成ファイルは次のようになります。
{
"name": "Attach",
"type": "debugpy",
"request": "attach",
"connect": {
"host": "remote-machine-name", // replace this with remote machine name
"port": 5678
}
}
注:
127.0.0.1
またはlocalhost
以外のホスト値を指定すると、任意のコンピューターからのアクセスを許可するようにポートが開かれ、セキュリティリスクが発生する可能性があることに注意してください。リモートデバッグを行う際は、SSH トンネルを使用するなど、適切なセキュリティ対策を講じていることを確認する必要があります。
コマンドラインオプション
フラグ | オプション | 説明 |
---|---|---|
--listen または --connect | [<ホスト>:]<ポート> |
必須。デバッグアダプターサーバーが着信接続を待機する (--listen) か、着信接続を待機しているクライアントに接続する (--connect) ホストアドレスとポートを指定します。これは、VS Code のデバッグ構成で使用されるアドレスと同じです。既定では、ホストアドレスは localhost (127.0.0.1) です。 |
--wait-for-client | なし | オプション。デバッグサーバーからの接続があるまでコードを実行しないことを指定します。この設定により、コードの最初の行からデバッグできます。 |
--log-to | <パス> |
オプション。ログを保存するための既存のディレクトリへのパスを指定します。 |
--log-to-stderr | なし | オプション。debugpy がログを stderr に直接書き込むことを有効にします。 |
--pid | <PID> |
オプション。デバッグサーバーを挿入するために、既に実行中のプロセスを指定します。 |
--configure-<名前> | <値> |
オプション。クライアントが接続する前にデバッグサーバーに認識させる必要があるデバッグプロパティを設定します。このようなプロパティは起動構成で直接使用できますが、アタッチ構成ではこの方法で設定する必要があります。たとえば、デバッグサーバーがアタッチ先のプロセスによって作成されたサブプロセスに自動的に注入されないようにする場合は、--configure-subProcess false を使用します。 |
注:
[<引数>]
を使用して、起動するアプリにコマンドライン引数を渡すことができます。
ネットワーク接続を介したアタッチによるデバッグ
ローカルスクリプトのデバッグ
別のプロセスによってローカルで呼び出される Python スクリプトをデバッグする必要がある場合があります。たとえば、特定の処理ジョブのために異なる Python スクリプトを実行する Web サーバーをデバッグしているとします。このような場合、スクリプトが起動されたら VS Code デバッガーをスクリプトにアタッチする必要があります
-
VS Code を実行し、スクリプトを含むフォルダーまたはワークスペースを開き、まだ存在しない場合はそのワークスペース用に
launch.json
を作成します。 -
スクリプトコードに以下を追加してファイルを保存します
import debugpy # 5678 is the default attach port in the VS Code debug configurations. Unless a host and port are specified, host defaults to 127.0.0.1 debugpy.listen(5678) print("Waiting for debugger attach") debugpy.wait_for_client() debugpy.breakpoint() print('break on this line')
-
ターミナル: 新しいターミナルを作成を使用してターミナルを開きます。これにより、スクリプトで選択された環境がアクティブになります。
-
ターミナルで、debugpy パッケージをインストールします。
-
ターミナルで、スクリプトを指定して Python を開始します (例:
python3 myscript.py
)。コードに含まれている「デバッガーのアタッチを待機しています」というメッセージが表示され、スクリプトはdebugpy.wait_for_client()
の呼び出しで停止します。 -
実行とデバッグビュー (⇧⌘D (Windows、Linux Ctrl+Shift+D)) に切り替え、デバッガーのドロップダウンリストから適切な構成を選択し、デバッガーを開始します。
-
デバッガーは
debugpy.breakpoint()
の呼び出しで停止するはずです。そこから、通常どおりデバッガーを使用できます。また、debugpy.breakpoint()
を使用する代わりに、UI を使用してスクリプトコードに他のブレークポイントを設定することもできます。
SSH を使用したリモートスクリプトのデバッグ
リモートデバッグでは、VS Code 内でローカルでプログラムをステップ実行しながら、リモートコンピューターで実行できます。リモートコンピューターに VS Code をインストールする必要はありません。セキュリティを強化するために、デバッグ時には SSH などのセキュアな接続をリモートコンピューターに利用することをお勧めします。
注: Windows コンピューターでは、
ssh
コマンドを使用するためにWindows 10 OpenSSH をインストールする必要がある場合があります。
次の手順は、SSH トンネルをセットアップする一般的なプロセスを説明しています。SSH トンネルを使用すると、パブリックアクセス用にポートが開かれている場合よりも安全な方法で、リモートで直接作業しているかのようにローカルマシンで作業できます。
リモートコンピューター上
-
ポート転送を有効にするには、
sshd_config
設定ファイル (Linux では/etc/ssh/
、Windows では%programfiles(x86)%/openssh/etc
にあります) を開き、次の設定を追加または変更しますAllowTcpForwarding yes
注: AllowTcpForwarding の既定値は yes ですので、変更する必要はないかもしれません。
-
AllowTcpForwarding
を追加または変更する必要があった場合は、SSH サーバーを再起動します。Linux/macOS ではsudo service ssh restart
を実行します。Windows ではservices.msc
を実行し、サービスリストから OpenSSH またはsshd
を選択し、再起動を選択します。
ローカルコンピューター上
-
SSH トンネルを作成するには、
ssh -2 -L sourceport:localhost:destinationport -i identityfile user@remoteaddress
を実行します。destinationport
には選択したポートを、user@remoteaddress
には適切なユーザー名とリモートコンピューターの IP アドレスを使用します。たとえば、IP アドレス 1.2.3.4 のポート 5678 を使用するには、コマンドはssh -2 -L 5678:localhost:5678 -i identityfile user@1.2.3.4
となります。-i
フラグを使用して、ID ファイルへのパスを指定できます。 -
SSH セッションでプロンプトが表示されることを確認します。
-
VS Code ワークスペースで、リモートデバッグ用の構成を
launch.json
ファイルに作成し、ポートをssh
コマンドで使用したポートと一致させ、ホストをlocalhost
に設定します。ここでは SSH トンネルをセットアップしたため、localhost
を使用します。{ "name": "Python Debugger: Attach", "type": "debugpy", "request": "attach", "port": 5678, "host": "localhost", "pathMappings": [ { "localRoot": "${workspaceFolder}", // Maps C:\Users\user1\project1 "remoteRoot": "." // To current working directory ~/project1 } ] }
デバッグの開始
リモートコンピューターへの SSH トンネルが設定されたので、デバッグを開始できます。
-
両方のコンピューター: 同一のソースコードが利用可能であることを確認します。
-
両方のコンピューター: debugpy をインストールします。
-
リモートコンピューター: リモートプロセスにアタッチする方法は 2 つあります。
-
ソースコードに次の行を追加し、
address
をリモートコンピューターの IP アドレスとポート番号に置き換えます (IP アドレス 1.2.3.4 は説明のためのみに示されています)。import debugpy # Allow other computers to attach to debugpy at this IP address and port. debugpy.listen(('1.2.3.4', 5678)) # Pause the program until a remote debugger is attached debugpy.wait_for_client()
listen
で使用する IP アドレスは、リモートコンピューターのプライベート IP アドレスである必要があります。その後、プログラムを通常どおり起動し、デバッガーがアタッチするまで一時停止させることができます。 -
debugpy を介してリモートプロセスを起動します (例)
python3 -m debugpy --listen 1.2.3.4:5678 --wait-for-client -m myproject
これにより、
python3
を使用してパッケージmyproject
が開始され、リモートコンピューターのプライベート IP アドレス1.2.3.4
でポート5678
をリッスンします (-m
を使用する代わりに、./hello.py
のようにファイルパスを指定してリモート Python プロセスを開始することもできます)。
-
-
ローカルコンピューター: 上記で概説したようにリモートコンピューターのソースコードを変更した場合のみ、ソースコードに、リモートコンピューターに追加したのと同じコードのコメントアウトされたコピーを追加します。これらの行を追加すると、両方のコンピューターのソースコードが一行ずつ一致することが保証されます。
#import debugpy # Allow other computers to attach to debugpy at this IP address and port. #debugpy.listen(('1.2.3.4', 5678)) # Pause the program until a remote debugger is attached #debugpy.wait_for_client()
-
ローカルコンピューター: VS Code で実行とデバッグビュー (⇧⌘D (Windows、Linux Ctrl+Shift+D)) に切り替え、Python デバッガー: アタッチ構成を選択します
-
ローカルコンピューター: デバッグを開始したいコードにブレークポイントを設定します。
-
ローカルコンピューター: 変更されたPython デバッガー: アタッチ構成とデバッグの開始ボタンを使用して VS Code デバッガーを開始します。VS Code はローカルで設定したブレークポイントで停止し、コードのステップ実行、変数の検査、その他すべてのデバッグアクションを実行できるようになります。デバッグコンソールに入力した式もリモートコンピューターで実行されます。
print
ステートメントからのものなど、標準出力へのテキスト出力は両方のコンピューターに表示されます。ただし、matplotlib のようなパッケージからのグラフィカルなプロットなどの他の出力は、リモートコンピューターにのみ表示されます。 -
リモートデバッグ中、デバッグツールバーは以下のように表示されます
このツールバーでは、切断ボタン (⇧F5 (Windows、Linux Shift+F5)) はデバッガーを停止し、リモートプログラムが最後まで実行されることを許可します。再起動ボタン (⇧⌘F5 (Windows、Linux Ctrl+Shift+F5)) はローカルコンピューターでデバッガーを再起動しますが、リモートプログラムを再起動するわけではありません。再起動ボタンは、リモートプログラムを既に再起動し、デバッガーを再アタッチする必要がある場合にのみ使用してください。
構成オプションの設定
launch.json
を最初に作成すると、エディターでアクティブなファイルを統合ターミナル (VS Code 内) または外部ターミナル (VS Code 外) のいずれかで実行する 2 つの標準構成があります
{
"configurations": [
{
"name": "Python Debugger: Current File (Integrated Terminal)",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal"
},
{
"name": "Python Debugger: Current File (External Terminal)",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"console": "externalTerminal"
}
]
}
具体的な設定については、以下のセクションで説明します。標準構成に含まれていないargs
などの他の設定を追加することもできます。
ヒント: プロジェクトで特定の起動ファイルを実行する構成を作成すると役立つことがよくあります。たとえば、デバッガーを開始するたびに引数
--port 1593
を付けてstartup.py
を常に起動したい場合は、次のように構成エントリを作成します
{
"name": "Python Debugger: startup.py",
"type": "debugpy",
"request": "launch",
"program": "${workspaceFolder}/startup.py",
"args" : ["--port", "1593"]
},
name
VS Code のドロップダウンリストに表示されるデバッグ構成の名前を指定します。
type
使用するデバッガーの種類を識別します。Python コードをデバッグする場合は、これをdebugpy
に設定したままにします。
request
デバッグを開始するモードを指定します
launch
:program
で指定されたファイルでデバッガーを開始しますattach
: 既に実行中のプロセスにデバッガーをアタッチします。例については、リモートデバッグを参照してください。
program
Python プログラムのエントリモジュール (起動ファイル) への完全修飾パスを指定します。既定の構成でよく使用される値${file}
は、エディターで現在アクティブなファイルを使用します。特定の起動ファイルを指定することで、どのファイルが開いているかに関係なく、常に同じエントリポイントでプログラムを起動できます。例:
"program": "/Users/Me/Projects/MyProject/src/event_handlers/__init__.py",
ワークスペースのルートからの相対パスを使用することもできます。たとえば、ルートが/Users/Me/Projects/MyProject
の場合は、次の例を使用できます
"program": "${workspaceFolder}/src/event_handlers/__init__.py",
module
コマンドラインで実行する際の-m
引数と同様に、デバッグするモジュールの名前を指定する機能を提供します。詳細については、Python.org を参照してください
python
デバッグに使用する Python インタープリターへの完全なパス。
指定しない場合、この設定はワークスペース用に選択されたインタープリターに既定で設定されます。これは値${command:python.interpreterPath}
を使用することと同じです。異なるインタープリターを使用するには、デバッグ構成のpython
プロパティでそのパスを指定します。
あるいは、各プラットフォームで定義されているカスタム環境変数を使用して、使用する Python インタープリターへの完全パスを含めることもできます。これにより、他のフォルダーパスは不要になります。
Python インタープリターに引数を渡す必要がある場合は、pythonArgs
プロパティを使用できます。
pythonArgs
"pythonArgs": ["<引数 1>", "<引数 2>",...]
の構文を使用して、Python インタープリターに渡す引数を指定します。
args
Python プログラムに渡す引数を指定します。スペースで区切られた引数文字列の各要素は、引用符で囲む必要があります。例:
"args": ["--quiet", "--norepeat", "--port", "1593"],
デバッグ実行ごとに異なる引数を提供したい場合は、args
を"${command:pickArgs}"
に設定できます。これにより、デバッグセッションを開始するたびに引数の入力を求められます。
注:
"${command:pickArgs}"
と["${command:pickArgs}"]
の解析方法には、[]
の使用法に関して特に注意すべき違いがあります。配列として、すべての引数は単一の文字列として渡され、ブラケットがない場合、各引数はそれ自身の文字列として渡されます。
stopOnEntry
true
に設定すると、デバッグ対象プログラムの最初の行でデバッガーが停止します。省略された場合 (既定) またはfalse
に設定された場合、デバッガーは最初のブレークポイントまでプログラムを実行します。
console
redirectOutput
の既定値が変更されていない限り、プログラム出力がどのように表示されるかを指定します。
値 | 出力の表示場所 |
---|---|
"internalConsole" |
VS Code デバッグコンソール。redirectOutput が False に設定されている場合、出力は表示されません。 |
"integratedTerminal" (既定) |
VS Code 統合ターミナル。redirectOutput が True に設定されている場合、出力はデバッグコンソールにも表示されます。 |
"externalTerminal" |
別のコンソールウィンドウ。redirectOutput が True に設定されている場合、出力はデバッグコンソールにも表示されます。 |
purpose
purpose
オプションを使用すると、実行ボタンを構成する方法が複数あります。このオプションをdebug-test
に設定すると、VS Code でテストをデバッグする際にこの構成を使用することを定義します。ただし、このオプションをdebug-in-terminal
に設定すると、エディターの右上にあるPython ファイルを実行ボタンにアクセスする場合にのみ (ボタンが提供するPython ファイルを実行またはPython ファイルをデバッグオプションのいずれが使用されるかに関係なく) この構成を使用することを定義します。注: purpose
オプションは、F5 または実行 > デバッグの開始を介してデバッガーを開始するために使用することはできません。
autoReload
デバッガーの実行がブレークポイントにヒットした後、コードに変更が加えられた場合にデバッガーが自動的にリロードされることを許可します。この機能を有効にするには、次のコードに示すように{"enable": true}
を設定します。
{
"name": "Python Debugger: Current File",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"autoReload": {
"enable": true
}
}
注: デバッガーがリロードを実行すると、インポート時に実行されるコードが再度実行される可能性があります。この状況を回避するには、モジュール内でインポート、定数、および定義のみを使用し、すべてのコードを関数に配置するようにしてください。あるいは、
if __name__=="__main__"
チェックを使用することもできます。
subProcess
サブプロセスデバッグを有効にするかどうかを指定します。既定値はfalse
で、true
に設定すると有効になります。詳細については、マルチターゲットデバッグを参照してください。
cwd
デバッガーの現在の作業ディレクトリを指定します。これは、コードで使用されるすべての相対パスのベースフォルダーです。省略された場合、${workspaceFolder}
(VS Code で開いているフォルダー) が既定値となります。
例として、${workspaceFolder}
にapp.py
を含むpy_code
フォルダーと、salaries.csv
を含むdata
フォルダーがあるとします。py_code/app.py
でデバッガーを開始すると、データファイルへの相対パスはcwd
の値によって異なります
cwd | データファイルへの相対パス |
---|---|
省略または${workspaceFolder} |
data/salaries.csv |
${workspaceFolder}/py_code |
../data/salaries.csv |
${workspaceFolder}/data |
salaries.csv |
redirectOutput
true
に設定すると (internalConsole の既定値)、デバッガーはプログラムからのすべての出力を VS Code デバッグ出力ウィンドウに表示します。false
に設定すると (integratedTerminal と externalTerminal の既定値)、プログラム出力はデバッガー出力ウィンドウに表示されません。
このオプションは通常、"console": "integratedTerminal"
または "console": "externalTerminal"
を使用している場合に無効になります。これは、デバッグコンソールに出力を重複させる必要がないためです。
justMyCode
省略された場合、またはtrue
(既定) に設定された場合、デバッグをユーザーが記述したコードのみに制限します。false
に設定すると、標準ライブラリ関数のデバッグも有効になります。
django
true
に設定すると、Django Web フレームワークに固有のデバッグ機能が有効になります。
sudo
true
に設定し、"console": "externalTerminal"
とともに使用すると、昇格が必要なアプリのデバッグが可能になります。パスワードをキャプチャするには外部コンソールが必要です。
pyramid
true
に設定すると、Pyramid アプリが必要なpserve
コマンドで起動されることを保証します。
環境
デバッガーが常に継承するシステム環境変数以外に、デバッガープロセスのオプションの環境変数を設定します。これらの変数の値は文字列として入力する必要があります。
envFile
環境変数定義を含むファイルへのオプションのパス。Python 環境の構成 - 環境変数定義ファイルを参照してください。
gevent
true
に設定すると、gevent のモンキーパッチが適用されたコードのデバッグが有効になります。
jinja
true
に設定すると、Jinja テンプレートフレームワークに固有のデバッグ機能が有効になります。
ブレークポイントとログポイント
Python デバッガー拡張機能は、コードのデバッグのためにブレークポイントとログポイントをサポートしています。基本的なデバッグとブレークポイントの使用に関する短いウォークスルーについては、チュートリアル - デバッガーの構成と実行を参照してください。
条件付きブレークポイント
ブレークポイントは、式、ヒット回数、またはその両方の組み合わせに基づいてトリガーするように設定することもできます。Python デバッガー拡張機能は、整数、および ==、>、>=、<、<=、% 演算子に先行する整数であるヒット回数をサポートしています。たとえば、>5
のヒット回数を設定することで、5 回の発生後にトリガーされるブレークポイントを設定できます。詳細については、VS Code のメインデバッグ記事の条件付きブレークポイントを参照してください。
コード内でのブレークポイントの呼び出し
Python コードで、デバッグセッション中にデバッガーを一時停止したい任意の場所でdebugpy.breakpoint()
を呼び出すことができます。
ブレークポイントの検証
Python デバッガー拡張機能は、pass
ステートメントや複数行ステートメントの中間など、実行不可能な行に設定されたブレークポイントを自動的に検出します。このような場合、デバッガーを実行すると、コード実行がその点で停止するようにブレークポイントを最も近い有効な行に移動します。
特定のアプリケーションタイプのデバッグ
構成ドロップダウンには、一般的なアプリタイプに対してさまざまなオプションが用意されています
設定 | 説明 |
---|---|
アタッチ | 前のセクションのリモートデバッグを参照してください。 |
Django | "program": "${workspaceFolder}/manage.py" , "args": ["runserver"] を指定します。また、Django HTML テンプレートのデバッグを有効にするために"django": true を追加します。 |
Flask | 以下のFlask デバッグを参照してください。 |
Gevent | 標準の統合ターミナル構成に"gevent": true を追加します。 |
Pyramid | program を削除し、"args": ["${workspaceFolder}/development.ini"] を追加し、テンプレートデバッグを有効にするために"jinja": true を追加し、プログラムが必要なpserve コマンドで起動されることを保証するために"pyramid": true を追加します。 |
リモートデバッグと Google App Engine には、特定の追加手順が必要です。テストのデバッグの詳細については、テストを参照してください。
管理者権限を必要とするアプリをデバッグするには、"console": "externalTerminal"
と "sudo": "True"
を使用します。
Flask のデバッグ
{
"name": "Python Debugger: Flask",
"type": "debugpy",
"request": "launch",
"module": "flask",
"env": {
"FLASK_APP": "app.py"
},
"args": [
"run",
"--no-debugger"
],
"jinja": true
},
ご覧のとおり、この構成では"env": {"FLASK_APP": "app.py"}
と "args": ["run", "--no-debugger"]
が指定されています。program
の代わりに"module": "flask"
プロパティが使用されています。(env
プロパティに"FLASK_APP": "${workspaceFolder}/app.py"
と表示される場合、構成をファイル名のみを参照するように変更してください。そうしないと、C がドライブレターである「Cannot import module C」エラーが表示されることがあります。)
"jinja": true
設定は、Flask の既定の Jinja テンプレートエンジンでのデバッグも有効にします。
Flask の開発サーバーを開発モードで実行したい場合は、以下の構成を使用します
{
"name": "Python Debugger: Flask (development mode)",
"type": "debugpy",
"request": "launch",
"module": "flask",
"env": {
"FLASK_APP": "app.py",
"FLASK_ENV": "development"
},
"args": [
"run"
],
"jinja": true
},
トラブルシューティング
デバッガーが機能しない理由は多数あります。デバッグコンソールが特定の原因を明らかにする場合もありますが、主な理由は次のとおりです
-
VS Code でPython デバッガー拡張機能がインストールされ、有効になっていることを確認するには、拡張機能ビュー (⇧⌘X (Windows、Linux Ctrl+Shift+X)) を開き、
@installed python debugger
を検索します。 -
Python 実行可能ファイルへのパスが正しくありません: Python: インタープリターの選択コマンドを実行し、現在の値を確認して、選択したインタープリターのパスをチェックしてください。
-
launch.json
ファイルで"type"
が非推奨の値"python"
に設定されています: Python デバッガー拡張機能で動作するように、代わりに"python"
を"debugpy"
に置き換えてください。 -
ウォッチウィンドウに無効な式があります: ウォッチウィンドウからすべての式をクリアし、デバッガーを再起動してください。
-
ネイティブスレッド API (Python のスレッド API ではなく Win32 の
CreateThread
関数など) を使用するマルチスレッドアプリを扱っている場合、現在、デバッグしたいファイルの先頭に次のソースコードを含める必要がありますimport debugpy debugpy.debug_this_thread()
-
Linux システムで作業している場合、実行中のプロセスにデバッガーを適用しようとすると「タイムアウト」エラーメッセージが表示されることがあります。これを防ぐには、一時的に次のコマンドを実行します
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope