美文网首页
Python命令行参数解析模块argparse

Python命令行参数解析模块argparse

作者: markict | 来源:发表于2018-09-18 14:23 被阅读0次

    argparse模块

    基本用法

    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argment('-v', '--Verbose', help='Help Text', type=str, action='store', ...)
    args = parser.parse_args()
    
    print(args.v)
    
    

    ArgumentParser类的常用参数

    • prog: 程序的名称(默认是: sys.argv[0])
    • usage: 程序使用方法说明 (默认由自动生成)
    • description: 程序的介绍
    • epilog: 程序的补充介绍, 该文字在参数介绍后边
    • prefix_chars: 定义optional参数的前缀,默认是'-'和'--', 如果我们设置 prefix_char='-+', 那么我们可以定义以'+'或'++'为前缀的optional参数.
    • allow_abbrev: 允许对长可选参数进行缩写(默认值), 例如:你定义了'--verbose',那么在CLI中--ver等价于--verbose, 可以通过设置allow_abbrev=False禁用缩写.

    add_argument()方法

    该方法是用来向ArgumentParser类对象中加入参数的, 加入的参数可以是位置参数可以是 可选参数 也可以是标记

    add_argument()的参数包括:

    > name or flags - Either a name or a list of option strings, e.g. foo or -f, --foo.
    > action - The basic type of action to be taken when this argument is encountered at the command line.
    > nargs - The number of command-line arguments that should be consumed.
    > const - A constant value required by some action and nargs selections.
    > default - The value produced if the argument is absent from the command line.
    > type - The type to which the command-line argument should be converted.
    > choices - A container of the allowable values for the argument.
    > required - Whether or not the command-line option may be omitted (optionals only).
    > help - A brief description of what the argument does.
    > metavar - A name for the argument in usage messages.
    > dest - The name of the attribute to be added to the object returned by parse_args().
    
    

    Name or Flags

    位置参数(positional arguments)

    代码示例

    parser.add_argument('hostname', help='server host name', type=str)
    

    可选参数(optional arguments)

    代码示例

    parser.add_argument('-p', '--port', help='the port number', type=int)
    

    Action

    • store
      这是默认值, 仅仅是把可选参数的值进行存储

      import argparse
      
      parser = argparse.ArgumentParser()
      parser.add_argument('-a', '--address', help='server address',   type=str, action='store')
      args = parser.parse_args()
      print(args.address)
      
      OUTPUT:
      [LiangZhang@MacBook test]$python3 arguments.py  -a 19.1.1.1
      19.1.1.1
      
    • store_const
      这个action通常配合const参数一起使用,为可选参数设置默认值,把可选参数作为标记使用.

      import argparse
      
      parser = argparse.ArgumentParser()
      parser.add_argument('-t', '--test', help='test store_const  action', action='store_const', const=80)
      args = parser.parse_args()
      print(args.test)
      
      OUTPUT:
      [LiangZhang@MacBook test]$python3 arguments.py  -t 
      80
      
    • store_true | store_false
      这两个action和'store_const'类似, 不过不需要配合const参数, store_true就是为指定可选参数设置True, store_false就是为指定的可选参数设置False

      import argparse  
      
      parser = argparse.ArgumentParser()  
      parser.add_argument('-p','--passed', help='passed the exam or not',     action='store_true')  
      parser.add_argument('-f', '--fail', help='fail in the exam or not',     action='store_false')  
      args = parser.parse_args()  
      print(args.passed, args.fail)  
      
      OUTPUT:  
      [LiangZhang@MacBook test]$python3 arguments.py   
      False True  
      [LiangZhang@MacBook test]$python3 arguments.py -p -f  
      True False  
      [LiangZhang@MacBook test]$python3 arguments.py -p   
      True True  
      [LiangZhang@MacBook test]$python3 arguments.py  -f  
      False False  
      
    • append
      这个参数主要用于同一个可选参数使用多次时, 可以把这些参数的值放入一个列表.

      import argparse
      
      parser = argparse.ArgumentParser()
      parser.add_argument('-p','--port', help='ports', type=int,  action='append')
      args = parser.parse_args()
      print(args.port)
      
      OUTPUT:
      [LiangZhang@MacBook test]$python3 arguments.py   -p 21 -p 23 -p 80
      [21, 23, 80]
      
      
    • append_const
      这个action的作用是 把多个具有默认值的可选标记的值存放到一个列表

      import argparse
      
      parser = argparse.ArgumentParser()
      parser.add_argument('-w','--web',  dest='var_list',     action='append_const', const=80)
      parser.add_argument('-t', '--telent', dest='var_list',  action='append_const', const=21)  #参数dest指定所追加的参数值存入的列表名
      args = parser.parse_args()
      print(args.var_list)   #var_list容纳参数的列表名, 由dest=var_list定义
      
      OUTPUT:
      [LiangZhang@MacBook test]$python3 arguments.py   -t -w
      [21, 80]
      [LiangZhang@MacBook test]$python3 arguments.py   -tw
      [21, 80]
      [LiangZhang@MacBook test]$python3 arguments.py   -wt
      [80, 21]
      
      
    • count
      用于统计某一可选标记出现次数

      import argparse
      
      parser = argparse.ArgumentParser()
      parser.add_argument('-v', '--verbose', action='count')
      args = parser.parse_args()
      print(args.verbose)
      
      OUTPUT:
      [LiangZhang@MacBook test]$python3 arguments.py   -v
      1
      [LiangZhang@MacBook test]$python3 arguments.py   -vvv
      3
      [LiangZhang@MacBook test]$python3 arguments.py   -v -v
      2
      
      
    • version
      用于显示当前程序版本

      import argparse
      
      parser = argparse.ArgumentParser()
      parser.add_argument('-v', '--version', action='version', version='%(prog)s 2.0')
      args = parser.parse_args()
      print(args.version)
      
      OUTPUT:
      [LiangZhang@MacBook test]$python3 arguments.py   -v 
      arguments.py 2.0
      
      

    nargs

    用于指定某位置参数或可选参数能接受参数值的个数.

    • nargs=N (N为参数个数)

      import argparse
      
      parser = argparse.ArgumentParser()
      parser.add_argument('-p', '--ports', help='port list', nargs=3)
      parser.add_argument('-t', '--type', help='protocol type', nargs=2)
      parser.add_argument('host', help='host address', nargs=2)
      args = parser.parse_args()
      print(args.ports, args.type, args.host)
      
      OUTPUT:
      [LiangZhang@MacBook test]$python3 arguments.py   -p 23 22 53   -t tcp udp  192.168.1.1 www.baidu.com
      ['23', '22', '53'] ['tcp', 'udp'] ['192.168.1.1', 'www.baidu.com']
      
      
    • nargs='?' (只接收一个参数)

      • 当nargs为'?'时, 代表该位置参数或可选参数只接收一个参数值, 并且我们可以为位置参数设置默认值(default), 以及为可选参数设置默认值(default)常量值(const)

      • 默认值和常量值的区别: 对于可选参数, 默认值指的是未给出可选参数标记(如:-p)时,该参数的值, 而常量值指的是给出可选参数标记(如: -p),但未给出参数值时,该可选参数的值.

      • 注意: nargs=N时, 不可以为参数设置默认值和常量值, 所以nargs='?'是有意义的.

    ```python
    parser = argparse.ArgumentParser()
    parser.add_argument('host', nargs='?', default='www.cciex.com')
    parser.add_argument('--port', '-p', nargs='?', const=23, default=22)   #给出标记'-p' 不给值时 结果为'const',  如果 不给出标记'-p' 结果为'default'.  
    args = parser.parse_args()
    print(args.port,  args.host)
    
    OUTPUT:  
    [LiangZhang@MacBook test]$ python3 arguments.py    www.baidu.com   -p 88   
    88 www.baidu.com  
    [LiangZhang@MacBook test]$  
    [LiangZhang@MacBook test]$python3 arguments.py      -p    
    23 www.cciex.com  
    [LiangZhang@MacBook test]$  
    [LiangZhang@MacBook test]$python3 arguments.py         
    80 www.cciex.com  
    
    ```  
    
    
    **args='?' 的常用方式**  
    这个参数用法,经常被用于可选的文件输入和输出  
    
    ```python
    import argparse
    import sys
    
    parser = argparse.ArgumentParser()
    parser.add_argument('--infile', '-i', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
    parser.add_argument('--outfile', '-o', nargs='?', type=argparse.FileType('w'), default=sys.stdout)
    args = parser.parse_args()
    
    for line in args.infile:
        print(line)
        args.outfile.write(line)
    
    print('Done!')
    
    ------------
    OUTPUT:
    [LiangZhang@MacBook test]$python3 arguments.py 
    both of input and output are not given^_^    #这是从标准输入输入的测试字符
    both of input and output are not given^_^    #这是print()打印出的测试字符
    
    both of input and output are not given^_^    #这是从标准输出输出的测试字符
    Done!                                               # 使用Ctl+D 终止输入
    -------------
    
    OUTPUT:
    [LiangZhang@MacBook test]$python3 arguments.py  --outfile  test.txt   #给定输出文件参数
    this time --outfile has been specified ^_^   #这是从标准输入输入的测试字符    this time --outfile has been specified ^_^   #这是print()打印出的测试字符
    
    Done!                                               # 使用Ctl+D 终止输入
    
    [LiangZhang@MacBook test]$
    [LiangZhang@MacBook test]$cat test.txt    #使用cat查看输出文件
    this time --outfile has been specified ^_^    #输出文件内容等于输入
    
    ```
    
    • args='*' (接受所有参数)
      所有参数全部被接收,并存入一个列表. 为多个位置参数使用'args="*" 没有意义.
      如果没有给定任何参数值, 则返回空列表.

      import argparse
      import sys
      
      parser = argparse.ArgumentParser()
      parser.add_argument('-p', '--ports', nargs='*')
      parser.add_argument('host', nargs='*')
      args = parser.parse_args()
      print(args.host, args.ports)
      
      OUTPUT:
      [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com www.cciex.com  -p 23 22 80 
      ['www.baidu.com', 'www.cciex.com'] ['23', '22', '80']
      
      
    • args='+' (接受所有参数,要求至少有一个参数)
      如果没有给定任何参数值,则生成异常.

      import argparse
      import sys
      
      parser = argparse.ArgumentParser()
      parser.add_argument('-p', '--ports', nargs='+')
      parser.add_argument('host', nargs='*')
      args = parser.parse_args()
      print(args.host, args.ports)
      
      OUTPUT:
      [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com www.cciex.com  -p 23 80 443
      ['www.baidu.com', 'www.cciex.com'] ['23', '80', '443']
      [LiangZhang@MacBook test]$
      [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com www.cciex.com  -p  #不给定参数返回异常
      usage: arguments.py [-h] [-p PORTS [PORTS ...]] [host [host ...]]
      arguments.py: error: argument -p/--ports: expected at least one argument
      [LiangZhang@MacBook test]$
      [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com www.cciex.com    #不给定标记 返回None
      ['www.baidu.com', 'www.cciex.com'] None
      
      
    • args=argparse.REMAINDER (把剩余的参数放入一个列表)

      import argparse
      import sys
      
      parser = argparse.ArgumentParser()
      parser.add_argument('host', nargs=1, default='www.cciex.com')
      parser.add_argument('-p', '--ports', nargs='?', const=80, default=80)
      parser.add_argument('remains', nargs=argparse.REMAINDER)
      args = parser.parse_args()
      print(args.host, args.ports, args.remains)
      
      OUTPUT:
      [LiangZhang@MacBook test]$python3 arguments.py -p 443  www.baidu.com  admin root mark 
      ['www.baidu.com'] 443 ['admin', 'root', 'mark']
      
      %%注意:%% args=argparse.REMAINDER的'吞噬能力'很强, 所以在CLI中输入参数时, 不要把可选参数放在REMAINDER之前, 否则连同可选参数标记(-p)和可选参数值(例:443),全部会被认定为剩余参数. 
       
      OUTPUT2: 
      [LiangZhang@MacBook test]$python3 arguments.py   www.baidu.com   -p 443  admin root mark 
      ['www.baidu.com'] 80 ['-p', '443', 'admin', 'root', 'mark']
      
      
      

    const (参数常量)

    • 为可选参数设置参数常量值, 当在CLI中只给出了参数标记,但没有给出参数值时, 该常量为参数值, 代码样例见: Action章节的 'store_const' 和 'append_const'

    default (参数默认值)

    • 可以做为可选参数和位置参数的默认值, 当位置参数未给出,或是可选参数标记未给出, 那么参数值为默认值. 代码样例见: nargs='?' 等多处章节.

    type (规定参数类型)

    • 用于将CLI中输入的参数转换为指定的类型, 当类型无法转换时产生异常.

      parser.add_argument('-p', '--port', type=int)     #如果输入是非数字的字符,则产生异常
      
    • 也可以用于将输入的字符做出文件名,返回文件句柄. 样例: 见 args='?' 常用方法章节.

    • 也可以自定义类型转换函数.

       def perfect_square(string):     #用于测试一个参数是否能够被完全开平方
           value = int(string)            #转换输入为整型
           sqrt = math.sqrt(value)        #对输入开方
           if sqrt != int(sqrt):          #把平方根的值 和 int转换后的平方根对比, 如果一致说明平方根是整数, 原输入值可以被完全开方.
               msg = "%r is not a perfect square" % string
               raise argparse.ArgumentTypeError(msg)     #如果不能被完全开方, 那么生成异常.
           return value    #如果可以被完全开发, 返回转换为整型的原输入
      
       parser = argparse.ArgumentParser(prog='PROG')
       parser.add_argument('foo', type=perfect_square)
       
       parser.parse_args(['9'])   #模拟输入9, 测试OK
      Namespace(foo=9)
       parser.parse_args(['7'])  #模拟输入7, 返回异常
      usage: PROG [-h] foo
      PROG: error: argument foo: '7' is not a perfect square
      
      

    choices

    用于为位置参数或可选参数设限定一个范围.

        import argparse
        import sys
    
        parser = argparse.ArgumentParser()
        parser.add_argument('name', choices=['mark', 'Eric', 'Jonan'])
        parser.add_argument('-f', '--food', choices=['Jiaozi', 'rice'])
        args = parser.parse_args()
        print(args.name, args.food)
        
        OUTPUT: 
        [LiangZhang@MacBook test]$python3 arguments.py  mark -f Jiaozi
        mark Jiaozi
        
        [LiangZhang@MacBook test]$python3 arguments.py  mark -f shrimp      #参数不在给定范围时,会给出错误提示.
        usage: arguments.py [-h] [-f {Jiaozi,rice}] {mark,Eric,Jonan}
        arguments.py: error: argument -f/--food: invalid choice: 'shrimp' (choose from 'Jiaozi', 'rice')
    
    
    

    required

    通常来讲, 诸如-f或--foo 一般被视为可选参数, 在CLI中可以添加也可以不加, 可以通过设置required=True 来指定该可选参数为必选参数.

    parser = argparse.ArgumentParser()
    parser.add_argument('--foo', '-f', required=True)  #指定CLI中必须包含-f参数
    args = parser.parse_args()
    

    help

    对参数的一个功能描述, 当用户使用-h时, 会显示该描述.

    parser = argparse.ArgumentParser(prog='frobble')
    parser.add_argument('--foo', action='store_true', help='foo the bars before frobbling')
    
    

    metavar

    用于自定义帮助信息(-h得到的输出)中的位置参数和可选参数的参数值的展示样例.
    默认help输出中的位置参数的参数值示例直接使用位置参数名称, 可选参数的参数值样例则是把可选参数大写, 如下:

    parser = argparse.ArgumentParser()
    parser.add_argument('date', help='current date')
    parser.add_argument('-f', '--food', help='your favorite food')
    args = parser.parse_args()
    print(args.date, args.food)
    
    OUTPUT:
    
    [LiangZhang@MacBook test]$python3 arguments.py -h
    usage: arguments.py [-h] [-f FOOD] date         #输出中的FOOD是可选参数的大写形式, 'date'直接使用位置参数名.
    
    positional arguments:
      date                  current date
    
    optional arguments:
      -h, --help            show this help message and exit
      -f FOOD, --food FOOD  your favorite food
    
    

    使用metavar之后的代码:

    parser = argparse.ArgumentParser()
    parser.add_argument('date', help='current date', metavar='YY-MM-DD')
    parser.add_argument('-f', '--food', help='your favorite food', metavar='Food_Name')
    args = parser.parse_args()
    print(args.date, args.food)
    
    OUTPUT:
    [LiangZhang@MacBook test]$python3 arguments.py -h
    usage: arguments.py [-h] [-f Food_Name] YY-MM-DD     #Food_Name和YY-MM-DD均使用了自定义的示例名称
    
    positional arguments:
      YY-MM-DD              current date
    
    optional arguments:
      -h, --help            show this help message and exit
      -f Food_Name, --food Food_Name
                            your favorite food
    
    

    如果使用nargs参数后, 那么一个可选参数可能需要接受多个参数值, 这时我们可以为metavar传出一个元组, 为多个参数值设置示例名:

    parser = argparse.ArgumentParser(prog='PROG')
    parser.add_argument('-x', nargs=2)
    parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
    
    OUTPUT:
    usage: PROG [-h] [-x X X] [--foo bar baz]    #为--foo的两个参数值设置不同的示例名
    

    dest

    dest是一个argpars.ArgumentParser对象被解析以后, args引用参数值的变量名称.

    默认:

    • 位置参数的dest为位置参数的参数名
    • 可选参数的dest为:
    1. 合规长参数去掉前缀'--', 如: --foo的dest为foo
    2. 不合规长参(参数名包含'-')数去掉前缀'--', 并且把参数名中的'-'变为' _ ', 例如: --food-name的dest为food_name.
    3. 如果没有长参数, 那么短参数去掉前缀'-', 如: -p的dest为p

    例如:

    parser.add_argument('date', help='current date', metavar='YY-MM-DD')  #date为该参数的dest
    parser.add_argument('-f', '--food-name', help='your favorite food', metavar='FoodName')   #food_name为该参数的dest  
    args = parser.parse_args()
    print(args.date, args.food_name)   #date和food_name为 dest
    

    可以使用dest参数自己定义dest名称

    import argparse
    import sys
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-f', '--food', dest='snack', help='your favorite food',)   #snack为--food的dest名称
    args = parser.parse_args()
    print(args.snack)     #我们需要使用args.snack来引用参数--food的参数值. 
    
    

    相关文章

      网友评论

          本文标题:Python命令行参数解析模块argparse

          本文链接:https://www.haomeiwen.com/subject/mpgunftx.html