1、Python库学习之argparse模块

基本简介

模块详解:argparse模块用于参数较多且类型不一致时的比较有用,功能强大;
基本用法:
step1:建立ArgumentParser 参数解析器对象;
step2:调用ArgumentParser对象的add_argument()方法指定要从命令行获取哪些参数以及为每个参数指定要进行的类型设置、action动作等;
step3:调用ArgumentParser对象的parse_args()方法进行参数的解析,也就是通过sys.argv获取从命令行的参数,返回一个带有这些命令参数的Namespace;

step1、argparse模块:创建对象

parse_example = argparse.ArgumentParser(description = "This is from CommandLine!")

创建ArgumentParser对象的方法,其包含以下参数

  1. prog参数,用于指定显示在help帮助文档当中程序的名字;默认情况下,ArgumentParser 对象使用 sys.argv[0] 来确定如何在帮助消息中显示程序名称;
    一般是.py程序的名字,可通过prog参数进行指定;
    重新命名前,默认情况下就有一个命令行参数–help,无需定义
import argparse
parser = argparse.ArgumentParser()
parser.print_help()
运行结果如下

在这里插入图片描述
显然,在usage行中显示的程序名为默认情况下的文件名,修改prog参数来改变其程序名,如下:

import argparse
parser = argparse.ArgumentParser(prog = "changed_by_prog")
parser.add_argument("--other",help = "It's optional argument of %(prog)s!")
parser.print_help()
运行结果如下,相比上边的结果,程序名发生了变化;另外,新加的命令行参数–other的帮助说明也引用了该参数,引用格式为**%(prog)s**

在这里插入图片描述

  1. usage参数,描述程序用途的字符串,在默认情况下会将其所定义的包含的参数作为字符串来构建该用法消息;
    默认情况代码如下:
import argparse
parser = argparse.ArgumentParser(prog = "changed_by_prog")
parser.add_argument("--other",nargs = "?",help = "It's optional argument of %(prog)s!")
parser.add_argument("--foo",nargs = "+",help = "foo args for %(prog)s")
parser.print_help()
运行结果如下

在这里插入图片描述
更改参数为相应字符串会覆盖默认取值(由prog参数指定的程序名同样会被覆盖),可以使用上述%(prog)s参数将该指定的程序名带入到usage的字符串中。

import argparse
parser = argparse.ArgumentParser(prog = "changed_by_prog",usage = "It's usage description message for %(prog)s!")
parser.add_argument("--other",nargs = "?",help = "It's optional argument of %(prog)s!")
parser.add_argument("--foo",nargs = "+",help = "foo args for %(prog)s")
parser.print_help()
运行结果如下:

在这里插入图片描述

  1. description参数,指定在参数帮助文档之前显示的文本(默认值:无)
import argparse
parser = argparse.ArgumentParser(prog = "changed_by_prog",
                      usage = "It's usage description message for %(prog)s!",
                      description = "This is detail information of the program to show what the program can do and how!")
parser.print_help()
如上述几个例子,description部分的描述字段默认是空,该例子添加了该描述,结果如下

在这里插入图片描述

  1. epilog参数,在参数帮助文档(description参数指定的文本部分,以及各个命令行参数解释帮助文档)之后进行额外显示的文本(默认值:无)
示例如下:

在这里插入图片描述

  1. parents参数,也即指定一个由ArgumentParser对象构成的列表,表明当前定义的这个ArgumentParser对象的命令参数可以由这些列表中的父对象的所有命令行参数进行定义继承,也就是说自动从这些父对象当中收集了所有位置和可选的行为,将其加给目前构建的对象;
    同时,大多数父解析器会指定一个add_help = false参数,来抑制出现多个-h/–help选项;
import argparse
parent_parser = argparse.ArgumentParser(add_help = False)
parent_parser.add_argument("--parent",type = int,help = "From the parent!")
child_parser = argparse.ArgumentParser(prog = "inherent_from_parent",
                                   usage = "It's usage description message for %(prog)s!",
                                   parents = [parent_parser])
child_parser.add_argument("--other",help = "It's optional argument of %(prog)s!")
child_parser.add_argument("--foo",help = "foo args for %(prog)s")
print(child_parser.parse_args(["--parent","200","--other","O_t","--foo","child_foo"]))
结果示例如下:

在这里插入图片描述

  1. formatter_class参数,用以指定/自定义帮助信息(帮助文档)的显示格式,目前可取4种格式,参考库文档 https://docs.python.org/zh-cn/3/library/argparse.html#namespace
  2. prefix_chars参数,用于指定参数命令的前缀符号,默认为“-”,即-f/–foo;如果需要支持不同的字符,如+号,可由该参数指定;
  3. fromfile_prefix_chars参数,用于指定从文件中读取参数时,在文件名(文件路径)前所加的前缀标识;
    与其他混合输入的,或者单纯命令参数输入的参数进行区分,其示例如下,默认取值为“None”即表示不将参数作为文件对待:
import argparse
parent_parser = argparse.ArgumentParser(add_help = False)
parent_parser.add_argument("--parent",type = int,help = "From the parent!")
child_parser = argparse.ArgumentParser(prog = "inherent_from_parent",
                                       usage = "It's usage description message for %(prog)s!",
                                       parents = [parent_parser],
                                       fromfile_prefix_chars = "@")
child_parser.add_argument("--other",help = "It's optional argument of %(prog)s!")
child_parser.add_argument("--foo",help = "foo args for %(prog)s")
child_parser.add_argument("bar",help = "bar argument!")
with open("args.txt",mode="w") as file:
    file.write("--foo\nFoofoo\n--other\n3430\nBBB\n--parent\n345")
args = child_parser.parse_args(["--f","foo1","@args.txt"])
print(args)
需要注意的是上述结果中,首先指定了–foo为foo1,而在文件中又重新赋值定义了一下,文件中的参数会对之前的参数进行覆盖;
同时需要注意的是,这些命令参数与取值必须是分行的,即如文件中的\n换行符,必须一个参数/取值为单独一行;
  1. argument_default参数,用以指定设置是否要阻止使用参数的默认参数值;
  2. allow_abbrev参数,即是否允许参数缩写(书写不完整),如上述定义中是–foo,而进行参数解析时–f是同样被识别的,默认允许;
  3. conflict_handler参数,即当有两个相同的命令参数时吗,如何对这种冲突进行处理;
    一般情况是通过parent进行父解析器继承了一个相同名称的命令参数,而新的解析器对应的重名参数可能需要定义不同的行为;
    当取值为“resolve”时,可以对旧方法进行重写;
  4. add_help参数,主要控制是否在“optional arguments”部分将-h/–help的帮助信息添加;如果设置为False,则不打印该信息,且–help参数不可用
import argparse
p1 = argparse.ArgumentParser(add_help = False)
p1.print_help()
p2 = argparse.ArgumentParser()
p2.print_help()

在这里插入图片描述

step2、调用add_argument()方法定义单个的命令行参数应当如何解析,主要通过以下诸多参数对该命令行参数进行各方面的描述

首先,需要明确的是,每条命令行参数都需要单独调用一个add_argument()方法进行定义,方法函数中的不同参数从不同方面对该命令行参数进行了定义描述,
具体参数如下:

  1. name or flags参数:一个选项的命名字符或者一个选项字符串的列表,例如 foo 或 -f, --foo;
    这里需要做一个区分,–foo与foo的定义区别:
    ++ 带特定前缀(默认为*-*)属于可选参数,在传入参数值时必须以–foo或者其简写-f来引导参数值;
    ++ 而foo则是位置参数,是按照参数的位置顺序,将传入的参数依次传入的,一般是必须有参数值传入的,不能使用命令参数引导;
import argparse
args_add = argparse.ArgumentParser(prog = "test_for_add_argument",
                                  usage = "OK,this is first part of the output in the command line program %(prog)s!",
                                  description = "This is the second part!",
                                  epilog= "This is the extra information in the end of the program!")
args_add.add_argument("location1",help = "This is the third part which tells you the posi arguments' information!")
args_add.add_argument("location2",nargs = "*",help = "Me too!")
args_add.add_argument("--first","-f",help = "This is optional arguments!")
print(args_add.parse_args(["which","one"]))
print(args_add.parse_args(["which","-f","for_foo"]))
args_add.print_help()

在这里插入图片描述

如结果所示,对于位置参数,我们不需要指定参数值传递的对象,按顺序放入即会被相应位置的参数项获取;而对于带前缀选项的参数,必须使用前缀引导传递
  1. action参数:当参数在命令行中出现时使用的动作基本类型,即对于某个命令参数,当其从命令行传入时会按照这种action设置执行相应的动作;
    在一般情况下,大多数动作都是简单的将这些参数值作为属性添加到由解析函数parse_args()返回的对象上;
    其相应取值如下:
    store(默认):存储参数值
    store_const:使用该字符串选项时,为该参数存储由const参数指定的值;
    store_true:使用该字符串选项时(传入了相应参数时),参数值取值为True,此时无需传入参数;
    store_false:使用该字符串选项时,参数值置为False;
    append:同一个命令行中多次使用该字符串选项时,以追加的方式将值添加到list中;
    append_const:将多个字符串选项的const值合并到一个list;
    count:统计选项出现的次数 (如:"-vvv",则最终值为3)
    help:parser默认会添加一个help action。(一般不用理会)
    version:打印版本信息,其配合一个version = "被打印的信息"参数进行使用
import argparse
args_add = argparse.ArgumentParser(prog = "test_for_add_argument",
                                  usage = "OK,this is first part of the output in the command line program %(prog)s!",
                                  description = "This is the second part!",
                                  epilog= "This is the extra information in the end of the program!")
args_add.add_argument("location1",help = "This is the third part which tells you the posi arguments' information!")
args_add.add_argument("location2",nargs = "*",help = "me,too!",default="I'm positional arguments")
args_add.add_argument("--first","-f",action = "store_true")
args_add.add_argument("--second","-s",action = "store_false")
args_add.add_argument("get_const",action = "store_const",const = 1000,default="None")
args_add.add_argument("--ap1",action = "append",default=["ok_1"])
args_add.add_argument("--ap2",action="append_const",const = "000")
args_add.add_argument("--countt","-c",action = "count")
print(args_add.parse_args(["--ap1","one","--ap2","two","--ap1","three","-ccccc"]))
print(args_add.parse_args(["which","-f"]))

在这里插入图片描述

  1. const参数:主要用于保存不从命令行中读取,但被各种一些action参数和nargs参数所需求的常数;
  2. default参数:当参数未在命令行中出现时使用的值,其往往配合参数action和nargs使用;
  3. nargs参数:命令行参数需要消耗的数目(如–foo这个参数后跟了几个值,应该取几个值存储在这个参数中);
    ArgumentParser对象通常关联一个单独的命令行参数到一个单独的被执行的动作;
    而nargs命名参数则可以关联不同数目的命令行参数到同一个单一的动作;
    当nargs=1 会产生一个单元素列表,而nargs=2则会将两个参数存为一个列表赋值给相应参数,如下示例;
    取值为“?”时,表示如果输入了–foo选项,会从命令行中消耗一个参数,并产生一个单一项;
    如果当前没有命令行参数(连-foo也没有),则会为该命令参数项赋值为default值;
    而如果只输入了-foo选项而没有跟相应参数,则会为其赋值const参数值;
    取值为“”时,表示当前选项后跟随的所有命令行参数都会被聚集到一个列表中;
    取值为“+”时,功能基本与“
    ”类似,区别在于如果当前一个命令行参数也没有时会产生一个错误信息;
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', nargs = 2)
parser.add_argument('bar', nargs = 1)
parser.parse_args('c --foo a b'.split())
parser.add_argument("--teststar",nargs = "?",default = "I'm default value!",const= 'constant_value')
parser.add_argument("just_default",nargs=1,default = 200,type = int)
parser.parse_args(["bar","45","--teststar"])

在这里插入图片描述

需要注意的是,指定位置参数时无需命令参数引导,直接按照顺序传入相应取值即可;同时,所有传递的参数都应该是字符,哪怕要转换为数字,指定type = int,其输入也必须为字符
  1. type参数:命令行参数应当被转换成的类型(在默认情况下输入的都要求是字符,如["-f",20]这种就是错误的,需要改为["-f",“20”]);
    另外,需要注意的是,其可接受任意的可被调用的对象,比如定义一个函数,要求这个对象/函数以单个字符串为输入,输出一个转换后的值
  2. choices参数:指示命令行参数应该从一组受限值(指定值)中选择,在参数传入后,会先经过type转换,再与choices检查比较,如果不在指定值范围内则报错;
    这里choices的形式,可以是list列表、set对象,或者自定义的container容器对象;
  3. required参数:表示该命令行选项是必须指定参数输入,还是可以省略,一般默认是可以省略;
    该参数仅针对带前缀的可选参数,位置参数的定义不可用;
  4. help参数:一个此选项作用的简单描述;
def trans2upper(str1):
    if str1.isalpha():
        return str1.upper()
    else:
        str2 = "".join([e for e in str1 if e.isalpha()])
        return str2.upper()
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo',nargs = 2,required=True)
parser.add_argument('bar',nargs = 1,help = "This is a position argument!")
parser.parse_args('c --foo a b'.split())
parser.add_argument("--teststar",nargs = "?",default = "I'm default value!",const= 'constant_value')
parser.add_argument("just_default",nargs = 1,default = 200,type = int,choices=range(100,300))
parser.add_argument("--testtype",nargs = 1,type  = trans2upper,default = "UPPER")
parser.parse_args(["bar","145","--teststar","--foo","f_1","f_2","--testtype","trans22str"])

在这里插入图片描述

  1. metavar参数:在使用方法消息(即帮助消息的第一部分默认情况下,或者position arguments/optional arguments部分)中所展示的“形式上的参数值”;
    即以某种方式来显示/引用预期会输入的参数值:
    对于可选参数,默认情况下是以命令参数的dest值作为name,以其去掉前缀的大写字母作为要展示的预期值;
    对于位置参数而言,则是直接以dest值简略展示,不存在[name = dest]的形式;
    默认情况下,dest值即所命名的参数名;
  2. dest参数:被添加到 parse_args() 所返回对象上的属性名;
    因为经过调用解析器parse_arg()方法之后,会返回一个namespace对象,这些通过add_argument()方法定义的这些命令参数会作为该对象的属性添加到对象上;
    这里就牵扯到属性名的问题:
    对于位置参数,其dest值是由add_argument的第一个参数所确定的,无法通过dest参数指定;
    对于可选参数,其dest通常取自可选参数字符串,一般通过接受第一个长选项字符串并去掉开头的 – 字符串来生成 dest 的值;
    若没有长选项字符串,则将短选项字符串去掉 - 作为dest值;
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--optional",help  = "This is a optional argument!")
parser.add_argument("position",help = "This is a position argument!")
parser.print_help()
parser.add_argument("--opt2",help = "Just test for metavar!",metavar = "P2xxx")
parser.print_help()
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("position",help = "This is a position argument!")
parser.add_argument("--optional",help  = "This is a optional argument!",dest="opt1")
parser.parse_args("position_argument --optional optional_argument".split())

在这里插入图片描述

step3、使用parse_args()方法进行参数解析,

详细见文档说明
https://docs.python.org/zh-cn/3/library/argparse.html#the-add-argument-method

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值