0%

『Python基础』argparse详解

argparse 是便于对命令行参数进行解析的 Python 内置库。

文档:https://docs.python.org/zh-cn/3/library/argparse.html

简单例子

1
2
3
4
5
6
7
8
9
import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers (default: find the max)')

args = parser.parse_args(["2", "3", "4", "--sum"])
print(args.accumulate(args.integers))
# 9

ArgumentParser

使用 argparse 的第一步是创建一个 ArgumentParser 对象,该对象可以看作是一个命令行的解析器。

ArgumentParser 对象包含将命令行解析成 Python 数据类型所需的全部信息。具体参数表如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class argparse.ArgumentParser(
prog=None, # 程序名称 (default: os.path.basename(sys.argv[0]))
usage=None, # 描述程序用途的字符串(默认值:从添加到解析器的参数生成)
description=None, # 在参数帮助文档之前显示的文本(默认值:无)
epilog=None, # 在参数帮助文档之后显示的文本(默认值:无)
parents=[], # 一个 ArgumentParser 对象的列表,它们的参数也应包含在内
formatter_class=argparse.HelpFormatter, # 用于自定义帮助文档输出格式的类
prefix_chars='-', # 可选参数的前缀字符集合(默认值: '-')
fromfile_prefix_chars=None, # 当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合(默认值: None)
argument_default=None, # 参数的全局默认值(默认值: None)
conflict_handler='error', # 解决冲突选项的策略(通常是不必要的),即是否可以重写,通常配合 parents 使用
add_help=True, # 为解析器添加一个 -h/--help 选项(默认值: True)
allow_abbrev=True, # 如果缩写是无歧义的,则允许缩写长选项 (默认值:True) py3.5 以上
exit_on_error=True # 决定当错误发生时是否让 ArgumentParser 附带错误信息退出。 (默认值: True) py3.9 以上
)

ArgumentParser.add_argument()

定义单个的命令行参数应当如何解析,每个形参都在下面有它自己更多的描述

1
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
  • name or flags: 一个命名或者一个选项字符串的列表,例如 foo-f, --foo
  • action: 当参数在命令行中出现时使用的动作基本类型。
  • nargs: 命令行参数应当消耗的数目。("N", "?", "*", "+",分别表示 N 个,一个,0个或多个,1个或多个,类似正则匹配里面的)
  • const: 被一些 action 和 nargs 选择所需求的常数。
  • default: 当参数未在命令行中出现并且也不存在于命名空间对象时所产生的值。
  • type: 命令行参数应当被转换成的类型。
  • choices: 可用的参数的容器。
  • required: 此命令行选项是否可省略 (仅选项可用)。
  • help: 一个此选项作用的简单描述。
  • metavar: 在使用方法消息中使用的参数值示例(显示名称)。
  • dest: 被添加到 parse_args() 所返回对象上的属性名(属性名)。

参数名

可以创建位置参数和选项参数,区别是有没有前缀,即 ArgumentParser 中的 prefix_chars.

action

  • 'store' - 存储参数的值。这是默认的动作。
  • 'store_const' - 存储被 const 命名参数指定的值。 'store_const' 动作通常用在选项中来指定一些标志。
  • 'store_true' and 'store_false' - 这些是 'store_const' 分别用作存储 TrueFalse 值的特殊用例。另外,它们的默认值分别为 FalseTrue(注意,这里默认值是反的,意思是 store_true 只有参数出现才是 true,否则默认是 false)。
  • 'append' - 存储一个列表,并且将每个参数值追加到列表中。在允许多次使用选项时很有用。
  • 'append_const' - 这存储一个列表,并将 const 命名参数指定的值追加到列表中。(注意 const 命名参数默认为 None。)'append_const' 动作一般在多个参数需要在同一列表中存储常数时会有用。
  • 'count' - 计算一个关键字参数出现的数目或次数。对于一个增长的详情等级来说有用。请注意,default 将为 None,除非显式地设为 0
  • 'help' - 打印所有当前解析器中的选项和参数的完整帮助信息,然后退出。默认情况下,一个 help 动作会被自动加入解析器。'version' - 期望有一个 version= 命名参数在 add_argument() 调用中,并打印版本信息并在调用后退出,例如 parser.add_argument('--version', action='version', version='%(prog)s 2.0') .
  • 'extend' - 这会存储一个列表,并将每个参数值加入到列表中。
  • 3.9 支持自定义,详细见 说明 吧。

type

默认情况下,解析器会将命令行参数当作简单字符串读入, type 关键字允许执行任何必要的类型检查和类型转换。

如果 type 关键字使用了 default 关键字,则类型转换器仅会在默认值为字符串时被应用。

不建议将 bool() 函数用作类型转换器。 它所做的只是将空字符串转为 False 而将非空字符串转为 True。 这通常不是用户所想要的。

choices

某些命令行参数应当从一组受限值中选择。 当执行命令行解析时,参数值将被检查,如果参数不是可接受的值之一就将显示错误消息。

请注意 choices 容器包含的内容会在执行任意 type 转换之后被检查,因此 choices 容器中对象的类型应当与指定的 type 相匹配

required

requiredTrue 要求选项为必须的,若命令行中没有出现,会报错

ArgumentParser.parse_args()

将参数字符串转换为对象并将其设为命名空间的属性。 返回带有成员的命名空间。

1
ArgumentParser.parse_args(args=None, namespace=None)
  • args - 要解析的字符串列表。 默认值是从 sys.argv 获取。
  • namespace - 用于获取属性的对象。 默认值是一个新的空 Namespace 对象。

参数组

使用方法 add_argument_group 添加参数组

1
ArgumentParser.add_argument_group(title=None, description=None)

默认有 位置参数可选参数 两组

互斥

使用方法 add_mutually_exclusive_group 添加参数组

1
ArgumentParser.add_mutually_exclusive_group(required=False)

创建一个互斥组。 argparse 将会确保互斥组中只有一个参数在命令行中可用,required 为 True 要求至少有存在一个参数

部分解析

1
ArgumentParser.parse_known_args(args=None, namespace=None)

有时一个脚本可能只解析部分命令行参数,而将其余的参数继续传递给另一个脚本或程序。 在这种情况下,parse_known_args() 方法会很有用处。 它的作用方式很类似 parse_args() 但区别在于当存在额外参数时它不会产生错误。 而是会返回一个由两个条目构成的元组,其中包含带成员的命名空间和剩余参数字符串的列表。

可以这样使用

1
args, unparsed = parser.parse_known_args()
--- ♥ end ♥ ---

欢迎关注我呀~