zoukankan      html  css  js  c++  java
  • python命令行参数

    python获取命令行参数的方式主要有三种:

    • sys.argv
    • getopt
    • argparse

    sys.argv

    ​ sys.argv是python中最基本、最简单的获取命令行参数的方式。sys.argv返回一个命令行参数列表。

    一个例子

    #vim parse_command_line_option.py
    
    import sys
    # 命令行参数个数
    print('命令行参数个数:%s' % len(sys.argv))
    # 命令行参数
    print('命令行参数:%s' % ' '.join(sys.argv))
    # 第一个参数表示脚本名
    print('脚本名称:%s' % sys.argv[0])
    

    运行结果

    $ python parse_command_line_option.py o1params o2params o3params
    命令行参数个数:4
    命令行参数:parse_command_line_option.py o1params o2params o3params
    脚本名称:parse_command_line_option.py
    

    getopt

    ​ 此模块帮助脚本解析sys.argv中的命令行参数,它支持短选项和长选项(---)。这个模块提供了两个函数和一个异常:

    • getopt
    • gnu_getopt
    • GetoptError

    getopt

    ​ getopt是我们经常使用的函数,下面我们来看看它的函数说明吧。

    getopt(args, shortopts, longopts=[]) -> opts, args


    args: 指的是当前脚本需要解析的参数列表,通常是sys.argv[1:]

    shortopts: 短参数,类似于 python test.py -h。短参数是一个字符串,如果带有冒号:表示这个选项后面必须要有一个参数。比如'-h-v-i:-o:'表示-i-o的后面需要接参数。

    longopts: 长参数,类似于 python test.py --help。长参数是一个可选参数,它是一个list列表。如果选项后面必须接参数,则需要加个=。比如['help', 'version', 'input=', 'output=']表示inputoutput后面需要接参数。

    调用方式:

    短参数:-参数名[空格]参数值

    长参数:--参数名=参数值

    ​ getopt函数的返回值是一个包含两个列表的元组

    • opts

    • args

      opts是一个列表,列表每个值是(option, value)对。比如("-o", "outputname")

      args其他参数列表,它包含不属于格式信息的剩余的命令行参数。

    gnu_getopt

    ​ 这个函数的工作方式与getopt()类似,只是默认使用的是GNU样式扫描模式。这个函数用的较少,可以使用print(getopt.__doc__)help(getopt.gnu_getopt)查看说明文档。

    GetoptError

    ​ 异常类处理对象,抛出错误信息。

    一个例子:

    #vim parse_command_line_option.py
    
    import sys
    import getopt
    
    try:
        # opts: 包含选项和值  args: 不属于格式信息的剩余的命令行参数
        # :和=表示后面必须要接参数
        opts, args = getopt.getopt(sys.argv[1:], '-h-v-i:-o:', ['help', 'version', 'input=', 'output='])
    except getopt.GetoptError as e:
        print(e)
        print('usage: python %s -i <inputfile> -o <outputfile>' % __file__)
        print('   or: python %s --input=<inputfile> --output=<outputfile>' % __file__)
        return
    for option, value in opts:
        if option in ('-h', '--help'):
            print('usage: python %s -i <inputfile> -o <outputfile>' % __file__)
            print('   or: python %s --input=<inputfile> --output=<outputfile>' % __file__)
        elif option in ('-v', '--version'):
            print('Version is 0.01')
        elif option in ('-i', '--input'):
            print('input file is: %s' % value)
        elif option in ('-o', '--output'):
            print('output file is: %s' % value)
    print('args = %s' % args)
    for index, arg in enumerate(args):
        print('Other argument_%s: %s' % (index+1, arg))
    

    运行结果:

    $ python parse_command_line_option.py -h
    usage: python parse_command_line_option.py -i <inputfile> -o <outputfile>
       or: python parse_command_line_option.py --input=<inputfile> --output=<outputfile>
    args = []
    
    $ python parse_command_line_option.py -i inputfile -o outputfile o1params o2params o3params
    input file is: inputfile
    output file is: outputfile
    args = ['o1params', 'o2params', 'o3params']
    Other argument_1: o1params
    Other argument_2: o2params
    Other argument_3: o3params
    
    $ python parse_command_line_option.py --input=inputfile --output=outputfile o1params
    input file is: inputfile
    output file is: outputfile
    args = ['o1params']
    Other argument_1: o1params
    
    $ python parse_command_line_option.py -t testfile
    option -t not recognized
    usage: python parse_command_line_option.py -i <inputfile> -o <outputfile>
       or: python parse_command_line_option.py --input=<inputfile> --output=<outputfile>
    

    argparse

    argparse模块是标准库中最大的模块之一,拥有大量的配置选项,这里只说明最常用、最基本的用法。argparse自带说明文档,用python filename.py -h或者python filename.py --help就可以查看使用说明,非常方便,不像getopt一样要自己写说明。推荐使用argparse模块解析命令行参数。

    ​ doc文档:https://docs.python.org/zh-cn/dev/library/argparse.html

    一个简单使用:

    #vim parse_command_line_option.py
    
    import argparse
    parser = argparse.ArgumentParser(description='Simple argparse test')
    parser.add_argument('-t', dest='test', metavar='test', action='store', help='test option')
    args = parser.parse_args()
    print(args.test)
    

    运行结果:

    $ python parse_command_line_option.py -h
    usage: parse_command_line_option.py [-h] [-t test]
    
    Simple argparse test
    
    optional arguments:
      -h, --help  show this help message and exit
      -t test     This is a test param
      
    $ python parse_command_line_option.py -t helloworld
    helloworld
    

    ​ argparse模块的使用只需要四步就行,

    1. 创建一个 ArgumentParser 实例

    2. 使用 add_argument() 方法声明想要支持的选项

    3. 使用parse_args()方法解析命令行参数

    4. 获取参数值

    ArgumentParser实例的description参数是一个描述文字,在说明中可以看到。ArgumentParser实例还有一些其他参数,但是不常用。

    add_argument()的参数说明:

    参数 说明
    name or flags 一个命名或者一个选项字符串的列表,例如 foo-f, --foo
    dest 解析结果被指派给属性的名字,即调用时候的名字。如果不指定,则会用第一个参数name or flags的名称。
    metavar 生成帮助信息,比如以上的[-t test]-t test中的test。如果没有metavar,会使用大写的dest参数。
    action 指定跟属性对应的处理逻辑, 通常的值为 store,存储参数的值,这个是默认的动作。
    nargs nargs 命名参数关联不同数目的命令行参数到单一动作。
    default 默认值,如果一个选项需要默认值,可以用default设置
    type 默认情况下,解析器会将命令行参数当作简单字符串读入。type默认是str,也可以指定为intfloat
    choices 表示受限制的参数值。可以是一个list对象、set对象等。
    required 默认required=False,可以用required=True表示必选参数
    help 参数简短描述的字符串

    一些参数的详细说明

    name or flags

    add_argument()方法必须知道它是否是一个选项,例如 -f--foo,或是一个位置参数,例如一组文件名。第一个传递给 add_argument() 的参数必须是一系列 flags 或者是一个简单的参数名。如果是位置参数,指定的属性就是它本身,不能再用dest指定。

    例子

    #vim parse_command_line_option.py
    
    import argparse
    
    parser = argparse.ArgumentParser(description='Name or flags test')
    parser.add_argument('-f', '--foo')
    # 不能这样写 parser.add_argument('bar', dest='bar_arg')
    parser.add_argument('bar')
    args = parser.parse_args()
    print(dir(args))
    print(args.foo)
    print(args.bar)
    

    运行结果

    $ python parse_command_line_option.py -f o1param o2param
    ['__class__', '__contains__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_get_args', '_get_kwargs', 'bar', 'foo']
    o1param
    o2param
    
    $ python parse_command_line_option.py --foo o1param o2param
    ['__class__', '__contains__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_get_args', '_get_kwargs', 'bar', 'foo']
    o1param
    o2param
    

    其中的bar是位置参数,是必须要传入的参数。

    action

    ArgumentParser对象将命令行参数与动作相关联。这些动作可以做与它们相关联的命令行参数的任何事,尽管大多数动作只是简单的向parse_args()返回的对象上添加属性。action命名参数指定了这个命令行参数应当如何处理。相应的动作有:

    'store'

    ​ 存储参数的值,这个是默认动作。

    'store_const'

    ​ 存储被const命名参数指定的值。选项的值会变成一个固定值。

    ​ 例子

    #vim parse_command_line_option.py
    
    import argparse
    
    parser = argparse.ArgumentParser(description='Store const test')
    parser.add_argument('--foo', action='store_const', const=42)
    args = parser.parse_args()
    print(args.foo)
    

    ​ 结果

    $ python parse_command_line_option.py --foo bar
    usage: parse_command_line_option.py [-h] [--foo]
    parse_command_line_option.py: error: unrecognized arguments: bar
    
    $ python parse_command_line_option.py --foo
    42
    

    如上,给--foo传参数会报错;foo的固定值变成了42

    'store_true' and 'store_false'

    ​ 这些是'store_const'分别用作存储TrueFalse值的特殊用例。它们的默认值对应的是FlaseTrue。比如一个选项--fooaction'store_true',如果运行时命令行没有指定--foo,则存储的值是False;如果运行时制定了--foo,则存储的值是True

    ​ 例子

    #vim parse_command_line_option.py
    
    import argparse
    parser = argparse.ArgumentParser(description='Store ture and false test')
    parser.add_argument('--foo', action='store_true')
    parser.add_argument('--bar', action='store_false')
    parser.add_argument('--baz', action='store_false')
    args = parser.parse_args()
    print(args.foo)
    print(args.bar)
    print(args.baz)
    

    ​ 结果

    $ python parse_command_line_option.py
    False
    True
    True
    
    $ python parse_command_line_option.py --foo --bar
    True
    False
    True
    

    如上,action='store_true'--foo,没有这个选项时存储的是False;有这个选项时存储的是True

    'append'

    ​ 存储一个列表,并且将每个参数值追加到列表中。在允许多次使用选项时很有用。

    ​ 例子

    #vim parse_command_line_option.py
    
    import argparse
    parser = argparse.ArgumentParser(description='Store append test')
    parser.add_argument('--foo', action='append')
    args = parser.parse_args()
    print(args.foo)
    

    ​ 结果

    $ python parse_command_line_option.py --foo o1param
    ['o1param']
    
    $ python parse_command_line_option.py --foo o1param --foo o2param
    ['o1param', 'o2param']
    

    nargs

    ArgumentParser 对象通常关联一个单独的命令行参数到一个单独的被执行的动作。 nargs 命名参数关联不同数目的命令行参数到单一动作。可以思考一下和actionappend的区别。支持的值有:

    N(一个整数)

    ​ 例子

    #vim parse_command_line_option.py
    
    import argparse
    parser = argparse.ArgumentParser(description='nargs test')
    parser.add_argument('--foo', nargs=2)
    parser.add_argument('--bar', nargs=1)
    args = parser.parse_args()
    print(args.foo)
    print(args.bar)
    

    ​ 结果

    $ python parse_command_line_option.py --foo o1param o2param --bar o3param
    ['o1param', 'o2param']
    ['o3param']
    
    '?'

    ​ 表示有或者没有选项的值。

    ​ 例子

    #vim parse_command_line_option.py
    
    import argparse
    parser = argparse.ArgumentParser(description='nargs test')
    parser.add_argument('--foo', nargs='?')
    args = parser.parse_args()
    print(args.foo)
    

    ​ 结果

    $ python parse_command_line_option.py --foo
    None
    
    $ python parse_command_line_option.py --foo o1param
    o1param
    
    '*'

    ​ 表示0个或者大于0个。

    ​ 例子

    #vim parse_command_line_option.py
    
    import argparse
    parser = argparse.ArgumentParser(description='nargs test')
    parser.add_argument('--foo', nargs='*')
    args = parser.parse_args()
    print(args.foo)
    

    ​ 结果

    $ python parse_command_line_option.py 
    None
    
    $ python parse_command_line_option.py --foo 
    []
    
    $ python parse_command_line_option.py --foo o1param
    ['o1param']
    
    $ python parse_command_line_option.py --foo o1param o2param
    ['o1param', 'o2param']
    
    '+'

    ​ 表示大于等于一个。其实'?''*''+'和正则表达式意义差不多。

    choices

    ​ 从choices选项中指定参数的值。

    ​ 例子

    #vim parse_command_line_option.py
    
    import argparse
    parser = argparse.ArgumentParser(description='choices test')
    parser.add_argument('--foo', choices=['o1param', 'o2param', 'o3param'], default='o3param')
    args = parser.parse_args()
    print(args.foo)
    

    ​ 结果

    $ python parse_command_line_option.py
    o3param
    
    $ python parse_command_line_option.py --foo test_param
    usage: parse_command_line_option.py [-h] [--foo {o1param,o2param,o3param}]
    parse_command_line_option.py: error: argument --foo: invalid choice: 'test_param' (choose from 'o1param', 'o2param', 'o3param')
    
    $ python parse_command_line_option.py --foo o2param
    o2param
    

    如上,default表示默认值;如果输入一个不是choices的值会报错。

  • 相关阅读:
    Codeforces 903F Clear the Matrix
    Codeforces 899D Shovel Sale
    Codeforces 898E Squares and not squares
    Codeforces 899B Months and Years
    Codeforces 854B Maxim Buys an Apartment:贪心
    BZOJ 1198 [HNOI2006]军机调度:dfs
    BZOJ 1196 [HNOI2006]公路修建问题:二分 + 贪心生成树check(类似kruskal)
    BZOJ 1193 [HNOI2006]马步距离:大范围贪心 小范围暴搜
    BZOJ 1192 [HNOI2006]鬼谷子的钱袋:二进制 砝码称重问题
    BZOJ 1191 [HNOI2006]超级英雄Hero:二分图匹配 匈牙利算法
  • 原文地址:https://www.cnblogs.com/shengmading/p/14481564.html
Copyright © 2011-2022 走看看