はじめに
はぁ、かわいい... nikkieです。
argparseの小ネタです。
目次
argparse
Python標準ライブラリの1つ。
argparse はモジュールは、ユーザーフレンドリーなコマンドラインインターフェースの作成を簡単にします。(引用ママ)
基本的な機能を押さえるなら、以下が浮かびます
- Argparse チュートリアル — Python 3.11.3 ドキュメント
- 『Python実践レシピ』& 補足記事「argparseはオプション引数だけでなく、位置引数も扱えます!!(#Python実践レシピ を勝手に補足) - nikkie-ftnextの日記」
argparseでサブコマンドを作る!
ドキュメントの「サブコマンド」の項目を参照します。
https://docs.python.org/ja/3/library/argparse.html#sub-commands
サブコマンドの例はこちら:
例えば
svn
プログラムはsvn checkout
,svn update
,svn commit
などのサブコマンドを利用できます。
サブコマンドを実装するには、argparse.ArgumentParser
のadd_subparsers
メソッドを呼び出します。
https://docs.python.org/ja/3/library/argparse.html#argparse.ArgumentParser.add_subparsers
add_subparsers
が返したオブジェクト(argparse._SubParsersAction
)に対して、add_parser
メソッドを呼ぶことで子のパーサ(サブパーサ)を追加していけます。
svn
コマンドにならった実装とすると、メインのparser
のadd_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
に乗っかるとヘルプメッセージがサブコマンドごとに表示されるようになり、そこも重宝しています。