93666


# やりたいこと

`argparse`でコマンドライン引数を受ける仕様のPythonプログラムに対してVS
Codeのデバッグモードを使い、`launch.json`で設定した引数をプログラムに渡したい。

# 状況

`argparse`でコマンドライン引数を受ける仕様のPythonファイルに対してVS
Codeのデバッグモードを使ったところ、`launch.json`で設定した引数が渡せていないようでエラーが発生しています。

デバッグモードではなく以下のようにコマンドを打ち込んで実行した場合はエラーは出ません。

[code]

    train.py path/to/directory 0 0
    
[/code]

# コード

**./.vscode/lauch.json**

[code]

    {
        // Use IntelliSense to learn about possible attributes.
        // Hover to view descriptions of existing attributes.
        // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
            {
                "name": "Python: train.py",
                "type": "python",
                "request": "launch",
                "program": "train.py",
                "console": "integratedTerminal",
                "justMyCode": true,
                "args": [
                    "path/to/directory",
                    "0",
                    "0",
                ]
            }
        ]
    }
    
[/code]

**./train.py**

[code]

    import argparse
    
    
    parser = argparse.ArgumentParser(description='PyTorch CSRNet')
    parser.add_argument('train_path', metavar='TRAIN',
                        help='path to train dataset directory')
    parser.add_argument('--pre', '-p', metavar='PRETRAINED', default=None, type=str, 
                        help='path to the pretrained model')
    parser.add_argument('gpu', metavar='GPU', type=str, 
                        help='GPU id to use.')
    parser.add_argument('task', metavar='TASK', type=str, 
                        help='task id to use.')
    
    
    def main():
        global args,best_prec1
        best_prec1 = 1e6
        
        args = parser.parse_args()
    
    
    if __name__ == '__main__':
        main()
    
    
[/code]

# エラー

## VS Codeのポップアップエラー

`main()` 下の `args = parser.parse_args()` で以下のエラーが出ています。

[code]

    Exception has occurred: SystemExit
    2
      File "****/train.py", line 33, in main
        args = parser.parse_args()
      File "****/train.py", line 215, in <module>
        main()
    SystemExit: 2
    
[/code]

## VS Codeのターミナルのエラー

[code]

    usage: train.py [-h] [--pre PRETRAINED] TRAIN GPU TASK
    train.py: error: the following arguments are required: TRAIN, GPU, TASK
    
[/code]

# 環境

Windows 11 WSL (Ubuntu 22.04)  
Python 3.10.8 (venv使用)  
VS Code version 1.74.3

# その他

不備等ありましたら修正しますので宜しくお願い致します。


CC BY-SA 4.0
2023-01-26T11:11:36.550
93571
2023-02-01T10:27:12.263
38402
question
python vscode
VS CodeでPythonデバッグモード使用時にlaunch.jsonで設定したコマンドライン引数が読み込めない


(コメントから回答へ)

VS Codeのデバッガー機能については以下のページ

  * [Debugging](https://code.visualstudio.com/docs/editor/debugging)

その中の, Python でのデバッガー機能は以下のページがあります

  * [Python debugging in VS Code](https://code.visualstudio.com/docs/python/debugging)

それによると以下のような項目が記されています

  * "configuration" で指定する。それは `launch.json` ファイル内に定義されている。ファイルが存在しなければ尋ねられ作成される
  * **Run and Debug** view (`Ctrl`+`Shift`+`D`) でデバッガーのドロップダウンリストから適切な "configuration" を選択しデバッガーを開始する

"configuration" では対象のプログラムを以下のように指定。(`${file}` は現在開いているファイル名)

[code]

        "program": "${file}",
    
[/code]

このことから, 上記に挙げた項目のどこかに間違った指定があると思われます  
(今回の場合は, 適切な "configuration" が選択されていなかった)

※ あと, 細かいことながら, JSONでの記述は配列などの項目の最後には `,` は付かないことになっていて, VS
Codeではうまいこと解釈してくれるけど下手な JSONパーサーだと認識できないかも  
(`args` の最後)


CC BY-SA 4.0
2023-02-01T10:27:12.263
93666
2023-02-01T10:27:12.263
43025
93571
answer