💪

argparseを使ったコードをVSCodeでデバッグする方法

2021/05/02に公開

概要

argparseでコマンドライン引数を受けるコードをVSCodeでデバッグする場合の方法を書きます。

「デプロイ環境でCUIから起動することを想定している」とか「シェルから実行している人がいる環境で開発する」という都合でCUIからの起動も考慮しなければならない場合があります。開発環境を統一するのが一番根本的な解決法ではありますが、ステップ実行やブレークポイントなど便利な機能があるので開発作業はVSCodeで行いたいということもあると思います。

parse_argsにハードコードする

argparseはArgumentParser.parse_argsでコマンドライン引数をパースします。parse_argsの引数に何も与えないと実行するときに与える引数をパースしますが、
例えばCUIで-i hoge --output fugaとしたい場合、スペースで区切られる部分ごとにリストにして渡します。

args = parser.parse_args(["-i","hoge","--output","fuga"])

この場合ハードコードが必要になるというのが難点です。

VSCodeのlaunch.jsonに書き込む

VSCodeの機能でコマンドライン引数に渡して実行します。こちらのほうが本来の動きに近いです。

フォルダを開いて作業している前提ですが、作業フォルダに.vscode/launch.jsonというファイルを作ります。まっさらな状態で作ってもいいですが、左リボンのデバッグボタン→「Run and Debug」の下の「create a launch.json file」というリンクを踏めば、雛型が作成されます。

"configurations"の後に設定が記述される形ですが、設定の中にargsキーを与えることで引数を定義できます。またnameで複数の実行パターンを指定することもできます。

    "configurations": [
        {
            "name": "hoge_fuga",
            "type": "python",
            "request": "launch",
            "program": "exec_from_cui.py",
            "console": "integratedTerminal",
	    "args": [
	        "-i","hoge","--output","fuga",
		]
        },
	{"name": "fuga_piyo",
	    //...
	}
    ]

まったく同じ引数パターンで何度もテストする場合はこの方法が便利です。

設計するときに考えること

メインとなる処理の部分と引数をパースする部分は分離して疎結合にすることです。

自分がよくやるパターンは、main関数をargsを受け取る形にして置き、エントリーポイント(if __name__ == "__main__"のところ)で引数をパースする形です。

def main(args):
    # メインの処理

# エントリーポイント
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-i",dest="input")
    #...
    args = parser.parse_args()

    main(args)

Discussion