python命令行解析工具argparse模块【5】

        上一节我们学习了parse_args()的用法,这一节,我们将继续学习argparse的其他一些用法。
        1.sub-commands子命令
        argparser支持类似svn的子命令,通过add_subparsers()可以实现,这个方法不需要任何参数,并返回一个特殊的action对象,这个对象有一个方法-add_parser,它接收一个命令名和任意ArgumentParser构造函数参数,并返回一个ArgumentParser对象。
>>> # create the top-level parser
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', action='store_true', help='foo help')
>>> subparsers = parser.add_subparsers(help='sub-command help')
>>>
>>> # create the parser for the "a" command
>>> parser_a = subparsers.add_parser('a', help='a help')
>>> parser_a.add_argument('bar', type=int, help='bar help')
>>>
>>> # create the parser for the "b" command
>>> parser_b = subparsers.add_parser('b', help='b help')
>>> parser_b.add_argument('--baz', choices='XYZ', help='baz help')
>>>
>>> # parse some arg lists
>>> parser.parse_args(['a', '12'])
Namespace(bar=12, foo=False)
>>> parser.parse_args(['--foo', 'b', '--baz', 'Z'])
Namespace(baz='Z', foo=True)
        注意,parse_args()只会返回主parser中指定的参数。>>> parser.parse_args(['--help'])
>>> parser.parse_args(['--help'])
usage: PROG [-h] [--foo] {a,b} ...
 
positional arguments:
{a,b} sub-command help
a a help
b b help
 
optional arguments:
-h, --help show this help message and exit
--foo foo help
 
>>> parser.parse_args(['a', '--help'])
usage: PROG a [-h] bar
 
positional arguments:
bar bar help
 
optional arguments:
-h, --help show this help message and exit
 
>>> parser.parse_args(['b', '--help'])
usage: PROG b [-h] [--baz {X,Y,Z}]
 
optional arguments:
-h, --help show this help message and exit
--baz {X,Y,Z} baz help
        add_subparsers()也支持title和description参数。
>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(title='subcommands',
... description='valid subcommands',
... help='additional help')
>>> subparsers.add_parser('foo')
>>> subparsers.add_parser('bar')
>>> parser.parse_args(['-h'])
usage: [-h] {foo,bar} ...
 
optional arguments:
-h, --help show this help message and exit
 
subcommands:
valid subcommands
 
{foo,bar} additional help
        另外一种有效处理子命令的方法是将add_subparsers()与set_defaults()绑定起来。
>>> # sub-command functions
>>> def foo(args):
... print args.x * args.y
...
>>> def bar(args):
... print '((%s))' % args.z
...
>>> # create the top-level parser
>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers()
>>>
>>> # create the parser for the "foo" command
>>> parser_foo = subparsers.add_parser('foo')
>>> parser_foo.add_argument('-x', type=int, default=1)
>>> parser_foo.add_argument('y', type=float)
>>> parser_foo.set_defaults(func=foo)
>>>
>>> # create the parser for the "bar" command
>>> parser_bar = subparsers.add_parser('bar')
>>> parser_bar.add_argument('z')
>>> parser_bar.set_defaults(func=bar)
>>>
>>> # parse the args and call whatever function was selected
>>> args = parser.parse_args('foo 1 -x 2'.split())
>>> args.func(args)
2.0
>>>
>>> # parse the args and call whatever function was selected
>>> args = parser.parse_args('bar XYZYX'.split())
>>> args.func(args)
((XYZYX))
        通过这种方式,你可以在解析完参数之后,调用指定的函数,但是必须检查子命令的名字。
>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(dest='subparser_name')
>>> subparser1 = subparsers.add_parser('1')
>>> subparser1.add_argument('-x')
>>> subparser2 = subparsers.add_parser('2')
>>> subparser2.add_argument('y')
>>> parser.parse_args(['2', 'frobble'])
Namespace(subparser_name='2', y='frobble')
        2.FileType对象
        FileType类工厂可以创建一个文件类型对象并传递给add_argument()方法。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--output', type=argparse.FileType('wb', 0))
>>> parser.parse_args(['--output', 'out'])
Namespace(output=<open file 'out', mode 'wb' at 0x...>)
         文件类型对象能够识别-,并自动将其转换为sys.stdin或者sys.stdout
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('infile', type=argparse.FileType('r'))
>>> parser.parse_args(['-'])
Namespace(infile=<open file '<stdin>', mode 'r' at 0x...>)
        3.参数组
       默认情况下,ArgumentParser将命令行参数按位置参数和可选包参数进行分组,并显示在帮助信息中,通过指定add_argument_group()参数开可以自定义分组。
>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)
>>> group = parser.add_argument_group('group')
>>> group.add_argument('--foo', help='foo help')
>>> group.add_argument('bar', help='bar help')
>>> parser.print_help()
usage: PROG [--foo FOO] bar
 
group:
bar bar help
--foo FOO foo help
        add_argument_group()对象返回一个类似ArgumentParser的参数组对象,这个对象有一个方法add_argument(),不同的参数组可以在帮助信息中显示不同的分组信息。
>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)
>>> group1 = parser.add_argument_group('group1', 'group1 description')
>>> group1.add_argument('foo', help='foo help')
>>> group2 = parser.add_argument_group('group2', 'group2 description')
>>> group2.add_argument('--bar', help='bar help')
>>> parser.print_help()
usage: PROG [--bar BAR] foo
 
group1:
group1 description
 
foo foo help
 
group2:
group2 description
 
--bar BAR bar help
        4.互斥
       使用argparse.add_mutually_exclusive_group()创建一个互斥的参数组,这意味着同时只能指定其中的一个参数。
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> group = parser.add_mutually_exclusive_group()
>>> group.add_argument('--foo', action='store_true')
>>> group.add_argument('--bar', action='store_false')
>>> parser.parse_args(['--foo'])
Namespace(bar=True, foo=True)
>>> parser.parse_args(['--bar'])
Namespace(bar=False, foo=False)
>>> parser.parse_args(['--foo', '--bar'])
usage: PROG [-h] [--foo | --bar]
PROG: error: argument --bar: not allowed with argument --foo
        这个方法也可以指定requred值,表示必须提供一个参数。
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> group = parser.add_mutually_exclusive_group(required=True)
>>> group.add_argument('--foo', action='store_true')
>>> group.add_argument('--bar', action='store_false')
>>> parser.parse_args([])
usage: PROG [-h] (--foo | --bar)
PROG: error: one of the arguments --foo --bar is required
        5.解析默认参数
        大多数情况下,parse_args返回的属性由命令行参数决定,但有时候可以通过set_defaults()来提供参数给parse_args()。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('foo', type=int)
>>> parser.set_defaults(bar=42, baz='badger')
>>> parser.parse_args(['736'])
Namespace(bar=42, baz='badger', foo=736)
        注意默认值通常会覆盖掉命令行提供的参数值
>>> parser = argparse.ArgumentParser()
 
>>> parser.add_argument('--foo', default='bar')
 
>>> parser.set_defaults(foo='spam')
 
>>> parser.parse_args([])
 
Namespace(foo='spam')
        可以通过get_default()方法获取默认值。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default='badger')
>>> parser.get_default('foo')
'badger'
        6.打印帮助信息
        大多数情况下,parse_args()会处理帮助信息的组织和打印。但是也可以使用以下方法。
  • ArgumentParser.print_usage([file]):打印用法示例
  • ArgumentParser.print_help([file]): 打印帮助信息
  • ArgumentParser.format_usage(): 格式化用法示例信息
  • ArgumentParser.format_help():格式化帮助信息
        7.部分解析
        使用parse_known_args()完成部分解析,结果返回一个命名空间和一个还未解析的字符串列表
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('bar')
>>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam'])
(Namespace(bar='BAR', foo=True), ['--badger', 'spam'])
        8.自定义文件解析
       从文件中获取参数时,默认是每行一个参数,可以重写convert_arg_line_to_args()实现自定义读取参数。例如
def convert_arg_line_to_args(self, arg_line):
    for arg in arg_line.split():
       if not arg.strip():
            continue
                yield arg                    
posted @ 2015-09-23 23:45  楚狂人阿飞  阅读(2321)  评论(0编辑  收藏  举报