Skip to content

Python で argparse を使ってサブコマンドを実装する

Python3 で標準ライブラリの argparse を使うことで「サブコマンドを理解出来るコマンド」を実装することが出来ます。 今回はサンプルスクリプトと実行例をメモしておきます。

サンプルスクリプト

サンプルスクリプトは以下の通りです。 ArgumentParser に対して add_subparsers() を呼び出し、サブコマンドを登録します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/env python
# coding: utf-8

import argparse


def command_aaa(args):
    if args.xxx == False:
        print("Hello, aaa!")
    else:
        print("Hello, xxx!")


def command_bbb(args):
    if args.yyy == False:
        print("Hello, bbb!")
    else:
        print("Hello, yyy!")


def command_help(args):
    print(parser.parse_args([args.command, "--help"]))


parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()

parser_aaa = subparsers.add_parser("aaa", help="Command AAA")
parser_aaa.add_argument("-x", "--xxx", action="store_true", help="Option XXX")
parser_aaa.set_defaults(handler=command_aaa)

parser_bbb = subparsers.add_parser("bbb", help="Command BBB")
parser_bbb.add_argument("-y", "--yyy", action="store_true", help="Option YYY")
parser_bbb.set_defaults(handler=command_bbb)

parser_help = subparsers.add_parser("help", help="Help")
parser_help.add_argument("command", help="Command help")
parser_help.set_defaults(handler=command_help)

args = parser.parse_args()
if hasattr(args, "handler"):
    args.handler(args)
else:
    parser.print_help()

実行例

実行例を羅列すると、以下の通りです。

1
2
# ./sample.py aaa
Hello, aaa!
1
2
# ./sample.py aaa -x
Hello, xxx!
1
2
# ./sample.py bbb
Hello, bbb!
1
2
# ./sample.py bbb -y
Hello, yyy!
1
2
3
# ./sample.py help
usage: sample.py help [-h] command
sample.py help: error: the following arguments are required: command
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# ./sample.py
usage: sample.py [-h] {aaa,bbb,help} ...

positional arguments:
  {aaa,bbb,help}
    aaa           Command AAA
    bbb           Command BBB
    help          Help

optional arguments:
  -h, --help      show this help message and exit
1
2
3
4
5
6
# ./sample.py help aaa
usage: sample.py aaa [-h] [-x]

optional arguments:
  -h, --help  show this help message and exit
  -x, --xxx   Option XXX
1
2
3
4
5
6
# ./sample.py help bbb
usage: sample.py bbb [-h] [-y]

optional arguments:
  -h, --help  show this help message and exit
  -y, --yyy   Option YYY