Python命令行参数解析模块argparse

2018-09-18  本文已影响0人  markict

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类的常用参数

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

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 ^_^    #输出文件内容等于输入

```

const (参数常量)

default (参数默认值)

type (规定参数类型)

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引用参数值的变量名称.

默认:

  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的参数值. 

上一篇下一篇

猜你喜欢

热点阅读