很多时候,我们的程序要带参数来运行不同的功能,需要解析命令行参数。argparse模块能够很好的提供支持。
argparse是 python 自带的命令行参数解析包,用于解析命令行参数的标准模块。可以让人轻松编写用户友好的命令行接口,还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
argparse模块的使用可以简化成下面四个步骤:
1)import argparse 导入模块
2)parser = argparse.ArgumentParser() 创建一个解析对象(命令行解析器)
ArgumentParser对象的相关属性,全部参数:
3)parser.add_argument() 向该对象中添加要关注的命令行参数和选项,每一个add_argument方法对应一个要关注的参数或选项;
add_argument相关属性,全部参数:
属性 | 解释 |
---|---|
name or flags | 一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。 |
action | 当参数在命令行中出现时使用的动作基本类型。 |
nargs | 命令行参数应当消耗的数目。 |
const | 被一些 action 和 nargs 选择所需求的常数。 |
default | 当参数未在命令行中出现并且也不存在于命名空间对象时所产生的值。 |
type | 命令行参数应当被转换成的类型。 |
choices | 可用的参数的容器。 |
required | 此命令行选项是否可省略 (仅选项可用)。 |
help | 一个此选项作用的简单描述。 |
metavar | 在使用方法消息中使用的参数值示例。 |
dest | 被添加到 parse_args() 所返回对象上的属性名。 |
4)parser.parse_args() 调用parse_args()方法进行解析
parse_args相关属性,全部参数:
属性 | 解释 | 默认值 |
---|---|---|
args | 要解析的字符串列表 | 从 sys.argv 获取。 |
namespace | 用于获取属性的对象 | 一个新的空 Namespace 对象。 |
add_argument() 方法必须知道它是否是一个选项,例如 -f 或 --foo,或是一个位置参数。
第一个传递给 add_argument() 的参数必须是一系列旗标或者是一个简单的参数名。
当 parse_args() 被调用,选项会以 - 前缀识别,剩下的参数则会被假定为位置参数。
-(横杠)和 –(双横杠)都是用来表示命令行参数的前缀符号:
-用来表示短参数(Short options),通常只有一个字符。
–用来表示长参数(Long options),通常是一个单词或短语。
在argparse中,-和–可以用来定义命令行参数的简写和全名,例如:parser.add_argument(‘-n’, ‘–name’, help=‘输入姓名’)
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-n', '--name', help='输入姓名')
args = parser.parse_args()
# 获得传入的参数
print(args)
add_argument方法的required参数可以设置该参数是否是必需。
如果该参数设置为必需参数,程序执行时未指定该参数会报错!
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--name', help='输入姓名', required=True)
parser.parse_args()
# 获得传入的参数
print(args)
# 获得指定的参数
print(args.name)
运行 python test.py 和 python test.py --name Elaine
结果:
add_argument添加一个参数选项
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--name', help='输入姓名')
args = parser.parse_args()
# 获得传入的参数
print(args)
# 获得指定的参数
print(args.name)
运行程序 -h 看一下效果
D:\>python test.py -h
usage: test.py [-h] [--name NAME]
optional arguments:
-h, --help show this help message and exit
--name NAME 输入姓名
带一个参数和带三个参数运行的结果:
可以看到,这种情形下传入三个参数会报错!
1)add_argument加上nargs参数,nargs是用来说明传入的参数个数,例如:
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--name', nargs=3, help='输入姓名')
args = parser.parse_args()
# 获得传入的参数
print(args)
# 获得指定的参数
print(args.name)
运行 python test.py --name Elaine 和 python test.py --name Elaine Elaine1 Elaine2
结果:
2)nargs为’+’ 表示传入至少一个参数,可以不用指定具体多少个参数,例如:
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--name', nargs='+', help='输入姓名')
args = parser.parse_args()
# 获得传入的参数
print(args)
# 获得指定的参数
print(args.name)
运行 python test.py --name Elaine 和 python test.py --name Elaine Elaine1 Elaine2
结果:
add_argument() 方法必须知道它是否是一个选项,例如 -f 或 --foo,或是一个位置参数。
第一个传递给 add_argument() 的参数必须是一系列旗标或者是一个简单的参数名。
当 parse_args() 被调用,选项会以 - 前缀识别,剩下的参数则会被假定为位置参数。
1)位置参数
add_argument第一个参数可以这么创建:parser.add_argument(‘name’, help=‘输入姓名’)
其中第一个参数可以是任何参数名,但前面不要加 - (横杠)或 –(双横杠)
这些参数是不带前缀的参数,它们通常用于需要按特定顺序提供的参数,且通常是必需的。
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='命令行中传入一个参数')
parser.add_argument('name', help='输入姓名')
parser.add_argument('country', help='国家')
args = parser.parse_args()
# 获得传入的参数
print(args)
执行 python test.py Elaine China 和 python test.py China Elaine
结果:
所以位置参数都是顺序的,在命令行中传入参数时候,传入的参数的先后顺序不同,运行结果往往会不同!
执行 python test.py Elaine 时缺少第二个位置参数会报错,所以位置参数通常是必须的。例如:
2)可选参数
为了在命令行中避免上述位置参数的顺序混乱,可以使用可选参数。这个很像关键词传参,但是需要在关键词前面加-
例如:
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--name', nargs='+', help='输入姓名')
parser.add_argument('--country', nargs='+', help='国家名称')
args = parser.parse_args()
# 获得传入的参数
print(args)
执行 python test.py --name Elaine Elaine1 Elaine2 和 python test.py --name Elaine Elaine1 Elaine2 --country China
结果:
可选参数虽然写法比较繁琐,但是增加了命令行中的可读性,不容易因为参数传入顺序导致数据错乱。
add_argument加上default参数
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-n', '--name', help='输入姓名')
parser.add_argument('-c', '--country', default='China', help='国家名称')
args = parser.parse_args()
# 获得传入的参数
print(args)
运行python test.py --name Elaine 和 python test.py
结果:
想要了解更多,可以去看看官方文档
参考官方文档:https://docs.python.org/zh-cn/3.9/library/argparse.html#parents