Python命令行参数解析模块argparse

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容