argparseを使ったコードをVSCodeでデバッグする方法
概要
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