argparse
— 命令行选项、参数和子命令解析器
argparse
介绍
官方文档:https://docs.python.org/zh-cn/3/library/argparse.html
argparse
模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数,然后
argparse
将弄清如何从
sys.argv
解析出那些参数。
argparse
模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
这个库在我们写一些安全工具的时候,比较好用并且这是一个内置库,可以简化我们的代码,和传入参数的调用,生成我们需要的使用说明。
我这里就介绍一下简单的使用,要想要深入的了解可以参考官方文档。
如何简单的使用
这个库的使用分为三步:
- 创建一个解析器
- 添加参数
- 解析参数
简单示例:
import argparse
def sum(a, b):
return a + b
if __name__ == '__main__':
# 创建一个解析器
parse = argparse.ArgumentParser()
# 添加参数
parse.add_argument("-num1", type=int, help="数字1")
parse.add_argument("-num2", type=int, help="数字2")
# 解析参数
args = parse.parse_args()
# args.num1 获取 -num1的值
print(sum(args.num1, args.num2)) # 30
# 使用命令调用 python nmae.py -num1 10 -num2 20
这样我们就完成了 argparse 的简单使用,想要写一个让人心情愉悦的安全工具这样肯定是不行的,我们还需要了解更多的参数来自定义我们的命令解析器。
ArgumentParser 对象
创建一个新的
ArgumentParser
对象。所有的参数都应当作为关键字参数传入。每个参数在下面都有它更详细的描述,但简而言之,它们是:
参数 | 说明 |
---|---|
prog |
程序的名称 (默认值:
) |
usage | 描述程序用途的字符串(默认值:从添加到解析器的参数生成) |
description | 在参数帮助文档之前显示的文本(默认值:无),可以用来说明程序的作用 |
epilog | 在参数帮助文档之后显示的文本(默认值:无),同上 |
parents |
一个
对象的列表,它们的参数也应包含在内 |
formatter_class | 用于自定义帮助文档输出格式的类 |
prefix_chars | 可选参数的前缀字符集合(默认值: ‘-’) |
fromfile_prefix_chars |
当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合(默认值:
) |
argument_default |
参数的全局默认值(默认值:
) |
conflict_handler | 解决冲突选项的策略(通常是不必要的) |
add_help |
为解析器添加一个
选项(默认值:
) |
allow_abbrev |
如果缩写是无歧义的,则允许缩写长选项 (默认值:
) |
exit_on_error |
决定当错误发生时是否让
附带错误信息退出。 (默认值:
) |
在 3.5 版更改:
增加了
allow_abbrev
参数。
在 3.8 版更改:
在之前的版本中,
allow_abbrev
还会禁用短旗标分组,例如
-vv
表示为
-v -v
。
在 3.9 版更改:
添加了
exit_on_error
形参。
上面的参数我们不用全部记住,只需要记住几个常用的参数就行了,我们来优化一下我们示例的代码:
我们使用
description
参数添加一个程序说明:
import argparse
parse = argparse.ArgumentParser(description="用来进行加减乘除的运算")
add_argument() 方法
定义单个的命令行参数应当如何解析。每个形参都在下面有它自己更多的描述,长话短说有:
参数 | 说明 |
---|---|
name or flags |
一个命名或者一个选项字符串的列表,例如
或
|
action | 当参数在命令行中出现时使用的动作基本类型 |
nargs | 命令行参数应当消耗的数目 |
const |
被一些
和
选择所需求的常数 |
default | 当参数未在命令行中出现并且也不存在于命名空间对象时所产生的默认值 |
type | 命令行参数应当被转换成的类型 |
choices | 可用的参数的容器 |
required | 此命令行选项是否可省略 (仅选项可用) |
help | 一个此选项作用的简单描述 |
metavar | 在使用方法消息中使用的参数值示例 |
dest |
被添加到
所返回对象上的属性名 |
同样的我们不需要全部都记住,我们只需要记住几个常用的参数即可,其中值得注意的是以下两个参数的使用:
-
action:
action
命名参数指定了这个命令行参数应当如何处理,以下介绍几个常用的参数。
store_true
and
store_false
:用来表示
bool
值,值得注意的是它们的默认值分别为
False
和
True
。
append
:存储一个列表,并且将每个参数值追加到列表中
extend
:这会存储一个列表,并将每个参数值加入到列表中,值得注意的是 一定要配合
nargs="+"
使用。
-
nargs:
nargs
命名参数关联不同数目的命令行参数到单一动作。
*nargs='?'
:的一个更普遍用法是允许可选的输入或输出文件:
'*'
:所有当前命令行参数被聚集到一个列表中。
'+'
:和
'*'
类似,所有当前命令行参数被聚集到一个列表中。
我们使用
add_argument()
方法添加两个命令行参数丰富我们之前的代码:
import argparse
parse = argparse.ArgumentParser(description="用来进行加减乘除的运算")
parse.add_argument(name="-sum", action="extend", nargs="+", help="输入两个数字进行加法运算")
parse.add_argument(name="-sub", action="extend", nargs="+", help="输入两个数字进行减法运算")
parse_args() 方法
将参数字符串转换为对象并将其设为命名空间的属性。 返回带有成员的命名空间。
对于这个方法,没有什么补充的,使用方法也很简单,如下:
import argparse
parse = argparse.ArgumentParser(description="用来进行加减乘除的运算")
parse.add_argument(name="-sum", action="extend", nargs="+", help="输入两个数字进行加法运算")
parse.add_argument(name="-sub", action="extend", nargs="+", help="输入两个数字进行减法运算")
#
args = parser.parse_args()
如何获取我们输入的值
import argparse
parse = argparse.ArgumentParser(description="用来进行加减乘除的运算")
parse.add_argument(name="-sum", action="extend", nargs="+", help="输入两个数字进行加法运算")
parse.add_argument(name="-sub", action="extend", nargs="+", help="输入两个数字进行减法运算")
args = parser.parse_args()
# 直接使用 aegs.参数名就可以调用输入的值
a = args.sum
# 如果存在输入多个值,可以使用 aegs.参数名[1] 的方式获得我们需要的值
b = args.sum[0]
c = args.sum[1]
代码示例
现在我们来完成我们上面的一个简单代码,实现两位数的加减乘除:
import argparse
# 加法
def sum(a, b):
return a + b
# 减法
def sub(a, b):
return a - b
# 乘法
def chenfa(a, b):
return a * b
# 除法
def chufa(a, b):
return a / b
if __name__ == '__main__':
# 创建一个解析器
parse = argparse.ArgumentParser(description="一个简单的加减乘除的运算程序!")
# 添加参数
parse.add_argument("-sum", type=int, action="extend", nargs="+", help="输入要进行加法的数字", )
parse.add_argument("-sub", type=int, action="extend", nargs="+", help="输入要进行减法的数字")
parse.add_argument("-chenfa", type=int, action="extend", nargs="+", help="输入要进行乘法的数字")
parse.add_argument("-chufa", type=int, action="extend", nargs="+", help="输入要进行除法的数字")
# 解析参数
args = parse.parse_args()
# 判断使用了哪些算法
if args.sum != None:
print(f"{args.sum[0]} + {args.sum[1]} = {sum(args.sum[0], args.sum[1])}")
elif args.sub != None:
print(f"{args.sub[0]} - {args.sub[1]} = {sum(args.sub[0], args.sub[1])}")
elif args.chenfa != None:
print(f"{args.chenfa[0]} * {args.chenfa[1]} = {sum(args.chenfa[0], args.chenfa[1])}")
elif args.chufa != None:
print(f"{args.chufa[0]} / {args.chufa[1]} = {sum(args.chufa[0], args.chufa[1])}")
else:
print("请输入正确的参数和参数值进行运算!")
其中值得注意的是如果没有在命令行中调用参数,如
args.sum
的返回结果是
None
。
这个库还有很多的内容是我没有讲到的,我只是讲了一下简单的运用。如果有需要或者兴趣可以去官方文档中查看相应的应用。