Python参数解析工具argparse.ArgumentParser()和实例详解

argparse是一个Python模块:命令行选项、参数和子命令解析器。

通过命令行运行Python脚本时,可以通过ArgumentParser来高效地接受并解析命令行参数。

流程

新建一个ArgumentParser类对象,然后来添加若干个参数选项,最后通过parse_args()方法解析并获得命令行传来的参数。即主要有三个步骤:

  • 创建 ArgumentParser() 对象
  • 调用 add_argument() 方法添加参数
  • 使用 parse_args() 解析添加的参数
import argparser

parser = argparser.ArgumentParser()
# 此处省略添加若干个参数选项的详细步骤
# ...
parser.parse_args()

最后通过parser.<argument_name>来获取传递过来的参数。

添加参数选项

使用add_argument()来添加参数选项

# 添加位置参数
parser.add_argument("echo", help="echo the string you use here")
parser.add_argument("square", help="display ...", type=int)
# 添加可选参数
parser.add_argument("-v", "--verbosity", help="...", type=int, choices=[0, 1, 2], default=0)

对以上代码做出如下解释:

  • 在使用add_argument来添加参数选项的时候,首先要指定参数的名字argument_name这个属性,可选参数有长短两个名称;
  • 在命令行指定位置参数时直接传值,指定可选参数时,先注明长短名称,然后在后面接值;
  • help提示参数的作用,type规定了参数的取值类型,choices以列表的形式规定了值域,default规定了参数的默认值

参数选项组

使用add_mutually_exclusive_group()来添加相互对立的参数选项组

一个对立的可选参数组在指定参数时,只能任选其一或都不选

# 导入模块和新建ArgumentParser类的过程省略
group = parser.add_mutually_exclusive_group()
group.add_argument("-d", "--down")
group.add_argument("-t", "--top")
# ...

最后获取参数时,仍旧是通过parser.downparser.top.

额外的小插曲

对于可选参数还有一个action属性,常见的有store_truecount两种

# 指定-v可选参数时,-v等于True,否则为False
parser.add_argument("-v", action="store_true")
# 指定-v可选参数时,-v等于v出现的次数
parser.add_argument("-v", action="count")

 示例

1.传入一个参数

首先新建一个python文件:test_argparse.py

输入一下代码进行测试:

import argparse

parser = argparse.ArgumentParser(description='An argument inputs into command line')
# param是参数的名字,type是要传入参数的数据类型,help是该参数的提示信息
parser.add_argument('param', type=str, help='parameter')

# 获得传入的参数
args = parser.parse_args()
print(args) 

在命令行中输入 python test_argparse.py -h

查看帮助信息,得到以下结果:

 

再输入一个参数hello来运行,即python test_argparse.py hello

结果如下:

 

 2.操作arg字典

这里得到的Namespace(param='hello')是一种类似于python字典的数据结构
我们可以用args.参数名来获取参数
代码改为:

import argparse

parser = argparse.ArgumentParser(description='An argument inputs into command line')
# param是参数的名字,type是要传入参数的数据类型,help是该参数的提示信息
parser.add_argument('param', type=str, help='parameter')

# 获得传入的参数
args = parser.parse_args()
print(args.param) 

再次运行,这次的结果为:

 

 3.传入多个参数

现在运行时传入多个参数,例如 hello word 试一试,即python test_argparse.py hello world

 

 这时程序报错,提示world参数无法识别
我们把程序修改一下,在add_argument()中加入nargs参数

import argparse

parser = argparse.ArgumentParser(description='An argument inputs into command line')
# param是参数的名字,type是要传入参数的数据类型,help是该参数的提示信息
parser.add_argument('param', type=str, nargs='+', help='parameter')

# 获得传入的参数
args = parser.parse_args()
print(args.param) 

再次运行程序,程序正常运行,即输入python test_argparse.py hello world

 

 其中nargs='+'表示参数可设置一个或多个
还可以用nargs='*'来表示参数可设置零个或多个,nargs='?'来表示参数可设置零个或一个

 4.改变数据类型

add_argument()中的type参数表示传入参数的数据类型,之前我们传入的是字符串,还可以传入其他类型,比如我们将str换成int这样我们传入的就是整型数值,传入的参数可以像正常变量一样进行使用运算等
例如运行以下代码

import argparse

parser = argparse.ArgumentParser(description='An argument inputs into command line')
# param是参数的名字,type是要传入参数的数据类型,help是该参数的提示信息
parser.add_argument('param', type=int, nargs='+', help='parameter')

# 获得传入的参数
args = parser.parse_args()
print(sum(args.param)) 

命令行中输入python test_argparse.py 1 2 3

输出结果如下

 

 

 5.位置参数

命令行传入的参数是有位置差别的,即传入参数的先后顺序会使得运行结果不同
例如运行以下代码时

import argparse

parser = argparse.ArgumentParser(description='An argument inputs into command line')
# param是参数的名字,type是要传入参数的数据类型,help是该参数的提示信息
parser.add_argument('param1', type=str, help='parameter1')
parser.add_argument('param2', type=str, help='parameter2')

# 获得传入的参数
args = parser.parse_args()
print(args.param1 + ' ' + args.param2) 

命令行中输入:python test_argparse.py hello world

结果如下

 

 

 命令行中输入:python test_argparse.py world hello

结果如下

 

 

 因此可以看出这时先传入的参数被识别为param1,后传入的参数被识别为param2

而如果把以下两行代码调换顺序

parser.add_argument('param1', type=str, help='parameter1')
parser.add_argument('param2', type=str, help='parameter2')

命令行中输入:python test_argparse.py hello world

运行结果为

这时先传入的hello被识别为param2,后传入的world被识别为param1

6.可选参数

为了避免上述位置参数会产生尴尬,毕竟不可能让每个人都记住传参的顺序,我们可以使用可选参数,可选参数类似于关键词传参,但需要在关键词前加 --

例如我们运行以下程序

import argparse

parser = argparse.ArgumentParser(description='An argument inputs into command line')
# param是参数的名字,type是要传入参数的数据类型,help是该参数的提示信息
parser.add_argument('--param1', type=str, help='parameter1')
parser.add_argument('--param2', type=str, help='parameter2')

# 获得传入的参数
args = parser.parse_args()
print(args.param1 + ' ' + args.param2) 

在命令行中输入:python test_argparse.py --param1=hello --param=world

结果为:

 

 这时就算我们调换代码顺序或者传参顺序都不会改变运行结果

7.默认参数

add_argument()中的default参数可以为对某个参数设置默认值,当命令行没有传入该参数的值的时候,参数会设为默认值

例如运行以下代码

import argparse

parser = argparse.ArgumentParser(description='An argument inputs into command line')
# param是参数的名字,type是要传入参数的数据类型,help是该参数的提示信息
parser.add_argument('--param1', type=str, default='hello', help='parameter1')
parser.add_argument('--param2', type=str, default='world', help='parameter2')

# 获得传入的参数
args = parser.parse_args()
print(args.param1 + ' ' + args.param2) 

命令行中输入:python test_argparse.py

结果为

8.必需参数

add_argument中的required参数可以设置某个参数是否为必需
例如运行以下代码

import argparse

parser = argparse.ArgumentParser(description='An argument inputs into command line')
# param是参数的名字,type是要传入参数的数据类型,help是该参数的提示信息
parser.add_argument('--param1', type=str, required=True, default='', help='parameter1')
parser.add_argument('--param2', type=str, default='world', help='parameter2')

# 获得传入的参数
args = parser.parse_args()
print(args.param1 + ' ' + args.param2) 

命令行输入python test_argparse.py

结果为

 

 但是把required改为False再次运行时结果为

命令行输入python test_argparse.py --param=Sam

结果为

 

参考链接:https://zhuanlan.zhihu.com/p/56922793

参考链接:https://www.cnblogs.com/YoungF/p/12047753.html

参考链接:https://blog.csdn.net/weixin_41923539/article/details/121737565

posted @ 2022-08-16 11:08  是大高呀  阅读(7493)  评论(0编辑  收藏  举报