python argparse 要点

写个需要参数的python脚本时,这个argparse模块就是相当顺手的,已默认支持常用的参数书写形式。

比如:

parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('--foo')
parser.add_argument('-b','--bar')
# 那么下面的结果都是一样
# PROG --foo 2 --bar 3
parser.parse_args(['--foo','2', '--bar', '3'])
# PROG --fo 2 -b 3
parser.parse_args(['--fo','2', '-b', '3']) # 支持长参数只书写前面能区分出的部分即可,ArgumentParser的参数allow_abbrev=False可以关闭这个特性
# PROG --fo=2 -b=3
parser.parse_args(['--fo=2', '-b=3']) # 长短参数都可以使用等于号形式赋值
# PROG --foo=2 -b3
parser.parse_args(['--foo=2', '-b3']) # 短参数还支持连写形式

针对目的的一些简单做法

目的 做法(如未特别指明,参数是add_argument方法的参数)
虽未可选参数形式,但必须提供 required=True
默认值 default=DEFAULTVALUE
指定参数类型 type=TYPE,argparse会对参数做类型转换,转为你需要的类型,否则都是str类型
参数只能在限定值内选择值 choices=[CHOICES LIST]
一个参数要接受多个值 nargs=N,?,*,+,argparse.REMAINDER
N 须提供N个值,dest是个列表
? 最多小号一个值,dest为一个值,不是列表。
* 收集尽可能多的值到目标中,dest会是个列表。
+ 同*号,要求至少提供一个,dest是列表。
argparse.REMAINDER 所有其余的参数都放到这里。
符号用法和正则表达式一样。
参数不需要提供值,

比如–gui启动图形界面

action='store_true','store_false','store_const'
参数只要写出来就是要store的那个值,对于布尔值的话,不提供参数它就是另外一个值。
允许多次输入同一个参数,都保存下来 action='append'
都会被append到同一个目标列表中。dest也是个列表,即使只有一个,也是列表。
不同参数输入都存到一个变量里 action='append',然后dest指明是同一个。
文件参数解析后就是打开的文件 type='open',argparse.FileType('r'),argparse.FileType('w')
参数解析后就是打开的文件对象,后面还可以指定读写模式以及其他如编码等参数。
子命令 parser.add_subparsers方法添加子命令。想apt git等等都是有子命令的例子。这样就可以执行git checkout --help看子命令的帮助信息。

直接对参数提供个列表配置

import argparse

arguments = [
# long flags, dest, type, default, help
['--cfg', 'cfg', str, None, 'config  file (/path/to/config.yaml)'],
['--server', 'svr', str, 'http://192.168.1.1/', 'Server Address'],
]

def parse_args():
    """
    Parse input arguments
    """
    global arguments
    parser = argparse.ArgumentParser(description='run Test')
    parser.add_argument('--gui', action="store_true")
    for item in arguments:
        parser.add_argument(item[0], dest=item[1], type=item[2], default=item[3], help=item[4])

    args = parser.parse_args()
    return args

if __name__ == '__main__':
    args = parse_args()
    if args.gui:
        startgui()
    else:
        startcli()

发表评论

电子邮件地址不会被公开。 必填项已用*标注