argparse でサブコマンドを実装してみた

argparseモジュールでは、オプションの処理だけでなく、サブコマンドの処理もできる。
マニュアルはここ。
cf. http://docs.python.jp/2/library/argparse.html#id10

サンプル

次のサンプルは、foo と bar の2つのサブコマンドを持っている。

import argparse

def foo(args):
    if args.upcase:
        print 'FOO'
    else:
        print 'foo'

def bar(args):
    for i in range(args.times):
        print 'bar'

parser = argparse.ArgumentParser(description='Sub-command sample')
subparsers = parser.add_subparsers(help='sub-command help', title='subcommands')

parser_foo = subparsers.add_parser('foo', help='foo help')
parser_foo.add_argument('-u', '--upcase', action='store_true', help='upcase')
parser_foo.set_defaults(func=foo)

parser_bar = subparsers.add_parser('bar', help='bar help')
parser_bar.add_argument('-t', '--times', type=int, metavar='N', action='store',
default=1, help='repeat N times')
parser_bar.set_defaults(func=bar)

args = parser.parse_args()

args.func(args)

16行目でサブコマンドを振り分ける(らしき)オブジェクトを作り、18~20行目と22~25行目でそれぞれfooとbarの2つのサブコマンドを作っている。ここでのキモは20行目と25行目、set_defaultsでサブコマンドが選択されたときに実行すべき関数を登録しているところ。
そして、最後の行でその関数を実行している。

実行例

メインコマンドの–helpオプション:

^o^ > python subcommand.py --help
usage: subcommand.py [-h] {foo,bar} ...

Sub-command sample

optional arguments:
  -h, --help  show this help message and exit

subcommands:
  {foo,bar}   sub-command help
    foo       foo help
    bar       bar help

サブコマンド foo:

^o^ > python subcommand.py foo --help
usage: subcommand.py foo [-h] [-u]

optional arguments:
  -h, --help    show this help message and exit
  -u, --upcase  upcase

^o^ > python subcommand.py foo
foo

^o^ > python subcommand.py foo --upcase
FOO

サブコマンドのヘルプも自動的に作ってくれている。

サブコマンド bar:

^o^ > python subcommand.py bar
bar

^o^ > python subcommand.py bar --times 3
bar
bar
bar