VSCodeのPythonデバッガー構成で実行時に指定する引数が連結されてしまうことについて

# 概要
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拡張機能の情報取得は以下の記事を参考にしました。ありがとうございます。

https://qiita.com/yoshi_yast/items/b0170158ed477cbe2476


# VSCodeでのデバッグ
今回は以下のようなスクリプトを対象に検証しています。

~~~python:main.py
import sys

print(sys.argv)
~~~

VSCodeでのデバッグはF5キー押下で開始します。そうすると、画面上部のコマンドパレットに、デバッガーの選択候補が表示されます。

![SelectDebugger.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622594/4cbce9bc-37a4-7694-925d-2a2060bb4ee2.png)

通常は先頭の「Python Debbuger」を選択します。そうすると、デバッグ構成の選択候補が表示されます。

![SelectConfig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622594/18903a13-f756-f0fc-78ab-e83173696fca.png)

引数などの情報が必要ない場合、先頭候補の「Python ファイル」を選択すると実際にデバッグが実行されます。今回のスクリプトでは以下のような結果が得られます。

![AfterExecution.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622594/631e7965-e6e9-5099-810a-1fd3865a415b.png)



# 引数を指定したスクリプトのデバッグ
スクリプトに引数を渡したいときがありますが、前記の方法では引数を指定してのデバッグ実行はできません。そのような場合はデバッグ構成を追加します。構成を追加するには、launch.jsonというファイルを作成しますが、デバッグ実行が完了した状態のサイドバーに表示されている、「launch.jsonファイルを作成します」という部分をクリックします。

![CreateLaunchJson.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622594/c4a01468-ce52-f892-f583-e3d668b798b2.png)

そうすると、再度デバッガー選択候補がコマンドパレットに表示され、

![SelectDebugger2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622594/1098daae-22af-2029-978a-045a88c69d1b.png)

「Python Debugger」を選択。続いて表示されるデバッグ構成の選択候補から、今度は「引数を含む Python ファイル」を選択します。

![SelectConfig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622594/8aad832a-7279-2455-34db-630b07711785.png)

そうすると、実際の設定ファイル launch.json が既定の設定でオープンします。

![DefaultLaunchJson.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622594/2f971b0d-65b1-a23d-9086-8c63c8b20b46.png)

"args"の設定値 ${command.pickArgs} あたりが引数を受け取ってくれそうです。この内容のままファイルを閉じ、再びF5キーによりデバッグ実行を開始すると、今度は「コマンドライン引数」というタイトル付でコマンドパレットが表示されます。

![WaitInputArg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622594/8c0ca024-553f-44d4-fe67-bbdc4752feec.png)

ここに引数を入力すればよさそうです。入力欄下の説明書きに従い、引数を1つ入力しEnterキーを押下します。

![Input1Arg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622594/e7dcb3da-7636-87f3-54b5-f84efd793a77.png)

すると、ターミナルウィンドウに print(sys.argv) の実行結果が出力されます。

![AfterExecutionWith1Arg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622594/43c196d1-a340-729e-74a7-038206d46d4d.png)

指定した引数 "abcde" をちゃんと受け取っているようです！めでたしめでたし。と思っていました。



# 複数の引数を指定すると...

予定していたスクリプトには、引数を複数指定することになっていました。なので、同じように引数を2つ入れて実行すると... なんだか引数の数が同じように1つになっています。

![Input2Args.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622594/f6913351-c8ca-8a53-5647-58555d83f893.png)

![AfterExecutionWith2Args.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622594/edb544a1-1b90-69da-9dd6-35287036717c.png)

どうやら入力した2つの引数が連結されて1つになってしまっているようです。念のため、スクリプトを直接実行すると、引数は2つ渡されていることが確認できます。うーん。

![ExecuteNormally.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622594/b21c253c-e687-5084-59f5-81cd38b96bc8.png)



# 設定変更を試す=>解決！

何とかならないものかと、Webを検索。特に引数の指定方法については以下の記事が参考になりました。

https://qiita.com/YumaInaura/items/72c1c68e22c71f37cdd3

どうやら配列形式で指定すればよい様子。

~~~
"args": ["abcde", "12345"]
~~~

改めて、既定の設定内容を確認すると以下のようになっています。

~~~
"args": [
    "${command.pickArgs}"
]
~~~

command.pickArgs がコマンドパレットでの引数指定を受け取るんだとすると、この結果自体が配列になっている可能性がありそうです。なので、試しに外側の[]を除いて以下のような設定を行ってみました。

~~~
"args": "${command.pickArgs}"
~~~

再度デバッグ実行すると... 今度は引数が分かれて認識されました！

![ModifyArgsSetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622594/6fda1df8-e635-82a1-9c43-8d778cb54e76.png)

![AfterExecutionWith2Args2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622594/693d3c9a-3918-ef5d-6696-110609b0366c.png)


なお、launch.json は作業フォルダーの .vscode サブフォルダーに格納されることがエクスプローラーを見ると確認できます。

![PlaceOfLaunchJson.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622594/01212bce-9771-d3cf-d285-9fb1aad45730.png)


同じような事象で悩んだ方の参考になれば幸いです。