Python中argparse模块的使用

argparse模块

argparse 模块的作用:直接使用命令行与python进行交互, 是用来处理命令行参数的库。(不需要安装,直接调用 )

argparse 使用简化成四个步骤:

1:import argparse
2:parser = argparse.ArgumentParser()
3:parser.add_argument()
4:args=parser.parse_args()

上面四个步骤解释如下:首先导入该模块;然后创建一个解析对象;然后向该对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项;最后调用parse_args()方法进行解析;解析成功之后即可使用。

实例:

import argparse

parser = argparse.ArgumentParser(description='命令行中传入一个数字')
#type是要传入的参数的数据类型  help是该参数的提示信息
parser.add_argument('integers', type=str, help='传入的数字')

args = parser.parse_args()

#获得传入的参数
print(args)

在这个代码中,我们在命令行传入一个数字。

然后再命令行中输入python demo.py -h或者python demo.py --help:

python demo.py -h 

在命令行中看到demo.py的运行结果如下:

usage: demo.py [-h] integers

命令行中传入数字

positional arguments:
  integers    传入的数字

optional arguments:
  -h, --help  show this help message and exit

现在我们在命令行中给demo.py 传入一个参数10:

python demo.py 10

运行,得到的运行结果是:

Namespace(integers='10')

操作args字典

其实得到的这个结果Namespace(integers=‘5’)是一种类似于python字典的数据类型。

我们可以使用 arg.参数名来提取这个参数:

import argparse

parser = argparse.ArgumentParser(description='命令行中传入一个数字')
#type是要传入的参数的数据类型  help是该参数的提示信息
parser.add_argument('integers', type=str, help='传入的数字')

args = parser.parse_args()

#获得integers参数
print(args.integers)

在命令行中运行python demo.py 10, 运行结果为:

10

传入多个参数

现在在命令行中给demo.py 传入多个参数,例如传入3,5,7,9四个数字:

python demo.py 3,5,7,9

运行报错:

usage: demo.py [-h] integers 
demo.py: error: unrecognized arguments: 5,7,9

不能识别5,7,9,看源代码我们知道integers这个参数是位置参数,说明第一个数3是能识别。这里我们需要重新更改demo.py代码:

import argparse

parser = argparse.ArgumentParser(description='命令行中传入一个数字')
parser.add_argument('integers', type=str, nargs='+',help='传入的数字')
args = parser.parse_args()

print(args.integers)

nargs是用来说明传入的参数个数,’+’ 表示传入至少一个参数。
这时候再重新在命令行中运行python demo.py 3 5 7 9得到:

['3', '5', '7', '9']

改变数据类型

add_argument中有type参数可以设置传入参数的数据类型。我们看到代码中有type这个关键词,该关键词可以传入list, str, tuple, set, dict等。例如我们把上面的type=str,改成type=int,这时候我们就可以进行四则运算。

import argparse

parser = argparse.ArgumentParser(description='命令行中传入一个数字')
parser.add_argument('integers', type=int, nargs='+',help='传入的数字')
args = parser.parse_args()

#对传入的数据进行加总
print(sum(args.integers)

在命令行中输入python demo.py 3 5 7 9, 运行结果为:

24

位置参数

在命令行中传入参数时候,传入的参数的先后顺序不同,运行结果往往会不同,这是因为采用了位置参数,例如:

import argparse

parser = argparse.ArgumentParser(description='姓名')
parser.add_argument('param1', type=str,help='姓')
parser.add_argument('param2', type=str,help='名')
args = parser.parse_args()

#打印姓名
print(args.param1+args.param2)

在命令行中分别输入python demo.py 张 三和python demo.py 三 张,得到的运行结果分别为:

张三

三张

可选参数(非常建议使用建议)

为了在命令行中避免上述位置参数的bug(容易忘了顺序),可以使用可选参数,这个有点像关键词传参,但是需要在关键词前面加–,例如:

import argparse

parser = argparse.ArgumentParser(description='姓名')
parser.add_argument('--family', type=str,help='姓')
parser.add_argument('--name', type=str,help='名')
args = parser.parse_args()

#打印姓名
print(args.family+args.name)

在命令行中输入

python demo.py --family=--name=

运行结果:

张三

可选参数虽然写法比较繁琐,但是增加了命令行中的可读性,不容易因为参数传入顺序导致数据错乱。

默认值

add_argument中有一个default参数。有的时候需要对某个参数设置默认值,即如果命令行中没有传入该参数的值,程序使用默认值。如果命令行传入该参数,则程序使用传入的值。具体请看下面的例子:

import argparse

parser = argparse.ArgumentParser(description='姓名')
parser.add_argument('--family', type=str, default='张',help='姓')
parser.add_argument('--name', type=str, default='三', help='名')
args = parser.parse_args()

#打印姓名
print(args.family+args.name)

在命令行中分别输入 python demo.py 、 python demo.py --family=李
运行结果分别为:

张三

李三

必须参数

add_argument有一个required参数可以设置该参数是否必需。

import argparse

parser = argparse.ArgumentParser(description='姓名')
parser.add_argument('--family', type=str, help='姓')
parser.add_argument('--name', type=str, required=True, default='', help='名')
args = parser.parse_args()

#打印姓名
print(args.family+args.name)

在命令行中输入python demo.py --family=张,运行结果:

usage: demo.py [-h] [--family FAMILY] --name NAME
demo.py: error: the following arguments are required: --name

因为可选参数name的required=True,所以必须要传入。如果我们将其更改为False,程序运行结果:

引文链接:https://zhuanlan.zhihu.com/p/361710729

详细讲如何添加参数

add_argument() 可以设置的选项非常多

parser.add_argument([], action=[], nargs=[], const=[], default=[], type=[], choices=[], required=[], help=[], metavar=[], dest=[])

但最常用的是,举个例子:

parser.add_argument('--square', type=int, default=1, help='display a square of a given number')

为了代码的可读性,一般选择使用可选参数。

name

参数名是为了在使用时可以直接调用 args.name

有两种参数名的设置方式,差异体现在名称前有没有 – 或者 - (名称缩写的时候)
必写参数 (没有-):按照设置的先后顺序对应读取,调用时不用写名称。
可选参数 (有-):可以无序读取,调用时要写名称。

type

默认是 str,指定为其他可以充当类型转换器

default

当可选参数没有传入值时,使用默认值(具体实例已在上边呈现)

help

用来描述这个参数的目的,执行 -h 或者 --help 时会显示

action

制定了这个命令行参数应当如何处理

支持的操作有(只介绍主要的,其余的看文档):

store:这是默认操作,我们能够使用参数,就是因为输入值被 store 在这个参数名里。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
args = parser.parse_args()
print(args.foo)

在命令行运行 python use_argparse.py --foo 1 --foo 2

append:储存一个列表,将每个参数值添加到列表中,一般是为了允许多次使用选项,只在可选参数时使用。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', action='append')
args = parser.parse_args()
print(args.foo)

命令行运行 python use_argparse.py --foo 1 --foo 2 输出 [‘1’, ‘2’]

count:计算一个关键字参数出现的次数。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-v', action='count', default=0)
args = parser.parse_args()
print(args.v)

运行 python use_argparse.py -vvv 输出 3

运行 python use_argparse.py -v -v -v 输出 3

nargs

关联不同数目的命令行参数到单一动作,因为 action 是单一项目消耗单一命令行参数

N:可以且必须传入 N 个参数,然后被聚集到一个列表中

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('foo', nargs=2)
args = parser.parse_args()
print(args.foo)

运行 python use_argparse.py 1 输出 error

运行 python use_argparse.py 1 2 输出 [‘1’, ‘2’]

?:首先从命令行中获取,若没有则从const中获取,仍然没有则从default中获取
*、+:任意数量参数

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('foo', nargs='+')
args = parser.parse_args()
print(args.foo)

运行 python use_argparse.py 1 输出 [‘1’]

运行 python use_argparse.py 1 2 输出 [‘1’, ‘2’]

通常 Argparse 都是在命令行,如果想要在脚本文件里直接调试怎么办呢?

解析的时候把参数传进去,像这样:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('echo')
args = parser.parse_args(['hello world!'])
print(args.echo)

如果是可选参数:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--echo')
args = parser.parse_args(['--echo', 'hello world!'])
print(args.echo)

经常多传或者传错参数会报错,有没有办法不报错呢?答案是有的

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--echo')
args, unknown = parser.parse_known_args()
print(args, unknown)

运行 python use_argparse.py --echo hello world! --foo nothing

输出 Namespace(echo=‘hello’) [‘world!’, ‘–foo’, ‘nothing’]

也就是把没有提前定义的参数存到了一个列表里。

引文链接:https://zhuanlan.zhihu.com/p/345532504

name or flags - 一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。
action - 当参数在命令行中出现时使用的动作基本类型。
nargs - 是用来说明传入的参数个数,’+’ 表示传入至少一个参数。
const - 被一些 action 和 nargs 选择所需求的常数。
default - 当参数未在命令行中出现时使用的值。
type - 命令行参数应当被转换成的类型。(int,list, str, tuple, set, dict)
choices - 可用的参数的容器。
required - 此命令行选项是否可省略,默认false 。
help - 一个此选项作用的简单描述。
metavar - 在使用方法消息中使用的参数值示例。
dest - 被添加到 parse_args() 所返回对象上的属性名。

引文链接:https://zhuanlan.zhihu.com/p/361978781

你可能感兴趣的:(工具,工具使用,python)