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                    
  • 相关阅读:
    Unable To Open Database After ASM Upgrade From Release 11.1 To Release 11.2
    11g Understanding Automatic Diagnostic Repository.
    How to perform Rolling UpgradeDowngrade in 11g ASM
    Oracle 11.2.0.2 Patch 说明
    Pattern Matching Metacharacters For asm_diskstring
    Steps To MigrateMove a Database From NonASM to ASM And ViceVersa
    Upgrading ASM instance from Oracle 10.1 to Oracle 10.2. (Single Instance)
    OCSSD.BIN Process is Running in a NonRAC Environment
    Steps To MigrateMove a Database From NonASM to ASM And ViceVersa
    On RAC, expdp Removes the Service Name [ID 1269319.1]
  • 原文地址:https://www.cnblogs.com/fireflow/p/4833943.html
Copyright © 2011-2022 走看看