VSCodeでデバッガに引数を渡す方法(Python)

今回はVSCodeのデバッガに引数を渡す方法調べてみます。(知らない)
手探りで調べた手順をそのまんま書いているので、無駄な手順があることに気を付けてください。

デバッガの動かし方はこの前のを参考にしてください。
VS CodeでPythonをデバッグ実行するとエラーが出て実行ができない問題 - EF Blog

デバッグ実行でちゃんと動くか確かめます。

# test.py
print("hello world") # -> hello world

デバッグ実行の時は下のデバッグコンソールに出力されます。
ちなみに、F5デバッグ実行して、F10でステップオーバー、F11でステップイン、Shift+F11でステップアウト、Shift+F5デバッグ終了が行えます。

  • launch.jsonを開く

まず左の虫マークを押して、上の歯車マークを押します。
f:id:EorF:20170818014411p:plain
そうするとlanch.jsonが開くと思います。
いろいろ書かれていると思いますが"name": "Python"と書かれたタスクを見つけます。

  • 引数を追加する

まずPythonの設定を見てみるとこんな感じでした。

{
    "name": "Python",
    "type": "python",
    "request": "launch",
    "stopOnEntry": true,
    "pythonPath": "${config:python.pythonPath}",
    "program": "${file}",
    "cwd": "${workspaceRoot}",
    "env": {},
    "envFile": "${workspaceRoot}/.env",
    "debugOptions": [
        "WaitOnAbnormalExit",
        "WaitOnNormalExit",
        "RedirectOutput"
    ]
}

これに引数のプロパティを追加します。

{
    "name": "Python",
    "type": "python",
    "request": "launch",
    "stopOnEntry": true,
    "pythonPath": "${config:python.pythonPath}",
    "program": "${file}",
    "cwd": "${workspaceRoot}",
    "env": {},
    "envFile": "${workspaceRoot}/.env",
    "debugOptions": [
        "WaitOnAbnormalExit",
        "WaitOnNormalExit",
        "RedirectOutput"
    ],
    "args": [
        "${file}" // 追加(アクティブなファイルのパス)
    ]
}

これで引数が設定できました。

  • 実行して確認してみる

引数が設定できたので実行してちゃんと引数が来ているか確認してみます。

# test.py
import sys # 引数を取得するためモジュール

args = sys.argv # sys.argvはlist
print(args[0]) # -> e:\workspace\test.py
print(args[1]) # -> e:\workspace\test.py
print(args[2]) # -> IndexError: list out of range

引数はちゃんと来ていますが予想と違ってました。
どうやらデバッガの"args"コマンドライン引数だったようです。
なので、引数の最初の要素であるargs[0]には実行したファイルのパスが入っていました。
args[1]にはlaunch.json"args"に設定されていた"${file}"が渡されていました。
args[2]は引数がないのに参照したので「リスト範囲外に参照するな」と怒られました。


つまり、lunch.jsonargsは必要な引数を入れるだけで良かったようです。


もし引数の数が可変だった場合はargvの数を取ると良さげです。

// launch.json
"args": [
    "1",
    "aaa",
    "5000兆円ほしい"
]
# test.py
import sys

args = sys.argv

for i in range(len(args)):
    # 0番目は実行したファイルのパスなのでいらない
    if i == 0:
        continue
    print(args[i])
出力
1
aaa
5000兆円ほしい


これで引数が好きなように使えることができました。

参考:Debugging in Visual Studio Code