VS CodeでPythonコードのデバッグ構成をしてみよう:Visual Studio Codeで快適Pythonライフ(2/2 ページ)
VS Codeではlaunch.jsonファイルを使って、デバッグをどのような形で行うかの構成を行えます。その基本的な構成方法や構成可能な項目を紹介。
デバッグ構成の変更
launch.jsonファイルでは以下のような属性を設定可能です(一部を抜粋)。
属性 | 説明 |
---|---|
"name" | 構成名 |
"type" | 使用するデバッガの種類 |
"request" | 新規にファイルを起動するか("launch")、実行中のプロセスにアタッチするか("attach") |
"program" | デバッグ開始時に起動するファイルをフルパスまたはVS Codeでオープンしているフォルダからの相対パスで記述 |
"module" | モジュールをデバッグする場合に、対象のモジュール名を指定する |
"python" | デバッグで使用するPython処理系のフルパス。省略時は現在オープンしているフォルダ(ワークスペース)で使用している処理系となる |
"pythonArgs" | Python処理系に渡す引数を角かっこ「[]」内に、文字列としてカンマ区切りで記述する |
"args" | デバッグするPythonプログラムに渡す引数を角かっこ「[]」内に、文字列としてカンマ区切りで記述する |
"stopOnEntry" | trueを指定すると、デバッグ開始時にデバッグ対象のプログラムの先頭行で実行を中断状態にする。省略時またはfalseを指定したときには、次のブレークポイントまで実行が進められる |
"console" | デバッグ対象のPythonプログラムの出力先の指定。デバッグコンソール("internalConsole")、VS Codeのターミナル("integratedTerminal")、外部のターミナル("externalTerminal")のいずれか |
"autoReload" | ブレークポイントで実行が中断している間に、プログラムを修正した場合に、その修正結果をデバッガが自動的に再読み込みするかどうか |
"subProcess" | サブプロセスのデバッグを有効化/無効化するかの指定 |
"cwd" | デバッグを行う作業ディレクトリの指定 |
"redirectOutput" | trueにするとデバッグ対象プログラムからの出力がデバッグコンソールに送られる("console"属性の値が"internalConsole"の場合のデフォルト値)。falseにすると出力はデバッガコンソールには送られない("console"属性が"integratedTerminal"か"externalTerminal"の場合のデフォルト値) |
"justMyCode" | trueの場合はユーザーが記述したコードのみをデバッグするようになる(有効化するには波かっこ「{}」内に「"enabled": true」を記述) |
"env" | プログラムで使用する設定値を含んだ環境変数を記述する(波かっこ「{}」内に「"ENV": "value"」の組をカンマ区切りで並べる) |
"envFile" | プログラムで使用する環境変数を定義したファイルのパスを指定する |
"preLaunchTask" | デバッグ開始前に実行するタスクを指定する |
"postDebugTask" | デバッグ終了後に実行するタスクを指定する |
VS CodeでPythonコードのデバッグを行う際にlaunch.jsonファイルで構成可能な属性(一部を抜粋) |
設定可能な属性は他にもたくさんあります。詳細についてはVS Codeのドキュメント「Set configuration options」「Launch.json attributes」などを参照してください。
スタートアップファイルの指定
VS Codeで現在開いているプロジェクト(ワークスペース)で、プログラムのエントリポイントが常に決まっているのであれば(例えば、必ずmain.pyファイルが最初に呼び出されるなど)、デバッグ実行の開始時にわざわざエディタ領域でそのファイルをアクティブにするのは面倒なことです。そこで、"program"属性の設定を次のように変更してみましょう。
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "main.py",
"console": "integratedTerminal",
}
]
}
このようにすることで、デバッグ開始時に(エディタ領域でどのファイルがアクティブかに関係なく)常にmain.pyファイルが実行されるようになります。また、ここにフルパスでファイルを指定するときには、以下のような変数が使えます。
- ${workspaceFolder}:VS Codeでオープンしているトップレベルのフォルダ
- ${file}:エディタ領域で現在アクティブなファイル
この他にも多くの変数が利用できるので、それらについてはVS Codeのドキュメント「Variables Reference」を参照してください。
以下ではこれらのうち、幾つかの属性について見てみましょう。
デバッグ開始時にプログラムの実行を中断する
デバッグ実行の開始時に、プログラムの先頭行で実行を中断させられると都合がよいことがあります。そうするには"stopOnEntry"属性の値をtrueにします。なお、この属性は"request"属性の値が"launch"のときにだけ指定可能です。
{
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "main.py",
"console": "integratedTerminal",
"stopOnEntry": true
}
]
}
この属性の値をtrueにして、デバッグを開始すると、以下のようにmain関数呼び出しに設定したブレークポイントではなく、main.pyファイルの先頭行で実行が中断されたことが分かります。
この属性の省略時、またはその値をfalseにした場合は、最初のブレークポイントに到達するまでプログラムが実行されます。
出力先の指定
デバッグ対象のプログラムからのコンソールへの出力をどこに表示するかは、"console"属性で指定します。デフォルト値は"integratedTerminal"で、ターミナルに出力が行われます。この属性の値を"internalConsole"にすると、次のように出力がデバッグコンソールに送られるようになります。
この属性の値を"externalTerminal"にすれば、以下のようにターミナルがVS Codeのウィンドウとは別に起動され、そこに出力が行われます。
これに関連する属性として"redirectOutput"があります。これをtrueにすると、デバッグ対象のプログラムからの出力がデバッグコンソールに送られるようになります。この属性の値は、"console"属性の値が"integratedTerminal"と"externalTerminal"の場合にはデフォルトでfalseとなっています。つまり、これらの値をlaunch.jsonファイルで指定した場合には、(既に出力先が得られているので)デバッグコンソールに出力が送られることはありません(もちろん、自分で"redirectOutput"の値をtrueにすれば、デバッグコンソールにも出力されるようになりますが、通常、その必要はないでしょう)。
Python処理系のパス
通常、デバッグ実行時には現在オープンしているフォルダに関連付けられた(コマンドパレットなどから選択した)Pythonの処理系が使われます。これを別の処理系にしたいときには、"python"属性に使用したい処理系へのパスを記述します。
また、Python処理系に渡したい引数があれば、"pythonArgs"属性にそれらを文字列リストの要素として記述します。例えば、以下のように"pythonArgs"属性を記述すると、ターミナルに「hello」と出力されるようになります(ただし、デバッグ実行は行われないままタイムアウトするので、以下を試した場合は後からこの属性を削除するのを忘れないようにしましょう)。
{
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "main.py",
"console": "integratedTerminal",
"pythonArgs": ["-c", "print('hello')"]
}
]
}
今回はデバッグ構成について見ました(実は、"request"属性の値を"attach"にして、debugpyモジュールを使って、実行中のプログラムにVS Codeをアタッチする例も考えていたのですが、今回は時間切れのため、何か機会があれば、別の記事として取り上げたいと考えています)。次回はJupyter NotebookをVS Codeで使用する話をする予定です。
Copyright© Digital Advantage Corp. All Rights Reserved.