概要
Visual Studio Code(以下VSCode)を使用してPythonスクリプトをデバッグするとき、スクリプトに引数を渡したい時があります。その場合はデバッグ構成としてlaunch.jsonを作成すると、デバッグ開始時に任意の引数を指定できますが、空白で区切って複数の引数を指定するとそれらが連結された1つの引数として取り扱われることがあります。その対策です。
なお、今回の事象が発生した環境情報を以下に記載します。
D:\Project>code .
D:\Project>code --version
1.93.1
38c31bc77e0dd6ae88a4e9cc93428cc27a56ba40
x64
D:\Project>code --list-extensions --show-versions
ms-ceintl.vscode-language-pack-ja@1.93.2024091109
ms-python.debugpy@2024.10.0
ms-python.python@2024.14.1
ms-python.vscode-pylance@2024.9.1
visualstudioexptteam.intellicode-api-usage-examples@0.2.8
visualstudioexptteam.vscodeintellicode@1.3.1
D:\Project>python --version
Python 3.12.4
なお、VSCode拡張機能の情報取得は以下の記事を参考にしました。ありがとうございます。
VSCodeでのデバッグ
今回は以下のようなスクリプトを対象に検証しています。
import sys
print(sys.argv)
VSCodeでのデバッグはF5キー押下で開始します。そうすると、画面上部のコマンドパレットに、デバッガーの選択候補が表示されます。
通常は先頭の「Python Debbuger」を選択します。そうすると、デバッグ構成の選択候補が表示されます。
引数などの情報が必要ない場合、先頭候補の「Python ファイル」を選択すると実際にデバッグが実行されます。今回のスクリプトでは以下のような結果が得られます。
引数を指定したスクリプトのデバッグ
スクリプトに引数を渡したいときがありますが、前記の方法では引数を指定してのデバッグ実行はできません。そのような場合はデバッグ構成を追加します。構成を追加するには、launch.jsonというファイルを作成しますが、デバッグ実行が完了した状態のサイドバーに表示されている、「launch.jsonファイルを作成します」という部分をクリックします。
そうすると、再度デバッガー選択候補がコマンドパレットに表示され、
「Python Debugger」を選択。続いて表示されるデバッグ構成の選択候補から、今度は「引数を含む Python ファイル」を選択します。
そうすると、実際の設定ファイル launch.json が既定の設定でオープンします。
"args"の設定値 ${command.pickArgs} あたりが引数を受け取ってくれそうです。この内容のままファイルを閉じ、再びF5キーによりデバッグ実行を開始すると、今度は「コマンドライン引数」というタイトル付でコマンドパレットが表示されます。
ここに引数を入力すればよさそうです。入力欄下の説明書きに従い、引数を1つ入力しEnterキーを押下します。
すると、ターミナルウィンドウに print(sys.argv) の実行結果が出力されます。
指定した引数 "abcde" をちゃんと受け取っているようです!めでたしめでたし。と思っていました。
複数の引数を指定すると...
予定していたスクリプトには、引数を複数指定することになっていました。なので、同じように引数を2つ入れて実行すると... なんだか引数の数が同じように1つになっています。
どうやら入力した2つの引数が連結されて1つになってしまっているようです。念のため、スクリプトを直接実行すると、引数は2つ渡されていることが確認できます。うーん。
設定変更を試す=>解決!
何とかならないものかと、Webを検索。特に引数の指定方法については以下の記事が参考になりました。
どうやら配列形式で指定すればよい様子。
"args": ["abcde", "12345"]
改めて、既定の設定内容を確認すると以下のようになっています。
"args": [
"${command.pickArgs}"
]
command.pickArgs がコマンドパレットでの引数指定を受け取るんだとすると、この結果自体が配列になっている可能性がありそうです。なので、試しに外側の[]を除いて以下のような設定を行ってみました。
"args": "${command.pickArgs}"
再度デバッグ実行すると... 今度は引数が分かれて認識されました!
なお、launch.json は作業フォルダーの .vscode サブフォルダーに格納されることがエクスプローラーを見ると確認できます。
同じような事象で悩んだ方の参考になれば幸いです。