VSCodeでデバッガに引数を渡す方法(Python)
2020/05/02現在のVSCodeのバージョンで書き直した記事を上げました。
設定手順などは新しい記事、引数などの説明は当記事を参考にしてください。
t.co
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
今回はVSCodeのデバッガに引数を渡す方法調べてみます。(知らない)
手探りで調べた手順をそのまんま書いているので、無駄な手順があることに気を付けてください。
デバッガの動かし方はこの前のを参考にしてください。
VS CodeでPythonをデバッグ実行するとエラーが出て実行ができない問題 - EF Blog
- test.pyを作成しデバッグ実行
デバッグ実行でちゃんと動くか確かめます。
# test.py print("hello world") # -> hello world
デバッグ実行の時は下のデバッグコンソールに出力されます。
ちなみに、F5でデバッグ実行して、F10でステップオーバー、F11でステップイン、Shift+F11でステップアウト、Shift+F5でデバッグ終了が行えます。
- launch.jsonを開く
まず左の虫マークを押して、上の歯車マークを押します。
そうすると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.jsonのargsは必要な引数を入れるだけで良かったようです。
もし引数の数が可変だった場合は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兆円ほしい
これで引数が好きなように使えることができました。