はじめに
はぁ、かわいい... 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に乗っかるとヘルプメッセージがサブコマンドごとに表示されるようになり、そこも重宝しています。