nikkie-ftnextの日記

イベントレポートや読書メモを発信

argparseでサブコマンドを実装する

はじめに

はぁ、かわいい... nikkieです。

argparseの小ネタです。

目次

argparse

Python標準ライブラリの1つ。

argparse はモジュールは、ユーザーフレンドリーなコマンドラインインターフェースの作成を簡単にします。(引用ママ

基本的な機能を押さえるなら、以下が浮かびます

argparseでサブコマンドを作る!

ドキュメントの「サブコマンド」の項目を参照します。
https://docs.python.org/ja/3/library/argparse.html#sub-commands

サブコマンドの例はこちら:

例えば svn プログラムは svn checkout, svn update, svn commit などのサブコマンドを利用できます。

サブコマンドを実装するには、argparse.ArgumentParseradd_subparsersメソッドを呼び出します。
https://docs.python.org/ja/3/library/argparse.html#argparse.ArgumentParser.add_subparsers

add_subparsersが返したオブジェクトargparse._SubParsersActionに対して、add_parserメソッドを呼ぶことで子のパーサ(サブパーサ)を追加していけます。

svnコマンドにならった実装とすると、メインのparseradd_subparsersを呼び出し、返り値のオブジェクトに対して、checkout, update, commitと3回add_parserを呼び出します。

サブコマンドになっていることをヘルプメッセージから確認

※動作確認環境は、Python 3.10.9です。

スクリプトに対して-hを渡すとサブコマンドが一覧できます。

% python practice_subcommand.py -h
usage: practice_subcommand.py [-h] {checkout,update,commit} ...

positional arguments:
  {checkout,update,commit}

options:
  -h, --help            show this help message and exit

サブコマンドに-hを渡すと、引数を確認できます。

checkoutには位置引数を設定しています。

% python practice_subcommand.py checkout -h
usage: practice_subcommand.py checkout [-h] foo

positional arguments:
  foo

options:
  -h, --help  show this help message and exit

updateは引数なしです。

% python practice_subcommand.py update -h
usage: practice_subcommand.py update [-h]

options:
  -h, --help  show this help message and exit

commitにはオプション引数を持たせました。

% python practice_subcommand.py commit -h
usage: practice_subcommand.py commit [-h] [--bar BAR]

options:
  -h, --help  show this help message and exit
  --bar BAR

コマンドに対してサブコマンド(、そのサブコマンド、...)とネストさせていくことで、多数の機能を持つコマンドラインツールをargparseで実装できます!

機能をサブコマンドに分割するのは、プログラムがいくつかの異なった機能を持っていて、 それぞれが異なるコマンドライン引数を必要とする場合には良いアイデアです。(add_subparsersのドキュメントより)

終わりに

argparseでサブコマンドを実装する方法をアウトプットしました。
add_subparsersメソッドを使い、サブコマンドのパーサごとにadd_parserしていきます。

これを知る前は引数の解析を頑張ろうと試みましたが、add_subparsersに乗っかるとヘルプメッセージがサブコマンドごとに表示されるようになり、そこも重宝しています。