argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块。argparse模块的作用是用于解析命令行参数,程序只需定义好它要求的参数,然后argparse将负责如何从sys.argv中解析出这些参数。argparse模块还会自动生成帮助和使用信息并且当用户赋给程序非法的参数时产生错误信息。

python test.py -c -i input.txt -o output.txt --user=name --port=8080      # argparse负责解析参数“-c -i input.txt -o output.txt --user=name --port=8080”

 

使用步骤:


 

1. 导入argparse模块

import argparse #导入该模块  or  from argparse import ArgumentParser

2. 创建一个解析对象parser,并告诉解析对象将会有些什么参数. 当程序运行时,该解析器就可以用于处理命令行参数。解析器类是 ArgumentParser, ArgumentParser对象会保存把命令行解析成Python数据类型所需要的所有信息。

parser = argparse.ArgumentParser()  

ArgumentParser(prog=None, usage=None,description=None, epilog=None, parents=[],formatter_class=argparse.HelpFormatter, prefix_chars='-',fromfile_prefix_chars=None, argument_default=None,conflict_handler='error', add_help=True)

这些参数都有默认值,当调用parser.print_help()或者运行程序时由于参数不正确(此时python解释器其实也是调用了pring_help()方法)时,会打印这些描述信息,一般只需要传递description参数,如上。

prog : 程序的名字(默认:sys.argv[0])
useage : 描述程序用法的字符串(默认:从解析器的参数生成)
description - 参数帮助信息之前的文本(默认:空)
epilog: 参数帮助信息之后的文本(默认:空)
parents : ArgmentParser 对象的一个列表,这些对象的参数应该包括进去
ormatter_class : 定制化帮助信息的类
prefix_chars : 可选参数的前缀字符集(默认:‘-‘)
fromfile_prefix_chars : 额外的参数应该读取的文件的前缀字符集(默认:None)
argument_default : 参数的全局默认值(默认:None)
conflict_handler : 解决冲突的可选参数的策略(通常没有必要)
add_help : 给解析器添加-h/–help 选项(默认:True)

3. 调用方法add_argument()向该对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项

parser.add_argument() 

add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

name or flags:命令行参数名或者选项,如上面的address或者-p,--port.其中命令行参数如果没给定,且没有设置defualt,则出错。但是如果是选项的话,则设置为None
action : 在命令行遇到该参数时采取的基本动作类型。
const: 某些action和nargs选项要求的常数值。
nargs:命令行参数的个数,一般使用通配符表示,其中,'?'表示只用一个,'*'表示0到多个,'+'表示至少一个
default:默认值。如果命令行中没有出现该参数时的默认值。
type:命令行参数应该被转换成的类型。默认是字符串string类型,还有float、int等类型
choices : 参数可允许的值的一个容器。
required : 该命令行选项是否可以省略(只针对可选参数)。
help:参数的简短描述。和ArgumentParser方法中的参数作用相似,出现的场合也一致
metavar : 参数在帮助信息中的名字。
dest : 给parse_args()返回的对象要添加的属性名称。

通过调用add_argument()方法向ArgumentParser添加程序的参数信息。这些信息告诉ArgumentParser如何接收命令行上的字符串并将它们转换成对象。这些信息被保存下来并在调用parse_args()时用到。即参数可以触发不同的动作,动作由 add_argument() 方法的 action 参数指定。 支持的动作包括保存参数(逐个地,或者作为列表的一部分),当解析到某参数时保存一个常量值(包括对布尔开关真/假值的特殊处理),统计某个参数出现的次数,以及调用一个回调函数。默认的动作是保存参数值。

如果提供 dest 参数,参数值就保存为命令行参数解析时返回的命名空间对象中名为该 dest 参数值的一个属性。

默认情况下,ArgumentParser 对象使用 dest 值作为每个对象的 "name"。dest 允许提供自定义属性名称, 对于位置参数动作,dest 通常会作为add_argument() 的第一个参数提供,

 对于可选参数动作,dest 的值通常取自选项字符串。 ArgumentParser 会通过接受第一个长选项字符串并去掉开头的 -- 字符串来生成 dest 的值。 如果没有提供长选项字符串,则 dest 将通过接受第一个短选项字符串并去掉开头的 - 字符来获得。 任何内部的 '- '字符都将被转换为 '_' 字符以确保字符串是有效的属性名称。 默认情况下,对于位置参数动作,dest 值将被直接使用,而对于可选参数动作,dest 值将被转为大写形式。如果非要改成小写可以使用 metavar 来指定一个替代名称。 metavar 仅改变 显示的 名称 - parse_args() 对象的属性名称仍然会由 dest 值确定。注意:不同的 nargs 值可能导致 metavar 被多次使用。如果提供dest,例如dest=“XXXXXXXXX”,那么可以通过args.XXXXXXXXX访问该参数,metavar 则不行。
parser = argparse.ArgumentParser()
parser.add_argument('bar')
parser.parse_args(['XXX'])    #Namespace(bar='XXX')

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--foo-bar', '--foo')
parser.add_argument('-x', '-y')
parser.parse_args('-f 1 -x 2'.split())              #Namespace(foo_bar='1', x='2')
parser.parse_args('--foo 1 -y 2'.split())         #Namespace(foo_bar='1', x='2')

parser = argparse.ArgumentParser()
parser.add_argument('--foo', dest='bar')
parser.parse_args('--foo XXX'.split())     #Namespace(bar='XXX')

parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-x', nargs=2)
parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
parser.print_help()
#usage: PROG [-h] [-x X X] [--foo bar baz] #options: # -h, --help show this help message and exit # -x X X # --foo bar baz

argparse将所有参数值都看作是字符串,除非你告诉它将字符串转换成另一种数据类型。add_argument()type参数以一个转换函数作为值,被ArgumentParser用来将参数值从一个字符串转换成另一种数据类型。

argparse内置6种action动作可以在解析到一个参数时进行触发:

store :保存参数值,可能会先将参数值转换成另一个数据类型。若没有显式指定动作,则默认为该动作。
store_const :保存一个被定义为参数规格一部分的值,而不是一个来自参数解析而来的值。这通常用于实现非布尔值的命令行标记。
store_ture/store_false: 保存相应的布尔值。这两个动作被用于实现布尔开关。
append: 将值保存到一个列表中。若参数重复出现,则保存多个值。
append_const: 将一个定义在参数规格中的值保存到一个列表中。
version :打印关于程序的版本信息,然后退出

ArgumentParser 还可以支持 sub-commands的方法。当一个程序能执行需要多组不同种类命令行参数时,这种拆分功能的方式是一个非常好的主意。 ArgumentParser 通过 add_subparsers() 方法支持创建这样的子命令。

ArgumentParser.add_subparsers([title][, description][, prog][, parser_class][, action][, option_string][, dest][, required][, help][, metavar])

add_subparsers() 方法通常不带参数地调用并返回一个特殊的动作对象。 这种对象只有一个方法 add_parser(),它接受一个命令名称和任意多个 ArgumentParser 构造器参数,并返回一个可以通常方式进行修改的 ArgumentParser 对象。

4. 调用parse_args()方法进行解析;解析成功之后即可使用

parser.parse_args()

 ArgumentParser通过parse_args()方法解析参数。给parse_args() 传递一组参数字符串来解析命令行。默认情况下,参数是从 sys.argv[1:] 中获取,但你也可以传递自己的参数列表。它将检查命令行,把每个参数转换成恰当的类型并采取恰当的动作。在大部分情况下,这意味着将从命令行中解析出来的属性建立一个简单的 Namespace对象。选项是使用GNU/POSIX语法来处理的,所以在序列中选项和参数值可以混合。parse_args() 的返回值是一个命名空间,包含传递给命令的参数。该对象将参数保存其属性,因此如果你的参数 dest 是 "myoption",那么你就可以args.myoption 来访问该值。

 参考链接:

https://docs.python.org/zh-cn/3/library/argparse.html#dest

https://docs.python.org/3/library/argparse.html#other-utilities

https://www.cnblogs.com/lovemyspring/p/3214598.html

posted on 2019-04-17 15:33  小虾米与大鱼  阅读(775)  评论(0编辑  收藏  举报