zoukankan      html  css  js  c++  java
  • 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                    
  • 相关阅读:
    连接ESP32失败:等待包头 #226超时
    题王网
    高可用架构模式——CAP
    高性能负载均衡
    单服务器高性能模式
    虚拟支付
    高性能架构设计——数据库篇
    MySQL
    shell 命令: MD5
    HTTPS
  • 原文地址:https://www.cnblogs.com/fireflow/p/4833943.html
Copyright © 2011-2022 走看看